CMake 每个文件优化

Cam*_*mer 6 cmake

在其他地方有人问过这样的问题:“如何关闭一个文件的优化?” 答案通常是这样的:

cmake_minimum_required( VERSION 3.8 )

project( Hello )

add_executable( hello hello.c foo.c bar.c )

set( CMAKE_C_FLAGS_RELEASE "" )
set( CMAKE_CXX_FLAGS_RELEASE "" )

set_source_files_properties( hello.c 
                PROPERTIES
                COMPILE_FLAGS -O0 )
Run Code Online (Sandbox Code Playgroud)

除非您像这样调用 cmake,否则这将有效:

cmake -GNinja -DCMAKE_BUILD_TYPE=Release ../hello
Run Code Online (Sandbox Code Playgroud)

你在你的build.ninja

FLAGS = -O3 -DNDEBUG   -O0
Run Code Online (Sandbox Code Playgroud)

检查有关COMPILE_FLAGS的文档

编译此源文件时要添加的其他标志。

这是有道理的,它被添加到 COMPILE_FLAGS 列表中,它不会覆盖现有的编译器标志。

那么,在 CMake 中如何覆盖单个文件的优化级别并能够编译项目的其余部分Release?否则,您可以强制编译为CMAKE_BUILD_TYPE=""默认行为,但这在某种程度上违背了 Cmake 的卖点。

Flo*_*ian 3

您无法makefile在源文件级别使用 CMake 生成器覆盖编译器选项。选项总是附加的(有关完整的公式,请参阅Is Cmake set variable recursive?中的回答)。

据我所知,这仅由Visual Studio解决方案/项目生成器支持。这些生成器具有标志表来识别同一组中的标志/覆盖先前定义的标志的标志。

因此,您的请求更像是向 CMakemakefile生成器添加编译器选项表的功能请求。


备择方案

我只是想添加一些我想出的疯狂的 CMake 魔法作为解决方法。CMakeLists.txt在命令后将以下内容添加到 main 中project()

if (CMAKE_BUILD_TYPE)
    define_property(
        SOURCE
        PROPERTY COMPILE_FLAGS 
        INHERITED 
        BRIEF_DOCS "brief-doc"
        FULL_DOCS  "full-doc"
    )
    string(TOUPPER ${CMAKE_BUILD_TYPE} _build_type)
    set_directory_properties(PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS_${_build_type}}")
    set(CMAKE_CXX_FLAGS_${_build_type} "")
endif()    
Run Code Online (Sandbox Code Playgroud)

此示例将CMAKE_CXX_FLAGS_<build type>内容移动到新的COMPILE_FLAGS目录属性中,然后通过 链接到COMPILE_FLAGS源文件属性define_property(... INHERITED ...)

现在,仅在每个源文件中定义构建类型特定标志COMPILE_FLAGS,您可以使用示例中的代码片段覆盖/更改它们:

set_source_files_properties( 
    hello.c 
    PROPERTIES
    COMPILE_FLAGS -O0 
)
Run Code Online (Sandbox Code Playgroud)

参考