打印完整的CMake项目CFLAGS / CXXFLAGS

ffe*_*rri 0 cmake clang-complete

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

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

为什么我要这样做?为了为完成clang的vim插件创建配置文件,请执行以下操作:https ://vim.sourceforge.io/scripts/script.php?script_id =3302

Ste*_*art 6

可以用留言吗?这是来自 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} )
Run Code Online (Sandbox Code Playgroud)

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

cmake .. -GNinja
ninja -v
Run Code Online (Sandbox Code Playgroud)

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

[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>
Run Code Online (Sandbox Code Playgroud)

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


Bow*_*ens 6

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

-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
Run Code Online (Sandbox Code Playgroud)

在上下文中:

mkdir -p release
cd release
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -G Ninja .. && ninja
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

/sf/answers/2400483571/的启发,这是我在项目中使用的有用的辅助功能:

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)
Run Code Online (Sandbox Code Playgroud)