con - ¿Cómo fuerzo a make/gcc para que me muestre los comandos?
compilar en cmd con gcc (7)
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í.
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 comando gcc completo. El ejemplo anterior simplemente muestra cosas como "CCLD libvirt_parthelper". No estoy seguro de cómo controlar este comportamiento.
Desde la versión 4.0 de GNU Make, 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
Los archivos make de la biblioteca, que son generados por autotools (el ./configure
que debe emitir) a menudo tienen una opción detallada, así 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.
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 para todos los resultados de depuración (igual que usar -d), b para depuración básica, v para 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 al rehacer archivos MAKE.
Para invocar un recorrido en seco :
make -n
Esto mostrará lo que la make
está intentando hacer.
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. Por ejemplo,CC source.cpp
make --debug=j
- también funciona, pero también puede habilitar la creación de subprocesos múltiples, lo que provoca una salida extra.
Método independiente del sistema de construcción
make SHELL=''sh -x''
Es otra opción. Muestra de 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) que -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 es POSIX, pero que se puede cambiar con la variable make de SHELL
.
Hacer sh -v
sería genial, pero Dash 0.5.7 (Ubuntu 14.04 sh
) ignora los comandos -c
(que parece ser la forma en que make
usa), por lo que no hace nada.
make -p
también te interesará, que imprime los valores de las variables establecidas.
CMake genera makefiles
make VERBOSE=1
Consulte: Uso de CMake con GNU Make: ¿Cómo puedo ver los comandos exactos?