0

我有一段评估一组变量的 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 命令,则在创建 out 文件之前执行 foreach/eval 行,但变量在 tcl shell 中是可见的。
我确信有一种更优雅的方式来做到这一点。

4

1 回答 1

0

哇,这太疯狂了。

一个答案是,如果您希望将 make 变量传递给子 shell,则需要导出它们。所以你需要类似$(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

于 2013-10-13T21:11:41.533 回答