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

277

Estoy tratando de depurar un problema de compilación, pero parece que no puedo obtener GCC (¿o tal vez es make ??) 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 gcccomando completo . El ejemplo anterior simplemente muestra cosas como "CCLD libvirt_parthelper". No estoy seguro de cómo controlar este comportamiento.

hernejj
fuente
¿Estás ejecutando un archivo MAKE, o simplemente un gcccomando?
Blender
20
Esto se parece a la salida de Kbuild o Autotools . Tratar make V=1.
jww

Respuestas:

275

Para invocar una ejecución en seco :

make -n

Esto mostrará lo que makeestá intentando hacer.

chrisaycock
fuente
31
Lo encontré :) make V = 1 Aunque la sugerencia anterior de "make -n" funcionó también. :) Gracias a todos por sus respuestas.
hernejj
76
La diferencia es que make -nno ejecuta los comandos. Así respuesta correcta esmake V=1
m-ric
20
make V=1solo funciona si el Makefile lo admite. Los makefiles de automake hacen eso, pero muchos otros no.
Larsr
53
Para CMake, use make VERBOSE=1; para autotools GNU make V=1.
Ruslan
10
@ m-ric si desea ejecutar realmente ejecute los comandos, considere make SHELL='sh -x': stackoverflow.com/a/32010960/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
175

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

Pero esto depende de cómo se generó el archivo MAKE.

La -dopción puede ayudar, pero le dará una salida extremadamente larga.

Gui13
fuente
6060
Nota: los Makefiles generados por CMake solo son compatibles VERBOSE=1, no V=1.
parpadeante
3
V = 1 funcionó para mí, compilando nuttx con mips-linux-gnu-gcc, gracias.
jcomeau_ictx
141

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 SHELLvariable especial para makey -xle indica shque imprima la línea expandida antes de ejecutarla.

Una ventaja sobre -nes que realmente ejecuta los comandos. He encontrado que para algunos proyectos (por ejemplo, el kernel de Linux) que -npuede 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 utilizará sea sh, que es el predeterminado que utiliza Make, ya que son POSIX, pero podría modificarse con la SHELLvariable make.

Hacerlo también sh -vsería genial, pero Dash 0.5.7 (Ubuntu 14.04 sh) ignora los -ccomandos (que parece ser cómo lo makeusa), por lo que no hace nada.

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

CMake generó Makefiles

make VERBOSE=1

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

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
11
Definitivamente la mejor respuesta que no depende de qué tan bien se escribió / generó el Makefile original
nodakai
2
Si alguien puede explicar el
voto negativo
make SHELL='$$SHELL -x'hará $SHELLliteral lo que no se evalúa. Usar make SHELL="$SHELL -x"funcionará.
Rick van der Zwet
1
esta es la mejor respuesta genérica, en contraste con algunas otras respuestas, esto no depende del uso de cmake
Mike76
2
make SHELL = 'sh -x' es super!
Jackie Yeh
22

Desde GNU Make versión 4.0, el --traceargumento es una buena manera de decir qué y por qué hace un archivo MAKE, generando líneas como:

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

o

makefile:12: update target 'foo' due to: bar
Julien Palard
fuente
1
Este argumento imprime información más detallada que la ejecución en seco. Es muy útil comprender los sistemas de creación que tienen procesos de compilación complejos como dpdk.
makerj
20

Utilizar make V=1

Otras sugerencias aquí:

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

  • make --debug=j - también funciona, pero también puede habilitar la construcción de subprocesos múltiples, lo que genera un rendimiento adicional

TarmoPikaro
fuente
44
make VERBOSE=1es para CMake. Sus pruebas fueron más probables con proyectos basados ​​en herramientas automáticas GNU.
Ruslan
12

Me gusta usar:

make --debug=j

Muestra los comandos que ejecuta:

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

--debug [= BANDERAS]

Imprima información de depuración además del procesamiento normal. Si se omiten las BANDERAS, el comportamiento es el mismo que si -dse especificara. Las BANDERAS pueden ser para todas las salidas de depuración (lo mismo que usar -d), bpara la depuración básica, vpara una depuración básica más detallada, ipara mostrar reglas implícitas, jpara detalles sobre la invocación de comandos y mpara la depuración mientras se rehacen los archivos MAKE.

Santiago Villafuerte
fuente
7

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

make AM_DEFAULT_VERBOSITY=1

Referencia: AM_DEFAULT_VERBOSITY

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

Ru Hasha
fuente