【问题标题】:ifdef & make 3.81: invalid syntax in conditionalifdef & make 3.81:条件语法无效
【发布时间】:2023-04-09 14:46:01
【问题描述】:

我有一个用于 make 3.80 的 makefile。 现在我更新到 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 ))

makefile 在文件夹中只有一个.fc 文件时有效,而在多个makefile 的情况下则失败。

【问题讨论】:

    标签: makefile conditional-compilation


    【解决方案1】:

    如果您要确定是否定义了FDEP_FILES,那么测试应该是:

    ifdef FDEP_FILES
    

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

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

    【讨论】:

      【解决方案2】:

      我不知道你认为旧版本的 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
      

      现在是语法错误。

      【讨论】:

        猜你喜欢
        • 2022-08-23
        • 2015-11-01
        • 1970-01-01
        • 2023-03-24
        • 2016-10-23
        • 2021-10-04
        • 1970-01-01
        • 2013-07-22
        • 2018-11-09
        相关资源
        最近更新 更多