我试图检查一个变量是否使用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编辑
考虑到Barmar的评论,结论如下:
定义的内容是shell命令行,而不是指令;要在定义块内中断命令行,必须转义行符--而且,对应于一行命令的每个块分别执行,每个块在不同的shell执行中执行,这意味着,如果要在下一个一行程序块中访问变量值,则定义局部变量将无法工作。
谢谢你的好意。
发布于 2013-01-13 13:20:15
您可以将shell的功能与Make结合起来,以获得一个相当简洁的定义。
define compile
@dir="${1}"; outdir="${2}"; outdir=$${outdir:-"$dir"}; \
$(COMPILER) -output-directory "$${outdir}" "$${dir:-.}/*.tex双美元是一种逃逸,它将一美元符号传递给空壳.构造${variable:-value}返回$variable的值,除非它是未设置或空的,在这种情况下,它返回value。由于${1}和${2}在shell计算此表达式之前被静态字符串替换,所以在检查它们之前,我们必须采取将它们赋值给变量的迂回路线。
这还演示了如何将两个“一行程序”合并到单个shell调用中。分号是语句终止符(基本上相当于换行符),反斜杠和换行符的序列将使下一行与当前行合并为单个“逻辑行”。
这是足够复杂的,我建议您省略领先的@,但我留在这里只是为了显示它的归属。如果您想要静默操作,那么一旦您正确地调试了它,就使用make -s运行。
https://stackoverflow.com/questions/14302846
复制相似问题