有没有办法检查cmake在失败的运行中正在做什么?例如,我有一个程序取决于libbacktrace,我可以链接到gcc foo.c -lbacktrace.但是当我写一个CMakeLists.txt喜欢的
cmake_minimum_required(VERSION 2.8)
find_library (BACKTRACE_LIBRARY backtrace)
message (BACKTRACE_LIBRARY=${BACKTRACE_LIBRARY})
Run Code Online (Sandbox Code Playgroud)
和打字cmake <path>,打印出来BACKTRACE_LIBRARY=BACKTRACE_LIBRARY-NOTFOUND.
我该如何找出问题所在?cmake在放弃查找libbacktrace之前执行了哪些命令?它正在执行任何事情吗?在autoconf中,命令都记录在其中config.log,但CMakeOutput.log在这种情况下是空白的.同样,cmake --trace只回显CMakeLists.txt一堆系统cmake文件之后的内容,在这种情况下这是无用的.
请注意,我不是在寻找一种方法来进行这种特殊的find_library工作调用- 这只是一个例子.我的问题是:我有一个没有按预期工作的CMakeLists.txt; 有哪些工具可以帮助我弄清楚它失败的地点和原因?
我们正在努力改进CMake生产的makefile.对于Clang,GCC和ICC,我们想补充一下-march=native.这样做的块看起来像:
# -march=native for GCC, Clang and ICC on i386, i486, i586, i686 and x86_64.
message(STATUS, "1")
message(STATUS, "Compiler: x${CMAKE_CXX_COMPILER_ID}x")
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
message(STATUS, "2")
message(STATUS, "Machine: x${UNAME_MACHINE}x")
if (("${UNAME_MACHINE}" MATCHES "i.86") OR ("${UNAME_MACHINE}" STREQUAL "x86_64"))
message(STATUS, "3")
if (CMAKE_VERSION VERSION_LESS 2.8.12)
add_definitions(-march=native)
else()
add_compile_options(-march=native)
endif()
endif()
endif()
Run Code Online (Sandbox Code Playgroud)
消息语句显示机器字符串来自uname具有尾随换行符:
STATUS,1
STATUS,Compiler: xGNUx
STATUS,2
STATUS,Machine: xx86_64
x
Run Code Online (Sandbox Code Playgroud)
要生产的块UNAME_MACHINE是:
# We need the output 'uname -m' for …Run Code Online (Sandbox Code Playgroud) 我想调查一下为什么会出现这个错误:
$ 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.
Run Code Online (Sandbox Code Playgroud)
不幸的是,错误发生后:
CMakeFiles/cmTC_e4aa4.dir被清理,因此我无法自己探索该问题。我应该如何调查这样的错误?
我尝试使用该--debug-trycompile选项。这次 CMake 创建了一个CMakeTmp文件夹,完美无误。但是,我仍然有这个CMakeFiles/cmTC_e4aa4.dir生成错误,甚至使用 CMake 选项取消文件夹链接。
我从cmake得到一些奇怪的错误:
loading initial cache file ../../Tweaks/compiler-rt/arm.txt
-- Performing Test COMPILER_RT_HAS_FPIE_FLAG
CMake Error at CMakeLists.txt:2 (set):
Syntax error in cmake code at
D:/Work/AcSo/Views/llvmSecond/build-arm/compiler-rt/CMakeFiles/CMakeTmp/CMakeLists.txt:2
when parsing string
D:/Work/AcSo/Views/llvmSecond/llvm/projects/compiler-rt/cmake;D:/Work/AcSo/Views/llvmSecond/llvm/projects/compiler-rt/cmake/Modules;D:/Work/AcSo/Views/llvmSecond/llvm/cmake;D:\Work\AcSo\Views\llvmSecond\build-host\Release\lib\cmake\llvm
Invalid character escape '\W'.
CMake Error: Internal CMake error, TryCompile configure of cmake failed
-- Configuring incomplete, errors occurred!
See also "D:/Work/AcSo/Views/llvmSecond/build-arm/compiler-rt/CMakeFiles/CMakeOutput.log".
Run Code Online (Sandbox Code Playgroud)
我能理解的是它以某种方式得到了一个Windows路径,然后抱怨\W字符序列.实际上我已经尽我所能给cmake Linux路径.所以我不知道Windows路径的来源.这个错误似乎没什么关系CMakeOutput.log
我想从cmake获得更多的诊断,即它是什么以及它为什么,但是搜索"cmake verbose"而不是给出关于制作make详细信息的结果,而不是cmake本身.
有没有办法强制cmake verbose /获得更多的诊断/调试或跟踪输出?或者如果你能说出我的具体案例中的问题,那也是值得赞赏的.
我找到的唯一在线资源是有关CMAKE_<LANG>_CPPLINT(此处链接)和此示例(此处链接)的 CMake 文档,但我无法弄清楚如何在 CMakeLists.txt 文件中实际使用它。我尝试了提供的示例,但无法使其正常工作。仅供参考,我按照此处的说明安装了 cpplint 。
到目前为止,我可以使用以下 CMake 命令在 CMakeLists.txt 中运行 cpplint python 脚本:
execute_process(COMMAND cpplint path/To/File/To/Analyse.cpp)
Run Code Online (Sandbox Code Playgroud)
但是,我很确定这不是执行此操作的正确方法。