it-swarm-es.com

¿Cómo fuerzo a make/gcc para que me muestre los comandos?

Estoy tratando de depurar un problema de compilación, pero parece que no consigo que GCC (o tal vez esté hecho?) Para mostrarme los comandos reales del compilador y el enlazador que está ejecutando. Aquí está la salida que estoy viendo:

  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

Lo que quiero ver debería ser similar a esto:

$ 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

Observe cómo este ejemplo muestra el comando gcc completo. El ejemplo anterior simplemente muestra cosas como "CCLD libvirt_parthelper". No estoy seguro de cómo controlar este comportamiento.

214
hernejj

Para invocar un funcionamiento en seco :

make -n

Esto mostrará lo que make está intentando hacer.

223
chrisaycock

Los archivos make de la biblioteca, que son generados por autotools (el ./configure que debe emitir) a menudo tienen una opción detallada, por lo que básicamente, usar make VERBOSE=1 o make V=1 debería darle los comandos completos.

Pero esto depende de cómo se generó el makefile.

La opción -d puede ayudar pero le dará una salida extremadamente larga.

146
Gui13

Construir método independiente del sistema

make Shell='sh -x'

es otra opción. Muestra Makefile:

a:
    @echo a

Salida:

+ echo a
a

Esto establece la variable Shell especial para make, y -x le dice a sh que imprima la línea expandida antes de ejecutarla.

Una ventaja sobre -n es que en realidad ejecuta los comandos. He encontrado que para algunos proyectos (por ejemplo, kernel de Linux), -n puede dejar de ejecutarse mucho antes de lo habitual, probablemente debido a problemas de dependencia.

Una desventaja de este método es que debe asegurarse de que el Shell que se usará sea sh, que es el predeterminado que utiliza Make, ya que son POSIX, pero que podría cambiarse con la variable Shell make.

Hacer sh -v también sería genial, pero Dash 0.5.7 (Ubuntu 14.04 sh) ignora los comandos -c (que parece ser cómo make lo usa), por lo que no hace nada.

make -p también le interesará, que imprime los valores de las variables establecidas.

CMake generó Makefiles

make VERBOSE=1

Consulte: Uso de CMake con GNU Marca: ¿Cómo puedo ver los comandos exactos?

Dado que GNU Make versión 4.0, el argumento --trace es una buena forma de decir qué y por qué hace un makefile, generando líneas como:

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

o

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

Usa make V=1

Otras sugerencias aquí:

  • make VERBOSE=1 - no funcionó al menos desde mis pruebas.
  • make -n - muestra solo la operación lógica, no la línea de comandos que se está ejecutando. P.ej. CC source.cpp

  • make --debug=j - también funciona, pero también puede habilitar la creación de varios subprocesos, lo que provoca una salida extra.

8
TarmoPikaro

Dependiendo de su versión automake, también puede usar esto:

make AM_DEFAULT_VERBOSITY=1

Referencia: https://lists.gnu.org/archive/html/bug-autoconf/2012-01/msg00007.html

Nota: Agregué esta respuesta ya que V=1 no funcionó para mí.

4
Ru Hasha

Me gusta usar:

make --debug=j

Muestra los comandos que ejecuta:

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

--debug [= FLAGS] Imprime información de depuración además del procesamiento normal. Si se omiten los FLAGS, entonces el comportamiento es el mismo que si se especificara -d. FLAGS puede ser una para toda la salida de depuración (igual que usar -d), b para la depuración básica, v para una depuración básica más detallada, i para mostrar reglas implícitas, j para detalles sobre la invocación de comandos y m para depurar mientras rehace makefiles.

2