为什么递归调用时会丢失变量设置?

问题描述:

我几乎不知道有足够的makefile来破解其他人的makefile,有时甚至没有那么多。我目前的雇主有一个相当复杂的make环境,我在makefile中添加了两个目标,主要是为了自我记录我需要的所有交换机。 (有可能有更好的方法来做到这一点...如果有,请让我知道!!)为什么递归调用时会丢失变量设置?

无论如何,第一个目标按预期工作。第二个目标与第一个目标相同,但BENCH指派的末尾有“2”。否则,它的确切的呼叫。在执行期间的某个点,BENCH变量被用来创建一个目录。 第一个目标按预期创建目录。第二个目标使用默认的BENCH名称而不是传递给它的目录来创建目录。不知何故,它在命令行中丢失了变量设置,即使第一个目标的语法几乎相同。

为什么它在自我调用时会失去我的变量设置?是否有一些微妙之处,我错过了?这甚至是有效的事情吗?

comp_gate_oct04_ff: 
    make clean all BENCH=GATE_OCT04_FF SIMULATOR=NC SIM_64BIT=1 CORNER=FF NETLIST=oct04 | tee all_gate_oct04_ff.log 
    @tail all_gate_oct04_ff.log | mail -s "Compile for GATE_OCT04_FF is complete" $(SMS_ADDR) $(USER) 

comp_gate_oct04_ff2: 
    make clean all BENCH=GATE_OCT04_FF2 SIMULATOR=NC SIM_64BIT=1 CORNER=FF NETLIST=oct04 | tee all_gate_oct04_ff2.log 
    @tail all_gate_oct04_ff2.log | mail -s "Compile for GATE_OCT04_FF2 is complete" $(SMS_ADDR) $(USER) 
+0

你正在使用哪个版本的Make? (试试'make -v',看看它是怎么说的。) – Beta

+0

它的GNU Make 3.81 – SDGator

+0

注意:递归调用make时,你应该使用$(MAKE)而不是make:https://www.gnu.org/s/ hello/manual/make/MAKE-Variable.html –

我看不出为什么会出现此错误,我无法重现它。试试更简单:

comp_gate_oct04_ff: 
    make foo BENCH=GATE_OCT04_FF 

comp_gate_oct04_ff2: 
    make foo BENCH=GATE_OCT04_FF2 

foo: 
    @echo BENCH is $(BENCH) 

告诉我们这是怎么回事,我们将从那里开始。

编辑:
好的,我们已经把问题减少了一半。现在试试这个:

comp_gate_oct04_ff: 
    make clean 
    make all BENCH=GATE_OCT04_FF SIMULATOR=NC SIM_64BIT=1 CORNER=FF NETLIST=oct04 

comp_gate_oct04_ff2: 
    make clean 
    make all BENCH=GATE_OCT04_FF2 SIMULATOR=NC SIM_64BIT=1 CORNER=FF NETLIST=oct04 
+0

这表现了它应该的方式,并且不会重现错误...调用第一个目标打印xxx_FF,第二个目标打印xxx_FF2。啊!! – SDGator