web-dev-qa-db-fra.com

Vérifier si les variables sont définies dans un makefile

J'ai un GNU Makefile (version 3.81) qui ressemble à ceci:

.PHONY: SPOneDot

SPOneDot:
    ifndef X
    X=0.05
    $$(info X undefined, changed to $X)
    endif
    ifndef Y
    Y=0.05
    $$(info Y undefined, changed to $Y)
    endif
    python ./Submit3DSP.py -f OneDot.qdt -x $(X) -y $(Y)

J'exécute avec la ligne de commande suivante: make X=0.1 Y=0.1 SPOneDot mais j'obtiens le résultat suivant:

ifndef X
make: ifndef: Command not found
make: *** [SPOneDot] Error 127

J'ai regardé dans la documentation makefile et vu d'autres l'utilisent . Toute aide est appréciée, c'est probablement quelque chose de stupide.

18
Troy Rockwood

Il est fort probable que vos directives make ne doivent pas être en retrait de tabulation mais commencent dans la première colonne. Je soupçonne également que vous voulez .if(...) ou similaire, pas simple ifdef. Il est difficile de dire sans savoir quelle implémentation make vous utilisez.

Dans GNU make, les parties conditionnelles sont utilisées par exemple comme ceci

ifeq ($(CC),gcc)
        $(CC) -o foo $(objects) $(libs_for_gcc)
else
        $(CC) -o foo $(objects) $(normal_libs)
endif

Le GNU make manual a tous les détails.

Si vous voulez vraiment tester une variable d'environnement (par opposition à une variable make variable ), faites-le simplement dans les commandes:

SPOneDot:
    if test -z "$$X"; then X=0.05; echo "X undefined, changed to $$X"; fi; \
    if test -z "$$Y"; then Y=0.05; echo "Y undefined, changed to $$Y"; fi; \
    python ./Submit3DSP.py -f OneDot.qdt -x $$X -y $$Y

Notez que $$ est transmis au shell sous la forme d'un seul $ et tout doit être une seule commande pour le Shell, d'où les points-virgules et la barre oblique inverse/les nouvelles lignes.

21
Jens

Si la ligne commence par un onglet, elle sera considérée comme faisant partie d'une recette pour une règle. Les espaces supplémentaires sont autorisés et ignorés au début de la ligne de directive conditionnelle, mais aucun onglet n'est autorisé.

4
frido