Utilizarea comenzilor shell, așa cum este menționat în celelalte răspunsuri, ar trebui să fie suficientă pentru majoritatea cazurilor de utilizare:
if [ 1 -gt 0 ]; then \
#do something \
fi
Cu toate acestea, dacă, ca mine, doriți să utilizați comparația mai mare decât pentru a apoi să setați o variabilă make
prin comanda $(eval)
a lui make
, atunci veți descoperi că încercând să faceți acest lucru folosind modelul celuilalt răspuns:
if [ 1 -gt 0 ]; then \
$(eval FOO := value) \
fi
generează o eroare:
if [ 1 -gt 0 ]; then fi;
/bin/bash: -c: line 0: syntax error near unexpected token `fi'
/bin/bash: -c: line 0: `if [ 1 -gt 0 ]; then fi;'
make: *** [clean] Error 2```
Motivul este că expresia $(eval)
a lui make
returnează șirul gol. a> Codul bash rezultat este apoi malformat.**
Am venit cu următoarea soluție (după ce am încercat multe abordări diferite!).
$(if $(shell [ $(FOO) -ge 1 ] && echo "OK"), \
$(eval BAR := true), \
$(eval BAR := false))
Este necesar să imprimați un șir după efectuarea comparației aritmetice (partea echo "OK"
) deoarece operatorul $(if)
al lui make
se bazează pe logica șirurilor goale:
$(dacă condiția, atunci-part[,else-part])
Funcția if oferă suport pentru extinderea condiționată într-un context funcțional (spre deosebire de GNU makefile condiționale, cum ar fi ifeq (vezi Sintaxa Condiționalelor).
Primul argument, condiția, are mai întâi toate spațiile albe anterioare și cele din urmă eliminate, apoi este extins. Dacă se extinde la orice șir nevid, atunci condiția este considerată adevărată. Dacă se extinde la un șir gol, condiția este considerată falsă.
Sursa: GNU Make Manual
Sper că acest lucru vă ajută!
** Notă: inițial, m-am gândit că problema ar putea fi rezolvată cu ușurință prin adăugarea unei comenzi bash care nu face nimic expresiei, cum ar fi true
:
if [ $(VALUE) -ge 1 ]; then \
true; $(eval BAR := GreaterOrEqualThan1) \
else \
true; $(eval BAR := LowerThan1) \
fi
S-a dovedit a fi o idee groaznică. Încă nu mi-am dat seama de ce, dar ramura else
este întotdeauna executată, independent de rezultatul comparației.
Cred că ar trebui să deschid o întrebare pentru acest caz.
person
levelont
schedule
31.05.2017
$(shell)
sau în reţete) precum îl propune răspunsul selectat. - person jmon12   schedule 20.02.2020