【问题标题】:How to add a custom build type to cmake ? (targeting make)如何向 cmake 添加自定义构建类型? (目标品牌)
【发布时间】:2012-07-11 08:50:37
【问题描述】:

我正在尝试为我的 cmake 构建添加自定义构建类型,以代码覆盖率为目标。

我找到了关于它的常见问题条目:https://gitlab.kitware.com/cmake/community/wikis/FAQ#how-can-i-specify-my-own-configurations-for-generators-that-allow-it-

但是,我不能让它工作。

这是我的代码,使用 cmake 2.8.5:

message("* Adding build types...")
if(CMAKE_CONFIGURATION_TYPES)
   list(APPEND CMAKE_CONFIGURATION_TYPES CodeCoverage)
   list(REMOVE_DUPLICATES CMAKE_CONFIGURATION_TYPES)
   set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING
       "Add the configurations that we need"
       FORCE)
   message("  Available build types are now : ${CMAKE_CONFIGURATION_TYPES}")
else()
   message("  XXX custom build types are not allowed...")
endif()

我得到“不允许 XXX 自定义构建类型...”...

【问题讨论】:

    标签: cmake


    【解决方案1】:

    发现问题:添加自定义构建和自定义配置之间存在混淆:

    • 配置适用于 Visual Studio 或 XCode 等特殊工具
    • 构建类型是一个更原始的功能

    所以要添加自定义构建类型,根本不需要操作 CMAKE_CONFIGURATION_TYPES 变量。只需设置相应的变量并开始使用即可,如explained

    SET(GCC_DEBUG_FLAGS "-g -Wall")
    
    # Add new build types
    message("* Adding build types...")
    SET(CMAKE_CXX_FLAGS_COVERAGE
        "${GCC_DEBUG_FLAGS} -fprofile-arcs -ftest-coverage"
        CACHE STRING "Flags used by the C++ compiler during coverage builds."
        FORCE )
    SET(CMAKE_C_FLAGS_COVERAGE
        "${GCC_DEBUG_FLAGS} -fprofile-arcs -ftest-coverage"
        CACHE STRING "Flags used by the C compiler during coverage builds."
        FORCE )
    SET(CMAKE_EXE_LINKER_FLAGS_COVERAGE
        ""
        CACHE STRING "Flags used for linking binaries during coverage builds."
        FORCE )
    SET(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
        ""
        CACHE STRING "Flags used by the shared libraries linker during coverage builds."
        FORCE )
    MARK_AS_ADVANCED(
        CMAKE_CXX_FLAGS_COVERAGE
        CMAKE_C_FLAGS_COVERAGE
        CMAKE_EXE_LINKER_FLAGS_COVERAGE
        CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
    

    我们可能还想更新帮助字符串(顺便说一下setting the default build type):

    IF(NOT CMAKE_BUILD_TYPE)
       SET(CMAKE_BUILD_TYPE Debug
           CACHE STRING "Choose the type of build : None Debug Release RelWithDebInfo MinSizeRel Coverage."
           FORCE)
    ENDIF(NOT CMAKE_BUILD_TYPE)
    message("* Current build type is : ${CMAKE_BUILD_TYPE}")
    

    关于尝试从其他构建类型继承默认选项的一些警告:

    SET(CMAKE_CXX_FLAGS_COVERAGE
        "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage"
        CACHE STRING "Flags used by the C++ compiler during coverage builds."
        FORCE )
    

    这是一个的想法,因为每次重新获取配置时(每次更改其中的某些内容)都会不断附加额外的选项。

    【讨论】:

    • 您可以从其他构建类型继承默认选项,但您不应该 @set(..CACHE...FORCE)@ 复合变量,否则您会看到这种附加行为。传播到 Makefile 中的变量值不必被缓存。
    • 最近的回答 here 对该主题给出了更完整和技术上正确的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多