Comment forcer make / GCC à me montrer les commandes?


277

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 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 ressembler à 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 gcccommande complete . L'exemple ci-dessus montre simplement des choses comme "CCLD libvirt_parthelper". Je ne sais pas comment contrôler ce comportement.


gccExécutez -vous un makefile ou simplement une commande?
Blender

20
Cela ressemble à la sortie de Kbuild ou Autotools . Essayez make V=1.
2016

Réponses:


275

Pour invoquer un essai à sec :

make -n

Cela montrera ce que vous makeessayez de faire.


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

76
La différence est qu'il make -nn'exécute pas les commandes. Ainsi, la bonne réponse estmake V=1
m-ric

20
make V=1ne fonctionne que si le Makefile le prend en charge. Les makefiles d'automake le font, mais beaucoup d'autres non.
larsr

53
Pour CMake, utilisez make VERBOSE=1; pour les autotools GNU make V=1.
Ruslan

10
@ m-ric si vous voulez réellement exécuter les commandes, pensez à make SHELL='sh -x': stackoverflow.com/a/32010960/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

175

Les makefiles de bibliothèque, qui sont générés par les outils automatiques (ceux que ./configurevous devez émettre) ont souvent une option détaillée, donc en gros, utiliser make VERBOSE=1ou make V=1devrait vous donner les commandes complètes.

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

L' -doption pourrait aider, mais elle vous donnera une sortie extrêmement longue.


60
Remarque: les Makefiles générés par CMake prennent uniquement en charge VERBOSE=1, non V=1.
blinry

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

141

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

make SHELL='sh -x'

est une autre option. Échantillon Makefile:

a:
    @echo a

Production:

+ echo a
a

Cela définit la SHELLvariable spéciale pour make, et -xindique shd'imprimer la ligne développée avant de l'exécuter.

Un des avantages -nest qu'il exécute les commandes. J'ai constaté que pour certains projets (par exemple, le noyau Linux) qui -npeuvent 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 shcelui par défaut utilisé par Make car ils sont POSIX, mais pourrait être modifié avec la SHELLvariable make.

Faire sh -vserait aussi cool, mais Dash 0.5.7 (Ubuntu 14.04 sh) ignore les -ccommandes (ce qui semble être la façon dont makeil l'utilise) donc il ne fait rien.

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

Makefiles générés par CMake

make VERBOSE=1

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


11
Certainement la meilleure réponse qui ne dépend pas de la façon dont le Makefile original a été écrit / généré
nodakai

2
Si quelqu'un peut expliquer le downvote, faites le moi savoir afin que je puisse apprendre et améliorer les informations ;-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

make SHELL='$$SHELL -x'rendra $SHELLlittéral qui n'est pas évalué. L'utilisation make SHELL="$SHELL -x"fonctionnera.
Rick van der Zwet

1
c'est la meilleure réponse générique, contrairement à certaines autres réponses, cela ne dépend pas de l'utilisation de cmake
Mike76

2
make SHELL = 'sh -x' est super!
Jackie Yeh

22

Depuis GNU Make version 4.0, l' --traceargument est un bon moyen de dire quoi et pourquoi un makefile fait, en sortant des lignes comme:

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

ou

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

1
Cet argument imprime des informations plus détaillées que le dry run. Il est très utile de comprendre les systèmes make qui ont un processus de construction complexe comme dpdk.
makerj

20

Utilisation 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 exempleCC source.cpp

  • make --debug=j - fonctionne également, mais peut également activer la construction multithread, provoquant une sortie supplémentaire.


4
make VERBOSE=1est pour CMake. Vos essais étaient très probablement avec des projets basés sur GNU autotools.
Ruslan

12

J'aime utiliser:

make --debug=j

Il montre les commandes qu'il exécute:

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

--debug [= FLAGS]

Imprimez les informations de débogage en plus du traitement normal. Si les FLAGS sont omis, le comportement est le même que si a -dété spécifié. FLAGS peut être un pour toutes les sorties de débogage (identique à l'utilisation -d), bpour le débogage de base , pour un débogage de base vplus détaillé, ipour afficher des règles implicites, jpour des détails sur l'appel de commandes et mpour le débogage lors de la refonte de makefiles.


7

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=1cela ne fonctionnait pas pour moi.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.