Makefile ifdef&;make 3.81:条件语句中的语法无效

Makefile ifdef&;make 3.81:条件语句中的语法无效,makefile,conditional-compilation,Makefile,Conditional Compilation,我有一个用于Make3.80的makefile。 现在我更新到3.81,得到以下错误: Makefile:185: *** invalid syntax in conditional. Stop. 第185行对应于: ifdef $(FDEP_FILES) 上面几行我定义了FDEP_文件 FDEP_FILES += $(addsuffix .df, $(TEST_BASENAMES_FC)) 及 当文件夹中只有一个.fc文件时,makefile会工作,而当有多个makefile时,m

我有一个用于Make3.80的makefile。 现在我更新到3.81,得到以下错误:

Makefile:185: *** invalid syntax in conditional.  Stop.
第185行对应于:

ifdef $(FDEP_FILES)
上面几行我定义了FDEP_文件

FDEP_FILES   += $(addsuffix .df, $(TEST_BASENAMES_FC))


当文件夹中只有一个.fc文件时,makefile会工作,而当有多个makefile时,makefile会失败。

如果您想确定是否定义了
FDEP_文件,则测试应为:

ifdef FDEP_FILES
当您有多个文件时失败的原因是
$(FDEP_FILES)
将扩展到其值,然后
ifdef
将测试是否定义了使用此值命名的变量。由于该值不是有效的变量名,因此会出现错误


<>但请注意,代码> IFDEF将考虑一个空字符串作为变量定义的变量。根据您向我们展示的代码,我不相信您在某些情况下不会得到空字符串。您应该考虑用<代码> IFNEQ($(条$(fdEdPipe)))< /COD>进行测试。通过此测试,仅当
FDEP_文件
的值为非空字符串时,才会执行分支。

如果要确定是否定义了
FDEP_文件
,则测试应为:

ifdef FDEP_FILES
当您有多个文件时失败的原因是
$(FDEP_FILES)
将扩展到其值,然后
ifdef
将测试是否定义了使用此值命名的变量。由于该值不是有效的变量名,因此会出现错误


<>但请注意,代码> IFDEF将考虑一个空字符串作为变量定义的变量。根据您向我们展示的代码,我不相信您在某些情况下不会得到空字符串。您应该考虑用<代码> IFNEQ($(条$(fdEdPipe)))< /COD>进行测试。通过此测试,仅当
FDEP_FILES
的值为非空字符串时,才会执行分支。

我不知道您认为旧版本的make在做什么,但它没有这样做

ifdef
构造将变量名作为参数。您正在传递一个变量值。如果您有:

FOO = bar

ifdef $(FOO)
然后,您实际上正在测试make变量
bar
是否已定义。如果您想知道是否定义了make变量
FOO
,您不想展开它:

ifdef FOO
在您的情况下,有一个变量的值包含多个用空格分隔的单词:

FOO = bar baz
在这种情况下,在make
ifdef$(FOO)
的早期版本中不会抛出错误,因为make用于在变量名中允许空格,因此make将检查变量
bar baz
是否已定义——这不是您想要的,但不是语法错误

在较新版本的GNU make中,变量名不能包含空格,因此:

ifdef bar baz

现在是语法错误。

我不知道您认为旧版本的make在做什么,但它没有这样做

ifdef
构造将变量名作为参数。您正在传递一个变量值。如果您有:

FOO = bar

ifdef $(FOO)
然后,您实际上正在测试make变量
bar
是否已定义。如果您想知道是否定义了make变量
FOO
,您不想展开它:

ifdef FOO
在您的情况下,有一个变量的值包含多个用空格分隔的单词:

FOO = bar baz
在这种情况下,在make
ifdef$(FOO)
的早期版本中不会抛出错误,因为make用于在变量名中允许空格,因此make将检查变量
bar baz
是否已定义——这不是您想要的,但不是语法错误

在较新版本的GNU make中,变量名不能包含空格,因此:

ifdef bar baz
现在是一个语法错误