ifdef& make 3.81:条件语法无效

时间:2014-04-10 14:30:54

标签: makefile conditional-compilation

我有一个makefile,用于使用make 3.80。 现在我更新到3.81,我得到以下错误:

Makefile:185: *** invalid syntax in conditional.  Stop.

第185行对应于:

ifdef $(FDEP_FILES)

上面几行我定义了FDEP_FILES

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

TEST_BASENAMES_FC      += $(basename  $(shell ls *.fc  2> /dev/null ))

当文件夹中只有一个.fc文件时,makefile可以正常工作,而在多个makefile的情况下,makefile会失败。

2 个答案:

答案 0 :(得分:3)

如果你想要的是确定是否定义了FDEP_FILES那么测试应该是:

ifdef FDEP_FILES

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

但请注意ifdef会将带有空字符串的变量视为已定义的值。根据您向我们展示的代码,我不相信在某些情况下您不会以空字符串结束。您应该考虑使用ifneq ($(strip $(FDEP_FILES)),)进行测试。通过此测试,仅当FDEP_FILES具有非空字符串作为值时才会执行分支。

答案 1 :(得分:1)

我不知道你认为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

现在是语法错误。