2017-10-02 3 views
0

Je voulais tester quelques expressions du genre ifeq qui exécutent une commande shell que je lis quelque part, j'ai donc écrit ce petit mymakefile (toutes les lignes étant en retrait avec un onglet):Expressions en cours (sans compilation de fichiers) dans Makefile sans cibles?

ifeq ($(shell echo test 2>/dev/null; echo $$?),0) 
      $(info I am inside) 
    endif 

... et je essayé de l'exécuter:

$ make -f mymakefile 
make: *** No targets. Stop. 

Comment pourrais-je tester des expressions comme ça dans leur propre fichier makefile? Ai-je besoin de définir une cible par défaut, ou non? Et comment les commandes devraient-elles être formatées (indentées avec une tabulation, ou espace, ou pas indentées du tout?)

Répondre

0

Eh bien, j'ai quelque part - apparemment, il faut spécifier une cible; mais puisque je suis un noob make, j'aimerais voir une réponse plus qualifiée.

Je trouve ce lien https://www.gnu.org/software/make/manual/html_node/Conditional-Example.html qui m'a donné un soupçon .. De toute façon, c'est mymakefile maintenant:

 
.PHONY: default 
default: mytarget; 

ifeq ($(shell echo test 2>/dev/null; echo $$?),0) 
$(info I am inside) 
else 
$(info I am outside) 
endif 

mytarget: 
\t (TAB) echo A 

Ainsi, le mytarget ici est juste un mannequin qui fait simplement un echo A; L'exécution de cette impression:

$ make -f mymakefile 
I am outside 
echo A 
A 

Si vous ne voulez pas le echo A imprimé, supprimons avec au signe: @echo A.

La ligne echo A doit être indentée avec un TAB - sinon erreur "mymakefile:11: *** missing separator. Stop.". Bizarrement, si j'indente les deux lignes $(info... avec un TAB, alors "I am outside" est imprimé en dernier (?!), Mais quand ils ne sont pas en retrait (ou en retrait avec des espaces), alors il est imprimé en premier (selon l'ordre dans le fichier).