381 votes

Comment puis-je forcer make/GCC à me montrer les commandes ?

J'essaie de déboguer un problème de compilation, mais je n'arrive pas à faire en sorte que GCC (ou peut-être make ??) m'indique les commandes de compilation et d'édition de liens qu'il exécute.

Voici le résultat que je vois :

  CCLD   libvirt_parthelper
libvirt_parthelper-parthelper.o: In function `main':
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:102: undefined reference to `ped_device_get'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:116: undefined reference to `ped_disk_new'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:122: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
collect2: ld returned 1 exit status
make[3]: *** [libvirt_parthelper] Error 1

Ce que je veux voir devrait être similaire à ceci :

$ make
gcc -Wall   -c -o main.o main.c
gcc -Wall   -c -o hello_fn.o hello_fn.c
gcc   main.o hello_fn.o   -o main

Remarquez que cet exemple a l'intégralité gcc commande affichée. L'exemple ci-dessus affiche simplement des choses comme "CCLD libvirt_parthelper". Je ne sais pas comment contrôler ce comportement.

0 votes

Est-ce que vous utilisez un makefile, ou juste un gcc commande ?

29 votes

Cela ressemble à Kbuild o Autotools sortie. Essayez make V=1 .

1 votes

364voto

chrisaycock Points 12900

Pour invoquer un essai à sec :

make -n

Cela montrera ce que make tente de faire.

39 votes

J'ai trouvé :) make V=1 Bien que la suggestion ci-dessus de "make -n" ait également fonctionné :) Merci à tous pour vos réponses.

91 votes

La différence est que make -n n'exécute pas les commandes. La réponse correcte est donc make V=1

26 votes

make V=1 ne fonctionne que si le Makefile le supporte. Les makefiles d'automake le font, mais beaucoup d'autres ne le font pas.

225voto

Ciro Santilli Points 3341

Méthode indépendante du système de construction

make SHELL='sh -x'

est une autre option. Exemple Makefile :

a:
    @echo a

Sortie :

+ echo a
a

Cela permet d'établir le programme spécial SHELL variable pour make et -x dit à sh pour imprimer la ligne développée avant de l'exécuter.

Un avantage par rapport à -n est qu'il exécute réellement les commandes. J'ai constaté que pour certains projets (par exemple le noyau Linux) que -n peut cesser de fonctionner beaucoup plus tôt que d'habitude, probablement en raison de problèmes de dépendance.

Un inconvénient de cette méthode est que vous devez vous assurer que le shell qui sera utilisé est sh qui est celle utilisée par défaut par Make car elle est POSIX, mais qui peut être modifiée avec la directive SHELL faire une variable.

Faire sh -v serait cool aussi, mais Dash 0.5.7 (Ubuntu 14.04) sh ) ignore pour -c (ce qui semble être la façon dont make l'utilise) donc ça ne sert à rien.

make -p vous intéressera également, qui imprime les valeurs des variables définies.

Les Makefiles générés par CMake supportent toujours VERBOSE=1

Comme dans :

mkdir build
cd build
cmake ..
make VERBOSE=1

Question dédiée à : Utilisation de CMake avec GNU Make : Comment puis-je voir les commandes exactes ?

212voto

Gui13 Points 3568

Les makefiles de la bibliothèque, qui sont générés par autotools (le fichier ./configure que vous devez émettre) disposent souvent d'une option "verbose", de sorte que, fondamentalement, l'utilisation de l'option make VERBOSE=1 o make V=1 devrait vous donner les commandes complètes.

Mais cela dépend de la façon dont le makefile a été généré.

El -d pourrait vous aider, mais elle vous donnera une sortie extrêmement longue.

70 votes

Note : les Makefiles générés par CMake ne supportent que VERBOSE=1 pas V=1 .

4 votes

V=1 a fonctionné pour moi, en compilant nuttx avec mips-linux-gnu-gcc, merci.

37voto

Julien Palard Points 1157

Depuis la version 4.0 de GNU Make, l'option --trace est un bon moyen de dire ce que fait un makefile et pourquoi, en affichant des lignes comme :

makefile:8: target 'foo.o' does not exist

o

makefile:12: update target 'foo' due to: bar

29voto

TarmoPikaro Points 11

Utilice make V=1

Autres suggestions ici :

  • make VERBOSE=1 - n'a pas fonctionné, du moins d'après mes essais.

  • make -n - affiche uniquement l'opération logique, et non la ligne de commande en cours d'exécution. Par exemple CC source.cpp

  • make --debug=j - fonctionne aussi bien, mais peut aussi permettre la construction multi-filière, provoquant une sortie supplémentaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X