使用ifdef和ifndef指令

时间:2013-01-13 11:07:25

标签: bash makefile gnu-make conditional-compilation ifndef

我正在尝试检查变量是否使用ifndef/ifdef定义,但是我从执行中一直收到not found错误。我正在使用GNU Make 3.81,这是我所拥有的代码片段:

all: _images                 
    $(call clean, .)         
    $(call compile, .)       
    @$(OPENER) *.pdf &       

_images:                     
    $(call clean, "images")  
    $(call compile, "images")

define clean                                             
    @rm -f ${1}/*.log ${1}/*.aux ${1}/*.pdf              
endef                                                    

define compile                                           

    ifdef ${1}                                           
        dir = ${1}                                       
    else                                                 
        dir = .                                          
    endif                                                

    ifdef ${2}                                           
        outdir = ${2}                                    
    else                                                 
        outdir = ${1}                                    
    endif                                                

    @$(COMPILER) -output-directory ${outdir} ${dir}/*.tex

endef                                                    

确切的错误:

$ make                       
ifdef  "images"              
/bin/sh: 1: ifdef: not found 
make: *** [_images] Error 127

修改

考虑到巴尔玛的评论,这里得出结论:

define的内容是shell命令行,而不是make命令; 要打破定义块中命令内的行,必须转义换行符 - 使用\; 另外,对应于单行命令的每个块是分开执行的,每个块都在不同的shell执行中,这意味着,如果打算在下一个单行块中访问变量值,则定义局部变量将不起作用。 / p>

感谢tripleee的好工作。

1 个答案:

答案 0 :(得分:3)

您可以将shell的设施与Make相结合,以获得相当简洁的定义。

define compile
        @dir="${1}"; outdir="${2}"; outdir=$${outdir:-"$dir"}; \
        $(COMPILER) -output-directory "$${outdir}" "$${dir:-.}/*.tex

双美元是一个逃脱,它将一个美元符号传递给外壳。构造${variable:-value}返回$variable的值,除非它未设置或为空,在这种情况下它返回value。由于在shell计算此表达式之前,${1}${2}被静态字符串替换,因此我们必须采用环形路径将它们分配给变量,然后再检查它们。

这也演示了如何将两个“one-liners”组合成一个shell调用。分号是一个语句终止符(基本上等同于换行符),反斜杠和换行符的序列使下一行与当前行合并为一条“逻辑行”。

这很复杂,我建议你省略前导@,但我把它留下来只显示它所属的位置。如果您想要静默操作,一旦您正确调试它,请使用make -s

运行