取消引用使变量内联

时间:2013-10-13 15:52:44

标签: makefile gnu

我有一段tcl代码来评估一组变量。然后,这些变量的值需要作为参数传递给配方中的下一行

enter code here

MY_ENV_VAR?=45  
foo:ARG1?=test  
foo:OUTFILE:=./testFile  
foo:  
$(shell ./evalVars.tcl -arg1 $(ARG1) -outFile $(OUTFILE))  
$(foreach var,$(shell cat $(OUTFILE)),$(eval $(var)))  
runcmd -value $(myvar)  

out文件将包含一系列make变量赋值“myvar:= 400”
在使用shell函数时,任何命令行/ make变量都不会作为环境变量传递给tcl shell 如果我从tcl shell中取消引用env(MY_ENV_VAR)它就不存在了。 如果我不使用shell命令,则在创建输出文件之前执行foreach / eval行,但变量在tcl shell中可见。
我确信有更优雅的方式来做到这一点。

1 个答案:

答案 0 :(得分:0)

哇,这太疯狂了。

一个答案是,如果要将变量传递给子shell,则需要导出make变量。所以你需要像$(eval export $(var))这样的东西。

但是,这可能不起作用,因为make可以在规则的开头构建子进程的环境,并且可能不会为每个单独的配方行重新计算它。我不确定。

一般来说,这是一种完全奇怪的方式,但在我建议更合理的替代方案之前,我需要了解您有多少基础设施需要修改。您可以更改evalVars.tcl文件以生成不同类型的输出吗? OUTFILE必须是特定于目标的变量(对于不同的目标可能不同)吗?或者只有一个makefile?是否要求evalVars.tcl在同一个配方中运行,或者它们是两个不同的目标,一个取决于另一个?

到目前为止,最合理的方法是修改evalVars.tcl,以便生成shell变量赋值,而不是进行变量赋值。如果你这样做,你可以做一些像:

foo:
        ./evalVars.tcl -arg1 $(ARG1) -outFile $(OUTFILE) \
            && . $(OUTFILE) \
            && runcmd -value $$myvar

其中$(OUTFILE)的内容为export myvar=400