我正在尝试检查变量是否使用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的好工作。
答案 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
。