Hacer comandos CMake print antes de ejecutar


Estoy trabajando en un gran proyecto de C++ construido con CMake en Linux. CMake funciona bien, produciendo una horda de Makefiles en el árbol de módulos y aplicaciones. Ejecutar GNU make conduce a errores en el enlazador. ¿Cómo puedo hacer que make imprima los comandos exactos antes de ejecutarlos?

La opción-d no imprime los comandos, sino mucha información que no ha sido útil.

La opción-n imprime todos los comandos, pero no los ejecuta, por lo que no puedo decir si fue exactamente el problema ser. Examinando la salida estándar de make-n, no veo ningún comando que sea relevante. Sospecho que algunos comandos cambian dependiendo de los resultados de comandos anteriores, y la jerarquía de Makefiles hace que sea difícil decir lo que realmente está pasando.

No veo ninguna otra opción en la página de make man que parezca útil.

Author: Peter Mortensen, 2011-01-26

3 answers

Bastante seguro de que esto funcionará:

make VERBOSE=1

También debería poder agregar esto a sus listas de CMakeLists.txt para establecer permanentemente eso.

set(CMAKE_VERBOSE_MAKEFILE on)

Esto está cubierto en el CMake FAQ.

 62
Author: Bill Lynch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-31 16:09:51

Para los Makefiles generados por automake, intente:

make V=1
 8
Author: k107,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-03 18:17:36

Una opción, que se aplica a GNU make y funciona con cualquier Makefile, ya sea generado por CMake o no, es usar la opción --trace para make. Esto imprimirá los comandos make que se están ejecutando y que aún se ejecutan.

Esto se aplica a todos los comandos, no solo a aquellos que VERBOSE=1 o V=1 activan la impresión de los makefiles generados en CMake/automake.

Y otra alternativa en Linux es ejecutar make bajo strace, como strace -f -e trace=execve make <make options>. La salida de strace incluirá cada proceso que es ejecutado, por make, por un script de shell que make ran, etc.

Por ejemplo, puede encontrar que el makefile generado por CMake ejecuta /usr/bin/cmake -E __run_co_compile <lots of options ...> y todavía se pregunta cuáles son las invocaciones exactas del compilador que a su vez se ejecutarán. Puedes conseguirlo con el método Strace.

 1
Author: TrentP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-03 18:17:10