2009-12-02 6 views
4

J'ai un petit problème avec mon Makefile. Je veux faire changer les commandes concernant le répertoire de travail. J'ai ajouté une directive conditionnelle à la règle testant le répertoire de la cible actuelle ($ (* D)). Le fait est que make va toujours à la deuxième branche de mon test, même si mon fichier est dans mySpecialDirectory et que l'echo imprime en effet "mySpecialDirectory".Makefile: la directive ifeq compare la variable spéciale à la constante ne fonctionne pas

.c.o .cpp.o .cc.o: 
ifeq ($(*D),mySpecialDirectory) 
    @echo "I'm in mySpecialDirectory! \o/" 
    $(CC) $(DEBUG_FLAGS) $(MYSPECIALFLAGS) -c $< -o [email protected] 
else 
    @echo "Failed! I'm in $(*D)" 
    $(CC) $(DEBUG_FLAGS) $(NOTTHATSPECIALFLAGS) -c $< -o [email protected] 
endif 

Répondre

7

Ceci est le comportement attendu.

Déclarations conditionnelles

Toutes les instances de syntaxe conditionnelle sont analysées immédiatement, dans leur intégralité; ceci inclut les formes ifdef, ifeq, ifndef et ifneq. Bien sûr, cela signifie que les variables automatiques ne peuvent pas être utilisées dans les instructions conditionnelles, car les variables automatiques ne sont pas définies tant que le script de commande de cette règle n'est pas appelé. Si vous avez besoin d'utiliser des variables automatiques dans un conditionnel, vous devez utiliser la syntaxe conditionnelle du shell, dans votre script de commande proprement dit, pour ces tests, et non des conditionnelles.

$(*D) est une variable automatique.

Au lieu de cela, envisager de faire:

.c.o .cpp.o .cc.o: 
    $(CC) $(DEBUG_FLAGS) $(if $(subst mySpecialDirectory,,$(*D)),$(NOTTHATSPECIALFLAGS),$(MYSPECIALFLAGS)) -c $< -o [email protected] 

L'idée est d'abuser $(subst) dans des tests d'égalité en remplaçant mySpecialDirectory par la chaîne vide. Ensuite, si l'expansion $(*D) égale à mySpecialDirectory, elle est entièrement remplacée par la chaîne vide et l'autre partie de $(if) s'évalué selon:

$(if condition,then-part[,else-part])

La fonction if prend en charge l'expansion conditionnelle dans un contexte fonctionnel (par opposition à la GNU makefile conditionnels comme ifeq (voir la syntaxe des conditions)

Le premier argument, condition, a d'abord tous les espaces avant et arrière supprimés, puis est développé. -empty chaîne, alors la condition est consi déifié pour être vrai. Si elle se développe en une chaîne vide, la condition est considérée comme fausse.

Notez le basculement dans ce hack entre le then-part et le else-part.

Espérons que cela aide!

+0

Merci beaucoup Gregory, c'est exactement ce que je voulais faire. Bonne explication, je n'aurais sans doute pas pensé à utiliser if et subst pour faire le tour, c'est assez malin;) – Kyone