制作:在配方中重新分配变量

时间:2013-11-18 23:14:51

标签: makefile gnu-make

我对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中设置的这些变量的值。 任何人都可以对此有所了解吗?我试图搜索有关目标范围的信息,但没有找到任何有用的信息。也许这个问题与范围无关,而且是一个完全不同的问题。

有关如何完成我尝试使用此方案实现的任何建议吗?

谢谢!

1 个答案:

答案 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
    ...