没有目标的Makefile规则
我正在调试一个makefile,在宏扩展中它创建了一个没有目标的规则(因此:) 我在网上查过了,makefile文档似乎暗示(但没有明确说明)至少应该有一个目标没有目标的Makefile规则,makefile,gnu-make,Makefile,Gnu Make,我正在调试一个makefile,在宏扩展中它创建了一个没有目标的规则(因此:) 我在网上查过了,makefile文档似乎暗示(但没有明确说明)至少应该有一个目标 对于我当前版本的make(gnu make 4.2.1),它并没有杀死我,但我只是想知道这是否被认为是未定义的行为,或者这是否受支持,如果是,它应该做什么。规则确实期望一个或多个目标,在文档中确实没有两种方法。例如,GNU生成符号: targets : prerequisites recipe 或章节主页: targe
对于我当前版本的make(gnu make 4.2.1),它并没有杀死我,但我只是想知道这是否被认为是未定义的行为,或者这是否受支持,如果是,它应该做什么。规则确实期望一个或多个目标,在文档中确实没有两种方法。例如,GNU生成符号:
targets : prerequisites
recipe
或章节主页:
target [target...]: [prerequisite...][;command]
Illumos:
target [:|::] [dependency] ... [; command] ...
[command]
...
毕竟,你会如何称呼一个没有名字的目标?我认为没有目标规则是错误的
然而,我尝试了不同风格的make(BSD、Illumos、GNU),并采取了不同程度的宽容(例如GNU make似乎也不再关心先决条件的语法)或缺少先决条件,它们似乎都已经处理了行,并且可能已经按照规则遵循了制表符缩进块(带有配方)。。。然后被忽略(也是为了确定默认目标)
我猜这个理由实际上是考虑了有效的代码>代码文件<代码>…在这种情况下,您也可能会:
$(VAR):
@echo foobar
other:
@echo barbaz
如果
VAR
未定义或为空,那么您最终也会得到这样一个空目标。规则预期会有一个或多个目标,在文档中确实没有两种方法。例如,GNU生成符号:
targets : prerequisites
recipe
或章节主页:
target [target...]: [prerequisite...][;command]
Illumos:
target [:|::] [dependency] ... [; command] ...
[command]
...
毕竟,你会如何称呼一个没有名字的目标?我认为没有目标规则是错误的
然而,我尝试了不同风格的make(BSD、Illumos、GNU),并采取了不同程度的宽容(例如GNU make似乎也不再关心先决条件的语法)或缺少先决条件,它们似乎都已经处理了行,并且可能已经按照规则遵循了制表符缩进块(带有配方)。。。然后被忽略(也是为了确定默认目标)
我猜这个理由实际上是考虑了有效的代码>代码文件<代码>…在这种情况下,您也可能会:
$(VAR):
@echo foobar
other:
@echo barbaz
如果VAR
未定义或为空,那么最终也会得到这样一个空目标
我在网上查过了,makefile文档似乎暗示(但没有明确说明)至少应该有一个目标
不同的make
s可能表现不同。根据makefile的内容,它们甚至可能表现出对特定makefile语法问题的不同处理——例如,如果makefile以.POSIX:
特殊目标的规则开头,则其解释可能与没有该规则的相同makefile不同
然而,总的来说,如果你想知道什么应该被认为是正确的,那么这是一个相当好的基线。它说:
目标规则的格式如下:
target [target...]: [prerequisite...][;command]
[<tab>command<tab>command...]
line that does not begin with <tab>
target[目标…]:[先决条件…][;命令]
[命令命令…]
不以开头的行
目标条目由一个分隔的非空列表指定
目标,然后是a,[…]
(重点补充)。它还进一步说
应用程序应从字符集中选择目标名称
仅由句点、下划线、数字和字母组成
从可移植字符集
,从中我们可以推断语法描述是关于宏扩展后的规则文本,因为宏引用可以出现在规则的目标列表中(或者根据规范,可以出现在makefile中的任何位置),但是字符$
,(
,)
,{
和}
出现在宏引用中的不属于可以出现在目标中的宏引用
makefiles的预期内容规范确实明确指出目标列表是非空的,在特定的make
文档没有覆盖它的情况下,将其视为权威是合理的
我只是想知道[空目标列表]是否被视为未定义的行为或行为
这是否得到支持
makefile和runtime宏值的组合不符合POSIXmake
的要求。SPEC不定义在这种情况下应该发生什么,因此在这种意义上,行为是未定义的,但是“未定义行为”在这个领域不如在C和C++语言规范中那样强大。
有鉴于此,我认为任何规则的目标列表为空(在宏扩展之后)都是makefile缺陷。尽管您当前使用的make
可能会毫无怨言地接受它,但其他make
s,包括您当前make
的未来版本,可能会拒绝或更糟
我在网上查过了,makefile文档似乎暗示(但没有明确说明)至少应该有一个目标
不同的make
s可能表现不同。根据makefile的内容,它们甚至可能表现出对特定makefile语法问题的不同处理——例如,如果makefile以.POSIX:
特殊目标的规则开头,则其解释可能与没有该规则的相同makefile不同
然而,总的来说,如果你想知道什么应该被认为是正确的,那么这是一个相当好的基线。它说:
目标规则的格式如下:
target [target...]: [prerequisite...][;command]
[<tab>command<tab>command...]
line that does not begin with <tab>
target[目标…]:[先决条件…][;命令]
[命令命令…]
不以开头的行
目标条目由一个分隔的非空列表指定
目标,然后是a,[…]
(重点补充)。它还进一步说
应用程序应选择