我有一个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会失败。
答案 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
现在是语法错误。