如何获取CMake的详细输出?

5
我想调查一下为什么会出现这个错误:

$ cmake ..
-- The C compiler identification is unknown
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /cygdrive/c/Users/Ycr/Home/bin/arm-none-eabi-gcc
-- Check for working C compiler: /cygdrive/c/Users/Ycr/Home/bin/arm-none-eabi-gcc -- broken
CMake Error at /usr/share/cmake-3.6.2/Modules/CMakeTestCCompiler.cmake:61 (message):
  The C compiler "/cygdrive/c/Users/Ycr/Home/bin/arm-none-eabi-gcc" is not
  able to compile a simple test program.

很遗憾,在出现错误后:

  • 我不知道CMake做了什么,也没有执行命令的详细日志记录。
  • 在错误发生后,CMakeFiles/cmTC_e4aa4.dir已被清除,我无法自行探索问题。

如何调查这种错误呢?

我尝试使用--debug-trycompile选项。这次CMake创建了一个CMakeTmp文件夹,在没有错误的情况下完美完成。但是,我仍然有这个生成错误的CMakeFiles/cmTC_e4aa4.dir,即使使用该选项,CMake也会取消链接该文件夹。


可能是CMake,如何保留生成的临时文件?的重复问题。同时,请查看CMakeFiles\CMakeError.log文件并检查其中的错误信息。 - Florian
奇怪。CMakeError.log里面写了什么?再看一遍你的错误信息,这个编译器没有 工具链文件或者切换到静态库链接是行不通的(它无法编译可执行文件)。关于解决方案,请参见例如 如何部分禁用cmake C/C++自定义编译器检查 - Florian
我得到了这个:https://gist.github.com/nowox/e90b768126d3e2a8b49fb759505e55c0 - nowox
我的问题并不是输出,而是输入。我只想看看它执行了哪些命令。我觉得这是一个非常简单的请求,CMake应该能够做到。 - nowox
我已经看到了。我的问题更多的是在哪里可以获取完整的日志。 - nowox
显示剩余3条评论
2个回答

4

获取详细日志

CMake在开始时调用try_compile()来测试编译器,会在控制台上输出详细的错误信息,并将其写入到

[your binary output directory]/CMakeFiles/CMakeError.log

我再次检查了源代码,没有CMake选项可以为CMake的内部try_compile()调用提供更详细的输出。
你可以通过在主CMakeLists.txt中的project()调用之前添加一些variable_watch()调用来强制输出到标准输出。
variable_watch(__CMAKE_C_COMPILER_OUTPUT)
variable_watch(__CMAKE_CXX_COMPILER_OUTPUT)

保留临时文件

要保留 try_compile 的临时文件,请在 cmake 命令行中添加 --debug-trycompile

但请注意,开始时的多个编译器测试会覆盖先前测试的产物:

然而,它可能会改变 try-compiles 的结果,因为旧的垃圾文件可能会导致不同的测试通过或错误失败。最好一次只使用一个 try-compile,并且仅在调试时使用此选项。

参考资料


2
对我而言,即使使用--debug-trycompile,我的输出目录中的所有日志文件都没有包含try_compile()的有用信息。最终,我使用了OUTPUT_VARIABLE选项来捕获并打印输出,代码如下:
try_compile(<options> OUTPUT_VARIABLE TRY_COMPILE_OUTPUT)

message(WARNING ${TRY_COMPILE_OUTPUT})

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