Proměnné v makefilech

Zdá se, že je úplně jedno, jestli k obsahu proměnné VAR přistupujeme pomocí $(VAR), nebo ${VAR}. Obojí funguje jak pro proměnné definované uvnitř makefilu, tak pro proměnné prostředí zděděné zvenku. Složené závorky mají ale tu výhodu, že se dají zkopírovat do shell skriptu a beze změny fungují. Make zase zná makra, což jsou funkce, jejichž volání vypadá podobně jako přístup k proměnným: $(foreach i,a b c,$i.txt). Tohle pochopitelně do shellu zkopírovat nejde, ale i to může být ve složených závorkách a bude to (uvnitř makefilu) fungovat.

Uvnitř makefilu se dá do proměnných přiřazovat buď exportně, nebo neexportně:

VAR=neexportovano
export VAR=exportovano

Proměnná definovaná prvním způsobem je dostupná pouze v rámci daného makefilu. Proměnná definovaná druhým způsobem je vidět i v prostředí procesů, které makefile zavolá. To platí bez ohledu na to, zda na začátku makefilu explicitně ohlásím, že SHELL=/bin/bash. Pokud přiřadíme neexportně do proměnné, kterou už jsme zdědili z vnějšího prostředí (tj. už byla exportovaná “nahoře”), tato proměnná zůstává exportovaná a bude vidět i v procesech, které zavoláme.

Místo obyčejného přiřazovacího operátoru “=” lze použít podmíněné přiřazení “?=”. Aplikuje se v případě, že daná proměnná v danou chvíli ještě není definovaná. Hodí se tedy na definování výchozí hodnoty parametru, pokud tento parametr volající nenastaví jinak. Pozor, posuzuje se, zda je proměnná definovaná, nikoli zda je její hodnota neprázdná. Proměnná může být definovaná a mít prázdnou hodnotu; v tom případě do ní operátor “?=” nic nového nepřiřadí.

Proměnné, které fungují jako vstupní parametry, lze také definovat na příkazovém řádku při volání make:

make VAR=hodnota

Make takto definované proměnné pozná (zdá se mi, že bez ohledu na to, zda je volán z bash, nebo z tcsh) a dokáže je odlišit od proměnných, které byly definované ve vnějším prostředí. Proměnné definované na příkazovém řádku mají přednost před stejnojmennými proměnnými uvnitř makefilu, bez ohledu na to, zda jsou uvnitř makefilu nastavené pomocí “=”, nebo “?=”.