Jak uzyskać zmienną środowiskową powłoki w pliku makefile?

105

W muszli, kiedy wchodzę

echo $demoPath

drukuje

/usr/local/demo

Jak mogę uzyskać wartość tej zmiennej $demoPathw pliku makefile?

Jialin
źródło

Odpowiedzi:

157

Jeśli wyeksportowałeś zmienną środowiskową:

export demoPath=/usr/local/demo

możesz po prostu odwołać się do niego po nazwie w makefile( makeimportuje wszystkie ustawione zmienne środowiskowe):

DEMOPATH = ${demoPath}    # Or $(demoPath) if you prefer.

Jeśli nie wyeksportowałeś zmiennej środowiskowej, nie będzie ona dostępna, dopóki jej nie wyeksportujesz lub jeśli nie przekażesz jej jawnie w wierszu poleceń:

make DEMOPATH="${demoPath}" 

Jeśli używasz pochodną C Shell, substytut setenv demoPath /usr/local/demodla exportkomendy.

Jonathan Leffler
źródło
3
"make importuje wszystkie ustawione zmienne środowiskowe". Działa! Świetnie ~, nie mam o tym wcześniej pojęcia, bardzo dziękuję.
Jialin,
@jonathan_leffler Twoja odpowiedź zainspirowała mnie i zrobiłem coś innego. Ustawić envvar przed wywołaniem markę bez eksportowania go: demoPath=/usr/local/demo make. Możesz to przetestować i zaktualizować swoją odpowiedź. Twoje zdrowie!
AD
@AD Tak, to kolejny mechanizm ustawiania wartości zmiennej środowiskowej dla określonego polecenia. Jest to nieco styczne do pytania, które dotyczy raczej dostępu do wartości istniejącej zmiennej, a nie tworzenia takiej w locie. Nie przeszkadza to w okazjonalnym byciu przydatną techniką.
Jonathan Leffler
11

dla tych, którzy chcą jakiegoś oficjalnego dokumentu potwierdzającego zachowanie

Zmienne w make mogą pochodzić ze środowiska, w którym działa make. Każda zmienna środowiskowa, która sprawia, że ​​widzi się podczas uruchamiania, jest przekształcana w zmienną make o tej samej nazwie i wartości. Jednak jawne przypisanie w pliku makefile lub z argumentem polecenia przesłania środowisko. (Jeśli podano flagę '-e', to wartości ze środowiska przesłaniają przypisania w pliku makefile.

https://www.gnu.org/software/make/manual/html_node/Environment.html

Dyno Fu
źródło
6
all:
    echo ${PATH}

Lub zmień PATH tylko dla jednego polecenia:

all:
    PATH=/my/path:${PATH} cmd
g10guang
źródło