打印完整的CMake项目CFLAGS / CXXFLAGS

时间:2017-09-19 14:40:59

标签: cmake clang-complete

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

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

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

3 个答案:

答案 0 :(得分:3)

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

这是我在项目中使用的一个有用的辅助函数,受https://stackoverflow.com/a/34292622/5751151的启发:

if(errorFirstName == false){
    console.log("under if");
    return true;
}

答案 1 :(得分: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的发行版文件,其中包含您的命令记录。这与Stewart的答案类似,除了它会自动为您将日志放入文件中。另一个优点是,使用clang-tidy可以使用此文件,我发现它非常有用。

答案 2 :(得分:2)

您可以使用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