Checking if variables are defined in a makefile

邮差的信 提交于 2021-02-07 04:53:56

问题


I have a GNU Makefile (version 3.81) that looks like the following:

.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)

I execute with the following command line: make X=0.1 Y=0.1 SPOneDot but I get the following result:

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

I've looked in the makefile documentation and seen others use it. Any help is appreciated, it's likely something foolish.


回答1:


Most likely your make directives must not be tab indented but start in the first column. I also suspect you want .if(...) or similar, not plain ifdef. It's hard to tell without knowing what make implementation you use.

In GNU make, conditional parts are used e.g. like this

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

The GNU make manual has all the details.

If you really mean to test an environment variable (as opposed to a make variable), then simply do so in the commands:

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

Note that $$ is passed to the shell as a single $ and everything must be a single command for the shell, hence the semicolons and backslash/newlines.




回答2:


If the line begins with a tab, it will be considered part of a recipe for a rule. Extra spaces are allowed and ignored at the beginning of the conditional directive line, but a tab is not allowed.



来源:https://stackoverflow.com/questions/16722480/checking-if-variables-are-defined-in-a-makefile

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!