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!
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