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.
7 réponses
pour invoquer un dry run :
make -n
cela montrera ce que make
tente de faire.
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.
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?
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
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.
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.
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.