Makefile ifeq: quand sont-ils évalués?
La suite est très simple makefile qui ne semble pas fonctionner correctement.
TEST=ON
buildbegin:
ifeq ($(TEST),ON)
@echo TEST PASSED
else
@echo TEST FAILED
endif
Peu importe ce que j'ai mis la variable de TEST, mon ifeq déclaration de passe. Je vois toujours les TEST RÉUSSI. Quelqu'un voit ce que je fais de mal ici?
EDIT:
ok. mon exemple n'était pas tout à fait exacte. Ce que j'ai fait est-ce:
SHELL = /bin/sh
DEFAULT_TARGS:= all all_debug
DEBUG_TARGS:= all_debug
ALL_TARGS:= $(DEFAULT_TARGS) $(DEBUG_TARGS)
.PHONY: $(ALL_TARGS)
.PHONY: buildbegin
$(ALL_TARGS): buildbegin
TEST=ON
$(DEBUG_TARGS): TEST=OFF
buildbegin:
@echo $(TEST)
ifeq ($(TEST),ON)
@echo PASSED
else
@echo FAILED
endif
L'exécution de tout faire all_debug en résulte "PASSÉ" en cours d'impression. Si je echo $(TEST) avant que la condition, c'est comme si mes règles sont en train de changer la variable, mais l'ifeq seulement les voit jamais quelle que soit la valeur par défaut est.
Fonctionne pour moi -
hmmm. J'ai 3.81
Fonctionne aussi bien - GNU 3.81
désolé. Mon exemple était entachée d'irrégularités. J'ai posté un montage avec un exemple réel
GNU Make 3.82
hmmm. J'ai 3.81
Fonctionne aussi bien - GNU 3.81
désolé. Mon exemple était entachée d'irrégularités. J'ai posté un montage avec un exemple réel
OriginalL'auteur kalden | 2012-08-16
Vous devez vous connecter pour publier un commentaire.
faire évalue le conditionnel lorsqu'il lit un fichier makefile (comme vous le savez, il utilise 2 passes), voir: Conditionnel Pièces de Makefiles. Vous pouvez facilement vérifier cela en utilisant avertissement (ce qui est une bonne chose pour déboguer les fichiers makefile):
Vous devez utiliser des commandes shell à la place et de les inclure dans la règle:
Bienvenue DONC! Si cette réponse est la bonne (et certainement, il est), vous devez vous accepter.
Ne pas le
$
dans$TEST
être échappé? Ie$$TEST
...merci pour le tuyau, elle doit être $(TEST) en fait, dans ce cas, parce que nous voulons que ce soit évaluée par faire. Mais si vous avez besoin d'une évaluation au sein de shell (pas dans cet exemple), alors oui - vous devez utiliser $$TEST. Mais notez que chaque ligne est exécutée dans leur propre processus de shell, dans ce cas, vous devez évaluer "dans un délai d'un faire ligne avant de tester"
OriginalL'auteur
Voici un nettoyant (je pense que, de toute façon) pour faire ce que vous voulez:
Vous avez raison...
OriginalL'auteur
Paramétrer la commande shell à l'aide de faire variables. Cela évite version récursive et même la coquille (apportez de la fourche de la commande directement et de ne pas passer par un shell si la commande contient pas de shell métacaractères (<>"&;)).
Quelque chose comme:
La
<...>
est simplement une convention pour indiquer une sorte d'indirection.OriginalL'auteur
Bien que la question est vieille, je veux partager une méthode plus simple.
Il est à utiliser
MAKECMDGOALS
de la variable qui représente la liste des cibles.Dans votre cas, une solution peut-être:
Utilisation:
make debug_all
oumake all
OriginalL'auteur