Makefile 取消引用使变量内联

Makefile 取消引用使变量内联,makefile,gnu,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))) runcm

我有一段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中可见。

我相信有一种更优雅的方式可以做到这一点。

哇,这太疯狂了

一个答案是,如果希望将make变量传递给子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的行

感谢您的回复。猜得差不多:-)。我尝试了环境变量的方法,但使用了.oneshell,但我认为我遇到了一些问题,最终导致了这个问题。我可以将&&与环境变量结合使用。您可以在单独的配方中使用evalvar,但调用它的每个目标都需要向它传递某些参数并使用它设置的变量。如果需要,可以修改evalvars的输出。我尝试了你的替代方案,效果很好,直到我遇到了值具有特殊字符的变量。我试着用“转义等”将它们分组。例如setenv a“b[c=1]”对不起,我不理解这个问题。请提供一个特殊值/变量赋值类型的示例。例如,setenv VARNAME“span[hosts=1]”是一个lsf资源字符串。我不明白:这看起来像csh语法。您不能将csh与make一起使用,您需要使用POSIX shell(Bourne shell)。而且,如果您在POSIX shell中简单地使用
VARNAME=span[hosts=1]
,它可以正常工作:不需要引用。在命令行中使用时也不需要引用。