执行前制作CMake打印命令

Dar*_*enW 60 linux cmake gnu-make

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

-d选项不会打印命令,但是大量信息没有帮助.

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

我在make的手册页中看不到其他任何看起来有用的选项.

Bil*_*nch 73

我相信这会奏效:

make VERBOSE=1
Run Code Online (Sandbox Code Playgroud)

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

set(CMAKE_VERBOSE_MAKEFILE on)
Run Code Online (Sandbox Code Playgroud)

这在CMake FAQ中有所介绍.

  • 是的,做到了!接下来要调试:为什么我不能在文档中找到它? (3认同)

Sco*_*eak 10

对于那些使用内部cmake --build调用的make,请使用:

  $ cmake --build <dir> -- VERBOSE=1
Run Code Online (Sandbox Code Playgroud)

注意--前面的VERBOSE=1!这会将参数传递给底层make进程。

或者:

  $ VERBOSE=1 cmake --build <dir>
Run Code Online (Sandbox Code Playgroud)

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

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

  $ cmake --build <dir> --verbose
Run Code Online (Sandbox Code Playgroud)

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


k10*_*107 7

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

make V=1
Run Code Online (Sandbox Code Playgroud)

  • 不在主题上,问题是关于cmake,而不是automake。 (4认同)

Tre*_*ntP 6

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

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

Linux 上的另一种选择是在strace下运行 make ,如strace -f -e trace=execve make <make options>. strace 的输出将包括执行的每个进程:通过 make、通过 make 运行的 shell 脚本等。

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