GNU Makefile宏规则

GNU Makefile宏规则,makefile,whitespace,gnu,space,Makefile,Whitespace,Gnu,Space,在GNU文件中,宏定义前是否有前导空格?什么类型的空白是允许的标签,换行符,空格 谢谢 经过大量搜索后: 来自GNU make: 变量名可以是不包含“:”、“,”=”或前导或尾随空格的任何字符序列。经过大量搜索后: 来自GNU make: 变量名称可以是不包含“:”、“,”=”或前导或尾随空格的任何字符序列。宏名称前可以有任意数量的空格;它被忽略了 在大多数情况下,空白可以由空格和制表符组成 有一个例外:如果您在规则上下文中,则行的第一个字符不能是制表符(如果是),则该行被视为规则配方的一部分,

在GNU文件中,宏定义前是否有前导空格?什么类型的空白是允许的标签,换行符,空格


谢谢

经过大量搜索后:

来自GNU make:


变量名可以是不包含“:”、“,”=”或前导或尾随空格的任何字符序列。

经过大量搜索后:

来自GNU make:


变量名称可以是不包含“:”、“,”=”或前导或尾随空格的任何字符序列。

宏名称前可以有任意数量的空格;它被忽略了

在大多数情况下,空白可以由空格和制表符组成

有一个例外:如果您在规则上下文中,则行的第一个字符不能是制表符(如果是),则该行被视为规则配方的一部分,而不是make宏赋值

规则上下文的定义令大多数人感到惊讶:请注意,注释、空行,甚至未使用的ifdef部分都不会结束规则上下文:以制表符开头的行仍然被视为前一个规则的一部分。只有新宏分配或新规则的出现才会结束上一个规则

例如:

foo: bar
        @cp $< $@

# now we have some comments

ifeq (true,false)
BAR := and an assignment that is not parsed
endif

# and some more comments

             FOO = and a macro starting with TAB + space
假设此处的缩进以制表符而非空格开始,则最后一次分配的FOO在规则上下文中,将被视为FOO配方的一部分,而不是新的宏分配


总之,最好不要在makefile中使用制表符,除非它引入了配方行。

宏的名称前可以有任意数量的空白;它被忽略了

在大多数情况下,空白可以由空格和制表符组成

有一个例外:如果您在规则上下文中,则行的第一个字符不能是制表符(如果是),则该行被视为规则配方的一部分,而不是make宏赋值

规则上下文的定义令大多数人感到惊讶:请注意,注释、空行,甚至未使用的ifdef部分都不会结束规则上下文:以制表符开头的行仍然被视为前一个规则的一部分。只有新宏分配或新规则的出现才会结束上一个规则

例如:

foo: bar
        @cp $< $@

# now we have some comments

ifeq (true,false)
BAR := and an assignment that is not parsed
endif

# and some more comments

             FOO = and a macro starting with TAB + space
假设此处的缩进以制表符而非空格开始,则最后一次分配的FOO在规则上下文中,将被视为FOO配方的一部分,而不是新的宏分配


总之,最好不要在makefile中使用制表符,除非它引入了一个配方行。

实际上,变量名可以包含任何字符,只要赋值中没有未加修饰的空格,即name:=带空格的文本,那么${name}:=文本可以工作,而${text带空格}将适当展开。实际上,变量名可以包含任何字符,只要赋值中没有未加修饰的空格,即name:=带空格的文本,则${name}:=文本将起作用,${text with spaces}将适当展开。