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.
Très belle réponse. Merci! – pic11