在执行之前让CMake打印命令

83

我正在处理一个在Linux下使用CMake构建的大型C++项目。 CMake运行正常,生成了模块和应用程序树中的大量Makefile文件。然而,运行GNU make时会导致链接器错误。我该如何让make在运行命令之前打印出精确的命令?

-d选项不会打印命令,但会输出大量无用信息。

-n选项会打印所有命令,但不会运行它们,所以我无法确定问题的具体位置。从make -n的stdout中检查,我没有看到任何相关的命令。我怀疑一些命令会根据先前命令的结果而改变,而且Makefile的层次结构使得很难确定发生了什么。

我在make的man页面中找不到其他有用的选项。


4个回答

103

我相信这个方法能够奏效:

make VERBOSE=1

您还可以将以下代码添加到您的CMakeLists.txt文件中,以永久设置它:

set(CMAKE_VERBOSE_MAKEFILE on)

这在CMake FAQ中有讲解。


4
好的,搞定了!下一个需要调试的问题是:为什么我在文档中找不到它? - DarenW
有没有办法可以自定义输出?例如,如果我想在编译和链接之间插入自定义的echo,比如echo“这是编译结束,现在我们将开始链接”... - infoclogged
1
我找到了答案 -> add_custom_command(TARGET yourtargetname POST_BUILD COMMAND echo "编译完成") - infoclogged

10

对于那些使用cmake --build命令的人,该命令会在内部调用make,可以使用以下任一选项:

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

请注意VERBOSE=1之前的--!这将参数传递给底层的make进程。
或者:
  $ VERBOSE=1 cmake --build <dir>

这也将通过环境变量向make传递VERBOSE=1,与之前相同。

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

  $ cmake --build <dir> --verbose

请注意参数的顺序!--verbose选项必须在--build及其参数之后提供。

6
一种适用于GNU make的选项,可与任何Makefile一起使用,无论是由CMake生成还是其他方式,就是使用--trace选项来进行。这将打印出make正在执行并仍然执行的命令。
这适用于所有命令,而不仅仅是在CMake/automake生成的makefile中通过VERBOSE=1V=1触发打印的命令。
在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方法获得该信息。

在Windows上与strace相当的工具是Process Monitor - Peter Mortensen

6

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

make V=1

9
不在话题上,问题是关于cmake而不是automake。 - Marcin Owsiany

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接