【问题标题】:Checking if variables are defined in a makefile检查变量是否在makefile中定义
【发布时间】:2013-05-19 07:37:36
【问题描述】:

我有一个 GNU Makefile(3.81 版),如下所示:

.PHONY: SPOneDot

SPOneDot:
    ifndef X
    X=0.05
    $$(info X undefined, changed to $X)
    endif
    ifndef Y
    Y=0.05
    $$(info Y undefined, changed to $Y)
    endif
    python ./Submit3DSP.py -f OneDot.qdt -x $(X) -y $(Y)

我使用以下命令行执行:make X=0.1 Y=0.1 SPOneDot,但得到以下结果:

ifndef X
make: ifndef: Command not found
make: *** [SPOneDot] Error 127

我查看了makefile documentationothers use it。任何帮助表示赞赏,这可能是愚蠢的。

【问题讨论】:

  • 这是什么牌子的? GNU 制造? BSD? POSIX?
  • 这里使用的是 GNU Make 3.81 版。

标签: makefile conditional environment-variables gnu-make


【解决方案1】:

很可能您的 make 指令不得缩进制表符,而是从第一列开始。 我还怀疑你想要.if(...) 或类似的,而不是普通的ifdef。如果不知道您使用的是什么 make 实现,就很难判断。

在 GNU make 中,使用条件部分,例如像这样

ifeq ($(CC),gcc)
        $(CC) -o foo $(objects) $(libs_for_gcc)
else
        $(CC) -o foo $(objects) $(normal_libs)
endif

GNU make manual 包含所有详细信息。

如果您真的想测试 环境 变量(而不是 ma​​ke 变量),那么只需在命令中执行:

SPOneDot:
    if test -z "$$X"; then X=0.05; echo "X undefined, changed to $$X"; fi; \
    if test -z "$$Y"; then Y=0.05; echo "Y undefined, changed to $$Y"; fi; \
    python ./Submit3DSP.py -f OneDot.qdt -x $$X -y $$Y

请注意,$$ 作为单个 $ 传递给 shell,并且所有内容都必须是 shell 的单个命令,因此是分号和反斜杠/换行符。

【讨论】:

  • 如果我正在做这个特定的目标,我只对这些变量感兴趣,我还需要它们不缩进吗?
  • 谢谢,我了解到您不能在目标中放置条件。有一些巧妙的方法可以解决这个问题,但我将使用环境变量修复。顺便说一句,你应该在两行中都有一个 " 后回声才能使这项工作。
【解决方案2】:

如果该行以制表符开头,它将被视为规则配方的一部分。在条件指令行的开头允许并忽略额外的空格,但不允许使用制表符。

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 2018-09-09
    • 2012-01-20
    • 2021-04-21
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多