web-dev-qa-db-fra.com

Comment forcer make / GCC à me montrer les commandes?

J'essaie de déboguer un problème de compilation, mais je n'arrive pas à obtenir que GCC (ou peut-être que ce soit make ??) me montre les commandes réelles du compilateur et de l'éditeur de liens 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 semblable à 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

Notez que la commande complète gcc est affichée dans cet exemple. L'exemple ci-dessus montre simplement des choses comme "CCLD libvirt_parthelper". Je ne sais pas comment contrôler ce comportement.

228
hernejj

Pour invoquer un cycle d'essai:

make -n

Cela montrera ce que make tente de faire.

237
chrisaycock

Les makefiles de bibliothèque, qui sont générés par autotools (le ./configure que vous devez utiliser) ont souvent une option prolixe, aussi utilisez-vous make VERBOSE=1 ou make V=1 pour 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 obtiendrez une sortie extrêmement longue.

151
Gui13

Construire une méthode indépendante du système

make Shell='sh -x'

est une autre option. Exemple Makefile:

a:
    @echo a

Sortie:

+ echo a
a

Ceci définit la variable spéciale Shell pour make et -x indique à sh d’imprimer la ligne développée avant de l’exécuter.

Un avantage sur -n est qu’il exécute les commandes. J'ai constaté que pour certains projets (par exemple, le noyau Linux), -n pouvait cesser de s'exécuter beaucoup plus tôt que d'habitude, probablement à cause 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, celui utilisé par défaut par Make car ils sont POSIX, mais qui pourrait être modifié avec le Shell make variable.

Faire sh -v serait bien aussi, mais Dash 0.5.7 (Ubuntu 14.04 sh) ignore les commandes -c (ce qui semble être la façon dont make l'utilise) ne fait rien.

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

Créer des Makefiles

make VERBOSE=1

Voir: tiliser CMake avec GNU Make: Comment puis-je voir les commandes exactes?

Depuis GNU Make version 4.0, l'argument --trace est un moyen agréable de dire ce que fait un makefile et pourquoi il le fait, en affichant des lignes telles que:

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

ou

makefile:12: update target 'foo' due to: bar
17
Julien Palard

Utilisez make V=1

Autres suggestions ici:

  • make VERBOSE=1 - n'a pas fonctionné au moins de mes essais.
  • make -n - affiche uniquement l'opération logique, pas la ligne de commande en cours d'exécution. Par exemple. CC source.cpp

  • make --debug=j - fonctionne également, mais peut également permettre la construction multithread, générant une sortie supplémentaire.

13
TarmoPikaro

J'aime utiliser:

make --debug=j

Il montre les commandes qu'il exécute:

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

--debug [= FLAGS]

Imprimer les informations de débogage en plus du traitement normal. Si les drapeaux sont omis, le comportement est le même que si -d était spécifié. FLAGS peut être une sortie pour toutes les sorties de débogage (comme pour -d), b pour le débogage de base, v pour un débogage de base plus détaillé, i pour afficher des règles implicites j pour plus de détails sur l'invocation de commandes , et m pour le débogage lors de la reconstruction de fichiers Make.

5

Selon votre version d'automake, vous pouvez également utiliser ceci:

make AM_DEFAULT_VERBOSITY=1

Référence: AM_DEFAULT_VERBOSITY

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

4
Ru Hasha