每个文件优化CMake

问题描述 投票:1回答:1

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

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 )

除非你像这样调用cmake:

cmake -GNinja -DCMAKE_BUILD_TYPE=Release ../hello

而你在build.ninja得到这个

FLAGS = -O3 -DNDEBUG   -O0

检查COMPILE_FLAGS上的文档

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

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

那么,在CMake中如何覆盖单个文件的优化级别,并能够在Release中编译项目的其余部分?否则你可以强制编译到CMAKE_BUILD_TYPE=""这是默认行为,但这有点挫败了Cmake的卖点。

cmake
1个回答
2
投票

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

这是 - 据我所知 - 仅支持Visual Studio解决方案/项目生成器。这些生成器具有flag tables,用于标识同一组中的标志/覆盖先前定义的标志。

所以你的更像是一个功能请求,也可以向CMake的makefile生成器添加编译器选项表。


备择方案

我只是想添加一些疯狂的CMake魔法,我想出了一个解决方法。在CMakeLists.txt命令之后将以下内容添加到主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()    

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

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

set_source_files_properties( 
    hello.c 
    PROPERTIES
    COMPILE_FLAGS -O0 
)

参考

© www.soinside.com 2019 - 2024. All rights reserved.