20

我有一个 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 文档并看到其他人使用它。任何帮助表示赞赏,这可能是愚蠢的。

4

2 回答 2

28

很可能您的 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 手册有所有的细节。

如果您真的要测试环境变量(而不是make variable),那么只需在命令中执行此操作:

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 的单个命令,因此是分号和反斜杠/换行符。

于 2013-05-23T19:58:15.107 回答
6

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

于 2013-05-23T20:20:56.790 回答