【问题标题】:Making CMake print commands before executing在执行之前制作 CMake 打印命令
【发布时间】:2011-06-16 01:12:33
【问题描述】:

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

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

-n 选项打印所有命令,但不运行它们,所以我不知道问题到底出在哪里。从 make -n 检查标准输出,我没有看到任何相关的命令。我怀疑某些命令会根据之前命令的结果而改变,而且 Makefile 的层次结构让人很难判断到底发生了什么。

我在 make 的 man 页面中没有看到任何其他看起来有用的选项。

【问题讨论】:

标签: linux cmake gnu-make


【解决方案1】:

我很确定这会奏效:

make VERBOSE=1

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

set(CMAKE_VERBOSE_MAKEFILE on)

CMake FAQ 对此进行了介绍。

【讨论】:

  • 是的,做到了!接下来要调试的事情:为什么我无法在文档中找到它?
  • 有没有办法,我可以自定义输出?例如,如果我想在编译和链接之间插入自定义回显,例如回显“这是编译结束,现在我们将开始链接”...
  • 我找到了答案 -> add_custom_command(TARGET yourtargetname POST_BUILD COMMAND echo "WE HAVE FINISHED COMPILING")
【解决方案2】:

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

make V=1

【讨论】:

  • 不是主题,问题是关于 cmake,而不是 automake。
【解决方案3】:

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

这适用于所有命令,而不仅仅是那些VERBOSE=1V=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 方法获得它。

【讨论】:

【解决方案4】:

对于那些使用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 及其参数之后。

【讨论】:

    猜你喜欢
    • 2012-06-15
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2012-02-28
    相关资源
    最近更新 更多