执行前制作CMake打印命令

时间:2011-01-26 18:20:00

标签: linux cmake gnu-make

我正在开发一个在Linux上使用CMake构建的大型C ++项目。 CMake运行正常,在模块和应用程序树中生成大量的Makefile。运行GNU make会导致链接器错误。如何在运行之前让make打印出确切的命令?

-d选项不会打印命令,但会提供大量无用的信息。

-n选项打印所有命令,但不运行它们,所以我不知道确切的问题是什么。从make -n检查stdout,我没有看到任何相关的命令。我怀疑某些命令会根据早期命令的结果而改变,而Makefiles的层次结构使得很难分辨出真正发生的事情。

我在make的 man 页面中看不到其他任何看似有帮助的选项。

4 个答案:

答案 0 :(得分:71)

我相信这会奏效:

make VERBOSE=1

您还应该能够将其添加到CMakeLists.txt中以永久设置:

set(CMAKE_VERBOSE_MAKEFILE on)

CMake FAQ

中介绍了这一点

答案 1 :(得分:8)

对于automake生成的Makefile,请尝试:

make V=1

答案 2 :(得分:2)

适用于GNU make并与任何Makefile一起使用的选项(无论是否由CMake生成)都可以使用--trace选项进行make。这将打印出make正在执行的命令,并仍然执行它们。

这适用于所有命令,而不仅仅是VERBOSE=1V=1触发在CMake / automake生成的makefile中打印的命令。

Linux上的另一种替代方法是在strace下运行make,例如strace -f -e trace=execve make <make options>。 strace的输出将包括执行的每个 进程:通过make,通过make ran编写的shell脚本等。

例如,您可能会发现CMake生成的makefile执行了/usr/bin/cmake -E __run_co_compile <lots of options ...>,但仍然想知道将依次运行的确切编译器调用是什么。您可以使用strace方法获得它。

答案 3 :(得分:0)

对于使用cmake --build(在内部调用make的用户),请使用以下任一方法:

  $ cmake --build <dir> -- VERBOSE=1

请注意--之前的VERBOSE=1!这样会将参数传递给基础的make进程。

或者:

  $ VERBOSE=1 cmake --build <dir>

这一次也通过环境变量将VERBOSE=1传递给make

或者,如果使用的是cmake 版本3.14 或更高版本:

  $ cmake --build <dir> --verbose

注意参数的顺序! --verbose选项必须位于--build及其参数之后。