2011-04-20 3 views

Répondre

6

Les commandes des règles makefile sont simplement transmises au shell. Cette règle fonctionne:

libmylib.a: ... 
    $(AR) $(ARFLAGS) $@ $? 

mais celui-ci ne sera pas:

libmylib.a: ... 
    "$(AR) $(ARFLAGS) [email protected] $?" 

La seconde ne fonctionnera pas parce que vous n'avez probablement pas une seule commande appelée, par exemple, même si vous ar -r libx.a a.o b.o avez une commande ar qui sait quoi faire avec la liste d'arguments -r libx.a a.o b.o.

Votre deuxième exemple:

@echo Compiler: $(CXX) 
# vs 
@echo "Compiler: $(CXX)" 

est un peu différent parce que les guillemets sont autour de l'argument de la coque intégrée echo donc ces deux règles:

rule1: 
    @echo Compiler: $(CXX) 

rule2: 
    echo "Compiler: $(CXX)" 

produirait généralement les mêmes sortie (à moins, bien sûr, que vous ayez une commande bizarre de compilateur C++ qui avait, par exemple, un ">" dans son nom et, dans ce cas, la sortie désirée serait un coup de tête à celui qui a appelé votre compilateur C++ c'est au-delà des capacités de même GNU m ake). D'autre part, ces deux règles produiraient une sortie un peu différente en raison de l'interaction entre les citations et les espaces blancs:

rule3: 
    @echo Compiler:   $(CXX) 

rule4: 
    echo "Compiler:   $(CXX)" 

Règle3 ferait la même chose que règle1 mais rule4 imprimerait une chaîne avec un tas d'espaces au milieu.

+0

Très belle réponse. Merci! – pic11

Questions connexes