打印 CMake 项目的完整 CFLAGS/CXXFLAGS
print complete CFLAGS/CXXFLAGS of CMake project
是否可以打印 CMake 项目(所有目标的)的完整 *CFLAGS
和 *CXX_FLAGS
?
我在配置和构建项目后尝试在CMakeCache.txt
中查找,但是所有*C*FLAGS*
相关变量几乎都是空的,而且不包含我的项目设置,例如-D
和 -I
特定于我的依赖项的标志。
为什么我要这样做?为了为 clang-complete vim 插件创建配置文件:https://vim.sourceforge.io/scripts/script.php?script_id=3302
可以使用message? Here is a sample from 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} )
不然我经常会用verbose模式编译。由于我使用 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 或 cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON
中设置 set( CMAKE_VERBOSE_MAKEFILE on )
,以便在不使用生成器的情况下从 cmake 进行尝试。您可以查看该变量 here.
我建议打印各个目标的属性,而不是打印 "global" 变量。 CMAKE_xxx_FLAGS 的值在定义目标时附加到目标,之后可能会更改。
这是我在项目中使用的一个有用的辅助函数,灵感来自 :
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)
您还可以让 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,我发现它非常有用。
是否可以打印 CMake 项目(所有目标的)的完整 *CFLAGS
和 *CXX_FLAGS
?
我在配置和构建项目后尝试在CMakeCache.txt
中查找,但是所有*C*FLAGS*
相关变量几乎都是空的,而且不包含我的项目设置,例如-D
和 -I
特定于我的依赖项的标志。
为什么我要这样做?为了为 clang-complete vim 插件创建配置文件:https://vim.sourceforge.io/scripts/script.php?script_id=3302
可以使用message? Here is a sample from 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} )
不然我经常会用verbose模式编译。由于我使用 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 或 cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON
中设置 set( CMAKE_VERBOSE_MAKEFILE on )
,以便在不使用生成器的情况下从 cmake 进行尝试。您可以查看该变量 here.
我建议打印各个目标的属性,而不是打印 "global" 变量。 CMAKE_xxx_FLAGS 的值在定义目标时附加到目标,之后可能会更改。
这是我在项目中使用的一个有用的辅助函数,灵感来自
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)
您还可以让 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,我发现它非常有用。