Makefile ifdef&;make 3.81:条件语句中的语法无效
我有一个用于Make3.80的makefile。 现在我更新到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
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
在这种情况下,在makeifdef$(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
在这种情况下,在makeifdef$(FOO)
的早期版本中不会抛出错误,因为make用于在变量名中允许空格,因此make将检查变量bar baz
是否已定义——这不是您想要的,但不是语法错误
在较新版本的GNU make中,变量名不能包含空格,因此:
ifdef bar baz
现在是一个语法错误