web-dev-qa-db-ja.com

envをmakefileターゲットに送信します

Makefileターゲットのgitsha1commitであるenv変数を設定しようとしています。私はたくさんの環境変数を設定していますが、これだけが失敗し、そのようなファイルやディレクトリのエラーはありません。私は地獄の混乱です。これをenvvarとしてmakefileターゲットに渡すのを手伝ってください。これは、Makefileの最初に行うことです。

SHA1 := $(Shell git log | head -1 | awk '{print $2}')
BUILD_STAMP := $(Shell date +%s)
export SHA1
export BUILD_STAMP

そして、makefileターゲットの1つはこのようになっています。

target: dep-target
     env \
              VAR1=$(VAR1) \
              GIT_SHA1=$(SHA1) \
     my-command for the target

これは失敗します

env: a6d23d14b0fbb613e567cc647ebfe2808ce47af1: No such file or directory

これをenvvarとして設定するのを手伝ってください。

3
Medhamsh
 VAR1 = $(VAR1)
 GIT_SHA1 = $(SHA1)

このように直前に$を付けて使用する丸括弧、括弧は、実行を試みるコマンドラインとして括弧の間のテキストをBashに送信します。

代わりに中括弧、つまりGIT_SHA1=${SHA1}に置き換えると、代わりに目的の変数割り当てが取得されます。

3
Hannu

@Hannuの間違った答えについてコメントするのに十分な担当者がいません(中括弧と丸括弧はMakeでは同等です)。

この種のものをデバッグするには、別の短いMakefileを作成し、次のようなことを試してください。

SHA1 := $(Shell git log | head -1 | awk '{print $2}')
all:
        echo "$(SHA1)"

これは、SHA1が、SHAだけでなく、スペースを含むgitログ出力の最初の行全体に割り当てられることを示しています。展開されたenvコマンドの構文は無効になります。

この場合、awkコマンドのドル記号を2倍にして($$ 2を出力)、空の変数$(2)としてではなく、リテラルのドル記号に展開する必要があります。

1
Curt