2013-10-13 83 views
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) 

出的文件被傳遞到下一行將包含一系列使變量賦值「MYVAR:= 400」
在使用殼功能的任何命令行/ make變量不會作爲環境變量傳遞給tcl shell。
如果我從tcl shell中取消引用env(MY_ENV_VAR),它不存在。 如果我不使用shell命令,則在創建out文件之前執行foreach/eval行,但這些變量在tcl shell中可見。
我確信有一個更優雅的方式來做到這一點。

回答

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

+0

感謝您的答覆線。猜測一樣多:-)。我嘗試了環境變量的方法,但使用.oneshell,但我想我遇到了一些問題,並以此結束。我可以使用&&與env變量相結合。你可以在單獨的配方中使用evalvars,但每個調用它的目標都需要傳遞某些參數並使用它設置的變量。如果需要,可以修改evalvars的輸出 –

+0

我嘗試了你的替代方案,它運行良好,直到我遇到其值有特殊字符的變量。我試圖用''轉義這些組合' 作爲例子setenv a'b [c = 1]' –

+0

對不起,我不明白這個問題。請提供您遇到問題的特殊值/變量分配類型的示例。 – MadScientist