在执行之前制作CMake打印命令


70

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

-d选项不会打印命令,但是很多信息并没有帮助。

-n选项显示所有命令,但不运行它们,因此我无法确定问题出在哪里。从make -n检查标准输出,我看不到任何相关的命令。我怀疑某些命令会根据早期命令的结果进行更改,而Makefile的层次结构使您很难分辨出实际情况。

我看不到make手册页中的其他选项似乎有用。


Answers:


86

我相当确定这会起作用:

make VERBOSE=1

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

set(CMAKE_VERBOSE_MAKEFILE on)

CMake常见问题解答对此进行了介绍。


4
是的,做到了!下一件要调试的事情:为什么我无法在文档中找到它?
2011年

有没有办法自定义输出?例如,如果我想在编译和链接之间插入自定义回声,例如echo“这是编译的结束,现在我们将开始链接” ...
infoclogged

1
我找到了答案-> add_custom_command(TARGET yourtargetname POST_BUILD COMMAND echo“ WE HAVE FINISHED
COMPILING

6

对于自动生成的Makefile,请尝试:

make V=1

6
不在主题上,问题是关于cmake,而不是automake。
Marcin Owsiany

4

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

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

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方法获得它。


在Windows上等效的straceProcess Monitor
彼得·莫滕森

1

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

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

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

要么:

  $ VERBOSE=1 cmake --build <dir>

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

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

  $ cmake --build <dir> --verbose

注意参数的顺序!该--verbose选项必须紧随其后--build

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.