Portál AbcLinuxu, 10. května 2025 02:19
PROMENNA = HODNOTA_PROMENNE neco: echo Promenna $$(PROMENNA) ma hodnotu $(PROMENNA)aby mi vypsal
Promenna $(PROMENNA) ma hodnotu HODNOTA_PROMENNEOvšem takto mi to funguje pouze na Windows, nikoliv na Linuxu. Na linuxu se, jak se zdá, pokouší z mě neznámého důvodu zavolat příkazy (?) uvedené mezi $() - tj. make zřejmě předá správně
Promenna $(PROMENNA) ma hodnotu HODNOTA_PROMENNEovšem "kdosi" se patrně $(PROMENNA) pokouší ještě dereferencovat a výsledek make je:
/bin/sh: PROMENNA: command not found Promenna ma hodnotu HODNOTA_PROMENNEtj. chybový výpis a hlavně tam pak chybi $(PROMENNA). Ovšem pokud tam mám jenom $$ samotné, bez (PROMENNA), vypise to $ správně jak bych očekával. Co s tím? Potřebuji $(PROMENNA) předat dál a nikoliv spouštět jakýsi program...
somesrc.d: somesrc.cpp gcc -MM -MP -MF$@ -MT$$(DIR)/$*.$$(OBJ_SFX) $<aby soubor somesrc.d obsahoval
$(DIR)/somesrc.$(OBJ_SFX): somesrc.cpp ...tj. aby proměnné v .dep souboru nebyly dereferencované (kvůli různým nastavením pro různé systémy). Jenže takto to nefunguje, vypíše mi to
/bin/sh: DIR: command not found /bin/sh: OBJ_SFX: command not founda ve výsledném .d souboru je bohužel jenom
/somesrc.: somesrc.cpp ...(tj. bez proměnných).
$$
premeni na $
, takze jeste byste to mel escapnout pro shell (slash, uvozovky). Mozna takhle
somesrc.d: somesrc.cpp gcc -MM -MP -MF$@ -MT\$$(DIR)/$*.\$$(OBJ_SFX) $<
gcc -MM -MP -MF$@ '-MT$$(DIR)/$*.\$$(OBJ_SFX)' $<našel jsem před chvílí nakonec někde na stránkách o /bin/sh že když je to v apostrofech tak se proměnný nevyhodnocujou
make
a shellu. Obě syntaxe jsou velmi podobné (začínají dolarem), ale ne stejné: zatímco v makefile se používají kulaté závorky, v shellu složené. Kulaté závorky v shellu spustí program, je to ekvivalentní použití zpětných apostrofů (backtick).
Například tyto dva zápisy jsou (funkčně) ekvivalentní:
echo `basename $PWD` echo $(basename $PWD)V původním makefile bylo správně zabráněno resolvování proměnné
make
(zdvojením dolaru), ale už nebylo zabráněno zpracování této konstrukce v shellu. Na windows to samozřejmě fungovalo, protože cmd.exe
nic takového nemá.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.