makefileターゲットでenv変数を使用する

makefileターゲットでenv変数を使用する

makefileで環境変数を使用する方法を見つけようとしています。次の手順を実行する必要がある特定のユースケースがあります。

  1. コマンド1の実行
  2. command2の出力をenv変数に割り当てます。
  3. command3を実行して、手順2で割り当てられた環境変数を読み込みます。

上記の手順を実装するmakefileは次のとおりです。ただし、実行すると空の変数が印刷されます。私は何が間違っていましたか? Bashでこのコマンドを実行すると正常に動作します)

ベストアンサー1

ドル記号はmakeで使用されるため、シェルに渡すにはドル記号をエスケープする必要があります。倍に増やすだけです。

test:
        @bash -c "\
        echo 'need to run some program before assigning env variable';\
        echo 'The make CC variable is set to :${CC}:';\
        export TEST=\"\$$(date)\";\
        echo 'printing env';\
        echo \$${TEST};\
        "

testwithout:
        @echo 'need to run some program before assigning env variable';\
        echo 'The make CC variable is set to :${CC}:';\
        export TEST="$$(date)";\
        echo 'printing env';\
        echo $${TEST};

文字列を2回解釈すると、他の問題が発生します。makeレシピを取得し、シーケンスをバックスラッシュと改行文字に変換し、実行のために結果をシェルに提供します。二重引用符を使用すると、bash -c " .... "シェルはドル記号を拡張するため、 `bash -c "echo 'need ...' ;export TEST=Mon Sep...; echo ;" で終わります。いくつかのバックスラッシュ文字を追加すると、ドル記号と内部二重引用符が保護されます。

bash -c非標的テストで示されているように、.を使用する必要はないかもしれません。それでもコマンドを1行で書く必要があります。 Gnu makeには、論理.ONESHELLラインごとに1つのシェルではなく単一のシェルを使用してレシピを実行する機能があるため、歪みを回避できます。

おすすめ記事