2012-03-07 17 views
9

Makefile内でシェルコマンドをすぐに展開したいのですが、シェルコマンドでMakefile内の環境変数にアクセスする必要があります。 $(shell ...)を使用すると、すぐに展開されますが、変数へのアクセスはありません。逆引用符を使用すると、展開が即座に行われるのではなく、後でMakefileに問題が発生します。バッククォートを直ちに展開する方法や、現在の環境を$(シェル)コマンドに渡す方法があるかどうか疑問に思っています。例えばMakefileシェルへの環境変数のエクスポート

、次のメイクファイル:

SOME_VAR := some_val 
export SOME_VAR 

VAR1 := `echo $$SOME_VAR` 
export VAR1 
VAR2 := `echo $$VAR1` 

all: 
     @echo VAR1=$(VAR1) 
     @echo VAR2=$(VAR2) 

ウィル出力:私はそれが "VAR2 = some_val" 印刷したい

~/tmp/t2> make 
VAR1=some_val 
VAR2=`echo $SOME_VAR` 

。実際の例はちょっと複雑です(環境変数は親のmakefileから継承されていますが、変数を編集するためにperlスクリプトを使用しようとしています)が、原則は同じです。

何か助けていただければ幸いです。

答えて

1

私はコメントの一部で述べたように、私の実際の目標は、スクリプトは、オブジェクトがしてコンパイルされていた設定に基づいてファイル名を生成することでした。次に、生成されたすべてのファイル名の特別なフォーマットのリストを生成するために別のスクリプトが必要です(ターゲットはJITコンパイラーを持たない組み込みシステムです)。いつでも、バイナリに影響する可能性のある設定は30以上あります。これは将来、複数のモジュールで使用される可能性があります。スケーラブルなものが必要です。

私の解決策は次のとおりです。

VAR1 := CONFIG_X1=$(CONFIG_X1) CONFIG_X2=$(CONFIG_X2) CONFIG_X33=$(CONFIG_X33) 

とスクリプト2:

-include $(SOME_MK_FILE) 

$(SOME_MK_FILE) : .phony 
    script.pl $(SETTINGS_OF_INTEREST_LIST) > $(SOME_MK_FILE) 

someFilename := $(shell script2.pl $(VAR1)) 

script.plのようなものに見える文字列を出力します。その代わりに変数を渡すので、私は設定に基づいて出力するメイクファイルの構文解析が可能な文字列を私のスクリプトを修正しました出力し、「someFilename.X1_y.X2_n.elf」

のようなものを見て、ファイル名は、後に、別のルールでは、私が持っている:

someobj: somedep 
    script3.pl $(someFilename) >> builtfiles.txt 

これはbuildfiles.txtを適切にビルドします(これはさらに別のスクリプトの入力です...)。結局、これはmakeがその環境を$(シェル)に渡すことができないという事実に対する回避策です。それはあまりにもきれいではありませんが、それは動作します。

ジョンはここ

4

この問題は何ですか?

VAR1 := $(shell echo $(SOME_VAR)) 
VAR2 := $(shell echo $(VAR1)) 
+0

うーん...はい、私の例には欠陥ました。 ..上記の例では、VAR1はMakefile内で展開されていますが、必要なのはVAR1をシェルスクリプト内で展開することです。つまり、ENV {'VAR1'}にアクセスする必要があるperlスクリプトを呼び出しています。 $(shell ...)から呼び出された場合、スクリプトはVAR1の内容を知らないでしょう。私は良い例で私の質問を編集します。ありがとう。 – John

+0

@ジョン、私は本当にあなたがここで何をしようとしているのか理解できません。私はいくつかの推測をすることができますが、私はあなたの質問を編集すれば速くなると思います。 – Beta

+0

私が実際にやろうとしていること:オブジェクトファイルをビルドし、ビルドされた構成設定に従って名前を付けるmakefileがあります。私は構成設定を名前に変換するperlスクリプトを持っています。これを動作させるためには、perlスクリプトは構成設定にアクセスする必要があります(バッククォートを使用する必要があります)。これはそれ自身では問題ありませんが、別のperlスクリプトでその名前を使用する必要があります。 2番目のスクリプトが実行されるまでに名前が拡張されないため、エラーが発生します。私は回避策を探しています。 – John

5

これはあなたの欲しいものですか?

VAR2 := $(shell VAR1="$(VAR1)" script_that_uses_var1)

+0

正確ではありません。私が望むのは、特定のバイナリをビルドし、現在の設定に従ってそれらの名前を付けることです。私が望む設定を明示的にエクスポートすることはできますが、このソリューションはあまり拡張性がありません。それで、私がする必要があるのは、すべてのmakefile設定にアクセスできるスクリプトを実行することです。その後、ファイル名を出力することができます。最終的に後で別のスクリプトに渡す必要があるファイル名。ファイル名は後でなく早く解決する必要があります。 – John

+1

これはOPに役立っていないかもしれませんが、正確に私はこの質問を検索する必要があった。乾杯! –