2016-10-06 5 views
1

私が使用することを理解して...私は... MakefileでMakefile変数はどのようにして計算されますか?

出力を与える
USER_ID := $(id -u) 
USER_ID_ESC := $$(id -u) 

MAKEFILE := $(realpath $(lastword $(MAKEFILE_LIST))) 
ROOT_DIR := $(dir $(MAKEFILE)) 


x: 
    echo $${USER_ID} 
    echo ${USER_ID} 
    echo $(USER_ID) 
    echo $${USER_ID_ESC} 
    echo ${USER_ID_ESC} 
    echo $(USER_ID_ESC) 
    echo $${ROOT_DIR} 
    echo ${ROOT_DIR} 
    echo $(ROOT_DIR) 
    exit 0 

を以下している...

何かに戸惑っています

echo ${USER_ID} 

echo 

echo 

echo ${USER_ID_ESC} 

echo $(id -u) 
502 
echo $(id -u) 
502 
echo ${ROOT_DIR} 

echo /Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/ 
/Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/ 
echo /Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/ 
/Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/ 
exit 0 

&のMakefileを使用する新たなんですダブルの$の使用を逃れるために$が、なぜ私は理解していない単一のを使用して$realpath & dirコマンドは機能しますが、idコマンドにはこのコマンドを使用しません。

誰かが私の理解を助けることができますか?

おかげ

+1

'realpath'と' dir'は 'GNU make'関数であり、' id'はありません。 Makefileの中でシェル関数を使いたい場合は '$(shell id -u)'を使います。 'realpath'と' sir'はエスケープされず、 'GNU make 'によって正しく解釈されます。 – Tim

+0

Thanks @TimFこれを答えとして追加して受け入れることができますか? – TobyG

+0

確かに、私はそれをやって、いくつかの詳細とリンクを追加しました:-) – Tim

答えて

2

realpathdirGNU make機能、idているではありません。 Makefileの中でシェル関数を使いたい場合は$(shell id -u)を使います。 realpathdirはエスケープされず、GNU makeによって正しく解釈されます。

GNU make file name functionsおよびGNU make shell functionマニュアルページを参照してください。あなたがMakefileで$(id -u)を書くとき

は、makeは、関数や変数だし、それはこれらのどれもないので、それは空のechoのため、何にも拡大していないかどう見てしようとします。

ドル記号をエスケープしたときにあなたのIDが正しく書かれた理由は神秘的で、おそらくあなたのシェルのせいです。何が起こったのかmake$がエスケープされているため拡張しようとしていないため、echo $(id -u)がシステムに送信されました。シェルで直接試すことができます。同じ結果を得る必要があります。

関連する問題