cmake:如何将额外的标志传递给gcc

fkaflof6  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(128)

我有一个使用cmake系统编译的项目。我使用

cd build
cmake ..  # cmake stage
make      # make stage

字符串
有时我想传递一个额外的标志-fdiagnostics-json到gcc,以便轻松解析诊断消息。通常我编译它们时不带这个标志。
我可以在CMakeLists.txt中添加/删除它,只要我想改变输出。问题是,每次修改CMakeLists.txt时,我都需要从cmake ..重新启动,整个项目都要重新构建,包括已经构建的对象文件。
有没有一种方法可以在make阶段选择性地将此标志添加到gcc。我尝试了以下方法,似乎不起作用

cmake ..

# then
make

# then
make CXXFLAGS="-fdiagnostics-format=json"

pexxcrt2

pexxcrt21#

我可以在CMakeLists.txt中添加/删除它,只要我想改变输出。问题是每次我修改CMakeLists.txt时都需要从cmake重新启动。并且整个项目将被重新构建,包括已经构建的目标文件。
这是无法避免的。在所有目标文件都过期之后,您确实更改了编译器选项,因为编译器选项集已经更改。
您不需要编辑CMakeLists.txt文件。你应该能够通过cmake缓存变量传递编译器选项,而不必修改cmake文件:
build目录中的项目设置全局添加选项:

cmake -D "CMAKE_CXX_FLAGS=-fdiagnostics-format=json" -D "CMAKE_C_FLAGS=-fdiagnostics-format=json" build

字符串
重置选项:

cmake -U CMAKE_CXX_FLAGS -U CMAKE_C_FLAGS build


参见CMAKE_<LANG>_FLAGS
要仅为单个目标设置此设置,可以添加一个缓存变量,可以修改该变量以启用/禁用编译器标志。这应该只会导致您应用标志的目标需要重新生成,再加上链接目标的二进制文件(如果有的话)的重新链接。

if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    option(MY_TARGET_ENABLE_DIAGNOSTICS "Add -fdiagnostics-format=json compiler option to my_target" OFF)
    if (MY_TARGET_ENABLE_DIAGNOSTICS)
        target_compile_options(my_target PRIVATE -fdiagnostics-format=json)
    endif()
endif()


启用该选项:

cmake -D MY_TARGET_ENABLE_DIAGNOSTICS=ON build


禁用该选项

cmake -D MY_TARGET_ENABLE_DIAGNOSTICS=OFF build


此外,一个设计良好的cmake项目可以设置在多个构建目录中,这将允许两个版本的构建文件并行存在。
这要求cmake项目不在源代码树中生成任何文件。
该方法适用于上述两种替代方案。下面的命令假定第二个选项。
buildbuild_diagnostics中的src中设置的项目的初始cmake配置

cmake -S src -B build
cmake -D MY_TARGET_ENABLE_DIAGNOSTICS=ON -S src -B build_diagnostics


建设两个项目

cmake --build build
cmake --build build_diagnostics


这将使两个备选方案的构建文件保持并行,并且只会导致重新构建自给定目录上的上次构建以来修改过的那些文件。

**注意:**使用多配置cmake生成器,您甚至可以通过使用taget_compile_options的生成器表达式为诊断选项添加单独的配置。Unix Makefiles不是一个多配置的cmake生成器。

4c8rllxm

4c8rllxm2#

免责声明

有人批评这个答案取决于CMake的实现细节,这是真的。这也取决于CMake的未记录行为。此解决方案可能会与CMake的未来版本中断。
此外,它只适用于Unix Makefile生成器。但是,它确实使用了文档化良好的make行为。即override variables的能力。
在优点方面,它确实比干净的CMake解决方案提供了更大的灵活性。这也是一句俏皮话。
如果你还在阅读,就把这当作一次过的运行。

A Q&D一行

make使用的标志位于CMakeFiles/your_project.dir/flags.make中生成的构建目录中。您要查找的变量是CXX_FLAGS(带下划线)。您可以使用您最喜欢的文本编辑器来更改make in place所使用的标志。(是的,有一个警告,不要编辑文件,请参阅上面的免责声明。
再次运行CMake将重新生成文件并撤消更改。
也可以在命令行上传递变量。由于这将完全覆盖flags.make中的变量,因此可以使用sed读取文件并像下面这样调整变量

make "$(sed -n 's/CXX_FLAGS.*/\0 -fdiagnostics-json/p' CMakeFiles/your_project.dir/flags.make)"

字符串

相关问题