【问题标题】:print complete CFLAGS/CXXFLAGS of CMake project打印 CMake 项目的完整 CFLAGS/CXXFLAGS
【发布时间】:2018-02-28 09:51:23
【问题描述】:

是否可以打印 CMake 项目的完整 *CFLAGS*CXX_FLAGS(所有目标?)?

我尝试在配置和构建项目后查看CMakeCache.txt,但是所有*C*FLAGS*相关变量几乎都是空的,并且无论如何不包含我的项目设置,例如-D-I特定于的标志我的依赖项。

我为什么要这样做?为了给clang-complete vim插件创建一个配置文件:https://vim.sourceforge.io/scripts/script.php?script_id=3302

【问题讨论】:

  • 能否详细说明您已经尝试过的方法以及为什么它不适合您的需要?如果我只是 google for it 我会看到几个操作指南。
  • @Florian 我尝试使用here 记录的 cc_args.py 脚本,但它不起作用(不会在构建目录中创建任何 .clang_complete)
  • @fferri,您是否在命令中使用了“~”(而不是“$HOME”),正如那里的答案错误建议的那样?
  • 不,我用CXX="$HOME/.vim/bin/cc_args.py clang++" cmake

标签: cmake clang-complete


【解决方案1】:

你能用message吗?这是来自a useful script from cmake 的示例。

# the compiler flags for compiling C sources 
MESSAGE( STATUS "CMAKE_C_FLAGS: " ${CMAKE_C_FLAGS} )

# the compiler flags for compiling C++ sources 
MESSAGE( STATUS "CMAKE_CXX_FLAGS: " ${CMAKE_CXX_FLAGS} )

否则,我会经常使用详细模式进行编译。由于我使用 Ninja 作为生成器,它看起来像这样:

cmake .. -GNinja
ninja -v

控制台的输出包含完整的编译命令,在我的例子中看起来像这样:

[1/2] C:\msys64\mingw32\bin\c++.exe -D<Defines> -I<Includes> -isystem C:/msys64/mingw32/include -g -MD -MT <object>.obj -MF <object>.obj.d -o <object>.obj -c <object>.cpp
[2/2] C:\msys64\mingw32\bin\c++.exe -g  <object1>.obj <object2>.obj <objectN>.obj -o <Application>.exe -Wl,--major-image-version,0,--minor-image-version,0 <library1>.dll.a <library2>.dll.a -l<systemlib1> -l<systemlib2>

您也可以尝试在 CMakeLists.txt 中设置 set( CMAKE_VERBOSE_MAKEFILE on ) 或在命令行中设置 cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON,以便在不使用生成器的情况下从 cmake 尝试它。您可以查看该变量here

【讨论】:

  • 我过去做过message() 的事情,如果你使用make 作为你的构建系统,你可以提供VERBOSE=1 来获取编译器和链接器的完整命令行。行很长,所以我喜欢使用我的breakln perl script 来压缩和折叠输出。
【解决方案2】:

我建议打印各个目标的属性,而不是打印“全局”变量。 CMAKE_xxx_FLAGS 的值在定义目标时附加到目标,之后可能会更改。

这是我在项目中使用的一个有用的辅助函数,灵感来自https://stackoverflow.com/a/34292622/5751151

function(print_target_properties tgt)
    if(NOT TARGET ${tgt})
        message("There is no target named '${tgt}'")
        return()
    endif()

    # this list of properties can be extended as needed
    set(CMAKE_PROPERTY_LIST SOURCE_DIR BINARY_DIR COMPILE_DEFINITIONS
             COMPILE_OPTIONS INCLUDE_DIRECTORIES LINK_LIBRARIES)

    message("Configuration for target ${tgt}")

    foreach (prop ${CMAKE_PROPERTY_LIST})
        get_property(propval TARGET ${tgt} PROPERTY ${prop} SET)
        if (propval)
            get_target_property(propval ${tgt} ${prop})
            message (STATUS "${prop} = ${propval}")
        endif()
    endforeach(prop)

endfunction(print_target_properties)

【讨论】:

    【解决方案3】:

    您还可以让 cmake 生成一个包含所有要运行的命令的 json 文件:

    -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
    

    在上下文中:

    mkdir -p release
    cd release
    cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -G Ninja .. && ninja
    

    这将为您提供一个名为 compile_commands.json 的文件,其中包含您的命令记录。这类似于斯图尔特的回答,只是它会自动为您将日志放入文件中。另一个优点是这个文件使用了 clang-tidy,我发现它非常有用。

    【讨论】:

      猜你喜欢
      • 2012-04-22
      • 1970-01-01
      • 2019-01-07
      • 2016-05-27
      • 2018-03-14
      • 1970-01-01
      • 2011-07-29
      • 2017-02-11
      • 2016-08-08
      相关资源
      最近更新 更多