我对Makefile中的变量范围有疑问。
我有几个目标,所有目标都执行相同的命令,但命令的某些参数需要根据目标进行更改。
为了尝试消除冗余,我试图重构这些目标,以便每个目标只是设置一些变量,然后稍后调用一个使用这些变量的通用目标。
例如,
target1:
COMMAND="../bin/release/prog1 input"
TITLE=PROG1
OUTFILE=PROG1.pdf
make targetN
target2:
COMMAND="../bin/release/prog2 input"
TITLE=PROG2
OUTFILE=PROG2.pdf
make targetN
..
..
targetN:
$(COMMAND) | grep RESULTS > results.csv
gnuplot -e "TITLE=$(TITLE)" prog.plot
...
..
这里target1和target2设置它们的“特定于目标”的变量,然后调用targetN。 目的是targetN然后使用这些变量并用它们运行一般命令。
问题:targetN没有看到在target1和/或target2中设置的这些变量的值。 任何人都可以对此有所了解吗?我试图搜索有关目标范围的信息,但没有找到任何有用的信息。也许这个问题与范围无关,而且是一个完全不同的问题。
有关如何完成我尝试使用此方案实现的任何建议吗?
谢谢!
答案 0 :(得分:5)
每个命令都在自己的子shell中运行,因此在一个命令中设置的变量在另一个命令中不可见。
但是有一种更好的方式来做你想要的事:target-specific variable values。
target1: COMMAND="../bin/release/prog1 input"
target1: TITLE=PROG1
target1: OUTFILE=PROG1.pdf
target2: COMMAND="../bin/release/prog2 input"
target2: TITLE=PROG2
target2: OUTFILE=PROG2.pdf
...
...
target1 target2:
$(COMMAND) | grep RESULTS > results.csv
gnuplot -e "TITLE=$(TITLE)" prog.plot
...
或者,如果模式与您向我们展示的模式一样严格,您可以使用模式规则:
target1 target2 : target% :
../bin/release/prog$* input | grep RESULTS > results.csv
gnuplot -e "TITLE=PROG$*" prog.plot
...