没有目标的Makefile规则

没有目标的Makefile规则,makefile,gnu-make,Makefile,Gnu Make,我正在调试一个makefile,在宏扩展中它创建了一个没有目标的规则(因此:) 我在网上查过了,makefile文档似乎暗示(但没有明确说明)至少应该有一个目标 对于我当前版本的make(gnu make 4.2.1),它并没有杀死我,但我只是想知道这是否被认为是未定义的行为,或者这是否受支持,如果是,它应该做什么。规则确实期望一个或多个目标,在文档中确实没有两种方法。例如,GNU生成符号: targets : prerequisites recipe 或章节主页: targe

我正在调试一个makefile,在宏扩展中它创建了一个没有目标的规则(因此:)

我在网上查过了,makefile文档似乎暗示(但没有明确说明)至少应该有一个目标


对于我当前版本的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宏值的组合不符合POSIX
make
的要求。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,[…]

(重点补充)。它还进一步说

应用程序应选择