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.

hernejj
la source
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.

chrisaycock
la source
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.

Gui13
la source
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?

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
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
Julien Palard
la source
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.

TarmoPikaro
la source
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.

Santiago Villafuerte
la source
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.

Ru Hasha
la source