我有一段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中可见。
我确信有更优雅的方式来做到这一点。
答案 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