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 à obtenir GCC (ou peut-être que c'est make??) pour me montrer les commandes de compilateur et de linker qu'il exécute. Voici la sortie 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 comment cet exemple affiche la commande complète gcc. L'exemple ci-dessus montre simplement des choses comme "CCLD libvirt_parthelper". Je ne suis pas sûr de savoir comment contrôle ce comportement.

185
demandé sur smci 2011-04-28 18:35:17

7 réponses

pour invoquer un dry run :

make -n

cela montrera ce que make tente de faire.

192
répondu chrisaycock 2017-01-08 04:43:25

makefiles de bibliothèque, qui sont générés par autotools (le ./configure vous devez émettre) ont souvent une option verbeuse, donc fondamentalement, en utilisant make VERBOSE=1 ou 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é.

l'option -d peut vous aider mais vous donnera une sortie extrêmement longue.

139
répondu Gui13 2013-08-27 04:02:48

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

make SHELL='sh -x'

est une autre option. Échantillon Makefile :

a:
    @echo a

sortie:

+ echo a
a

définit la variable spéciale SHELL pour make , et -x indique sh pour imprimer la ligne étendue avant de l'exécuter.

un avantage par rapport à -n est qu'il fonctionne effectivement le commande. J'ai trouvé que pour certains projets (par exemple le noyau Linux) que -n peut arrêter d'exécuter beaucoup plus tôt que d'habitude probablement en raison de problèmes de dépendance.

un des inconvénients de cette méthode est que vous devez vous assurer que le shell qui sera utilisé est sh , qui est celui par défaut utilisé par Make car ils sont POSIX, mais pourrait être modifié avec la variable SHELL make.

Faire sh -v serait cool, mais Dash 0.5.7 (Ubuntu 14.04 sh ) ignore pour les commandes -c (qui semble être la façon dont make l'utilise) de sorte qu'il ne fait rien.

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

CMake Makefiles générés

make VERBOSE=1

voir: en utilisant CMake avec GNU Make: Comment puis-je voir les commandes exactes?

98

depuis la version 4.0 de GNU Make, l'argument --trace est une bonne façon de dire ce que fait et pourquoi un makefile, en sortant des lignes comme:

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

ou

makefile:12: update target 'foo' due to: bar
15
répondu Julien Palard 2017-05-09 12:15:50

en fonction de votre version automake, vous pouvez aussi utiliser ceci:

make AM_DEFAULT_VERBOSITY=1

référence: https://lists.gnu.org/archive/html/bug-autoconf/2012-01/msg00007.html

Note: j'ai ajouté cette réponse car V=1 ne fonctionnait pas pour moi.

3
répondu Ru Hasha 2018-05-18 10:49:27

j'aime à utiliser:

make --debug=j

il affiche les commandes qu'il exécute:

https://linux.die.net/man/1/make

--debug [=FLAGS] Imprimer des informations de débogage en plus du traitement normal. Si les options sont omises, le comportement est le même que si-d a été spécifié. Les options peuvent être a pour toutes les sorties de débogage (même qu'en utilisant -d), b pour le débogage de base, v pour le débogage de base plus verbeux, i pour afficher les règles implicites, J pour plus de détails sur l'invocation des commandes , et m pour déboguer pendant le remaking des makefiles.

2
répondu Santiago Villafuerte 2018-04-02 15:45:23

Utiliser make V=1

autres suggestions ici:

  • make VERBOSE=1 - ça n'a pas marché du moins depuis mes épreuves.
  • make -n - affiche seulement l'opération logique, pas la ligne de commande étant exécutée. Par exemple: CC source.cpp

  • make --debug=j - fonctionne aussi bien, mais pourrait également permettre la construction multi threaded, provoquant une sortie supplémentaire.

1
répondu TarmoPikaro 2018-06-22 21:39:01