Checking if variables are defined in a makefile

37,117

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

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

Share:
37,117

Related videos on Youtube

Troy Rockwood
Author by

Troy Rockwood

Scientist doing computational physics and optics.

Updated on July 09, 2022

Comments

  • Troy Rockwood
    Troy Rockwood almost 2 years

    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.

    • Jens
      Jens almost 11 years
      What kind of make is this? GNU make? BSD? POSIX?
    • Troy Rockwood
      Troy Rockwood almost 11 years
      GNU Make version 3.81 is being used here.
  • Troy Rockwood
    Troy Rockwood almost 11 years
    I am only interested in these variables if I'm doing this particular target, do I still need them to be unindented?
  • Troy Rockwood
    Troy Rockwood almost 11 years
    Thank you, I learned that you can't put conditionals within a target. There are clever ways to get around doing this but I will use the environment variable fix. BTW, you should have a " after echo in both lines to make this work.