2016-10-06 4 views
1

Ich bin neu mit Makefiles & ist verwirrt durch etwas ...Wie werden Makefile-Variablen berechnet?

ich in einem Makefile folgend habe ...

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 

, die den Ausgang geben ...

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 

ich die Verwendung verstehen von Doppel $, um die Verwendung von $ zu entkommen, aber was ich nicht verstehe, warum eine einzige $ für realpathverwendendir Befehle funktioniert, aber die Verwendung für den id Befehl nicht.

Kann mir jemand beim Verstehen helfen?

Dank

+1

'realpath' und' dir' sind 'GNU make' Funktionen,' id' ist nicht. Wenn Sie eine Shell-Funktion in einem Makefile verwenden wollen, verwenden Sie '$ (shell id -u)'. 'realpath' und' sir' sind nicht entkommen, sie sind richtig interpretiert von 'GNU make' – Tim

+0

Dank @TimF Care, um das als Antwort hinzuzufügen, damit ich akzeptieren kann? – TobyG

+0

Sicher, ich habe es getan und einige weitere Details und Links hinzugefügt :-) – Tim

Antwort

2

realpath und dirGNU make Funktionen sind, ist id nicht. Wenn Sie eine Shell-Funktion in einem Makefile verwenden möchten, verwenden Sie $(shell id -u). realpath und dir sind nicht maskiert, sie werden von GNU make korrekt interpretiert.

Siehe GNU make file name functions sowie GNU make shell function Handbuchseiten.

Wenn Sie $(id -u) in einem Makefile schreiben, make wird versuchen, zu suchen, wenn es eine Funktion oder eine Variable ist, und da es keine von diesen ist wird es nicht irgendetwas, damit die leeren echo s zu erweitern.

Jetzt ist der Grund, warum Ihre ID korrekt geschrieben wurde, als Sie das Dollarzeichen entkam, mysteriös und wahrscheinlich aufgrund Ihrer Shell. Was ist passiert ist, dass make nicht versucht, es zu erweitern, da die $ ist escaped, so echo $(id -u) wurde an das System gesendet. Sie können es direkt in Ihrer Shell versuchen, sollten Sie das gleiche Ergebnis erhalten.

Verwandte Themen