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" が含まれます。
シェル関数を使用する場合、コマンド ライン/make 変数は環境変数として Tcl シェルに渡されません。
tcl シェル内から env(MY_ENV_VAR) を逆参照すると、存在しません。シェル コマンドを使用しない場合、out ファイルが作成される前に foreach/eval 行が実行されますが、変数は Tcl シェルで表示されます。
これを行うためのより優雅な方法があると確信しています。

4

1 に答える 1

0

うわー、それはかなりクレイジーです。

1 つの答えは、make 変数をサブシェルに渡したい場合は、make 変数をエクスポートする必要があるということです。したがって、次のようなものが必要です$(eval export $(var))

ただし、ルールの開始時に make がサブプロセスの環境を構築している可能性があり、個々のレシピ行ごとにそれを再計算しない可能性があるため、それは機能しない可能性があります。わからない。

一般的に、これは物事を行うための完全に奇妙な方法ですが、より健全な代替案を提案する前に、インフラストラクチャのどれだけを変更するライセンスを持っているかを理解する必要があります。ファイルを変更してevalVars.tcl、異なるタイプの出力を生成できますか? ターゲット固有の変数である必要がありますかOUTFILE(ターゲットごとに異なる可能性があります)? または、makefile は 1 つだけですか? 同じレシピで実行する必要がありevalVars.tclますか? それとも、一方が他方に依存する 2 つの異なるターゲットにすることができますか?

これに対する最も合理的なアプローチは、evalVars.tcl変数の割り当てではなく、シェル変数の割り当てを生成するように変更することです。あなたがそれをしたなら、あなたは次のようなことをすることができます:

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

の内容は次の$(OUTFILE)ような行になりますexport myvar=400

于 2013-10-13T21:11:41.533 に答える