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 )

除非您这样调用CMAKE,否

cmake -GNinja -DCMAKE_BUILD_TYPE=Release ../hello

,您将其在build.ninja

中得到
FLAGS = -O3 -DNDEBUG   -O0

检查compile_flags上的文档

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

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

因此,在cmake中,如何覆盖一个文件上的优化级别并能够在Release中编译项目的其余部分?否则,您可以将编译到CMAKE_BUILD_TYPE="",这是默认行为,但这在某种程度上打败了Cmake的卖点。

您无法使用源文件级别上的makefile CMAKE GERTATER覆盖编译器选项。始终附加选项(请参阅我的答案是CMAKE集变量递归?对于完整的公式)。

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

因此,您的更像是功能请求,还可以将编译器选项表添加到CMAKE的makefile发电机。


替代方案

我只是想添加一些我作为解决方法提出的疯狂的Cmake Magic。在project()命令之后,将以下内容添加到主CMakeLists.txt

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目录属性中,然后通过define_property(... INHERITED ...)链接到COMPILE_FLAGS源文件属性。

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

set_source_files_properties( 
    hello.c 
    PROPERTIES
    COMPILE_FLAGS -O0 
)

参考

  • 目录属性和子目录
  • cmake:如何更改子目录项目目标上的属性?

最新更新