如何将自定义构建类型添加到cmake? (定位品牌) [英] How to add a custom build type to cmake ? (targeting make)

查看:163
本文介绍了如何将自定义构建类型添加到cmake? (定位品牌)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



我找到了有关它的FAQ条目: 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( *正在添加构建类型...)
if(CMAKE_CONFIGURATION_TYPES)
list( APPEND CMAKE_CONFIGURATION_TYPES CodeCoverage)
列表(REMOVE_DUPLICATES CMAKE_CONFIGURATION_TYPES)
set(CMAKE_CONFIGURATION_TYPES $ {CMAKE_CONFIGURATION_TYPES}缓存字符串
添加我们需要的配置
FORCE message(现在可用的构建类型为:$ {CMAKE_CONFIGURATION_TYPES})
else()
message(不允许XXX自定义构建类型...)
endif()

然后我得到不允许使用XXX自定义构建类型... ...

解决方案

发现了问题:在添加自定义内部版本和自定义配置之间存在混淆:




  • 配置适用于Visual Studio或XCode等特殊工具

  • 内部类型是更原始的功能



因此,要添加自定义构建类型,根本不需要操纵CMAKE_CONFIGURATION_TYPES变量。只需设置相应的变量并开始使用它即可,如解释

  SET(GCC_DEBUG_FLAGS- g -Wall)

#添加新的构建类型
message( *添加构建类型...)
SET(CMAKE_CXX_FLAGS_COVERAGE
$ {GCC_DEBUG_FLAGS} -fprofile-arcs -ftest-coverage
CACHE STRING在覆盖构建期间C ++编译器使用的标志。
FORCE)
SET(CMAKE_C_FLAGS_COVERAGE
$ {GCC_DEBUG_FLAGS}- fprofile-arcs -ftest-coverage
CACHE STRING在Coverage构建期间C编译器使用的标记。
FORCE)
SET(CMAKE_EXE_LINKER_FLAGS_COVERAGE

CACHE STRING在coverage构建期间用于链接二进制文件的标记。
FORCE)
SET(CMAKE_SHARED_LINKER_FLAGS_COVERAGE

CACHE STRING在共享库链接器使用的标记覆盖范围建立。
FORCE)
MARK_AS_ADVANCED(
CMAKE_CXX_FLAGS_COVERAGE
CMAKE_C_FLAGS_COVERAGE
CMAKE_EXE_LINKER_FLAGS_COVERAGE

CMAKE_AGRED_LINKER_> pre>

我们可能还想审核帮助字符串(以及设置默认的构建类型) :

  IF(NO CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE调试​​
CACHE STRING选择构建类型:无调试版本RelWithDebInfo MinSizeRel涵盖范围。
FORCE)
ENDIF(NOT CMAKE_BUILD_TYPE)
message( *当前构建类型为:$ {CMAKE_BUILD_TYPE})

有关尝试从执行此操作的另一个构建类型继承默认选项的警告:

  SET(CMAKE_CXX_FLAGS_COVERAGE 
$ {CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage
CACHE STRING C ++编译器在覆盖构建期间使用的标志。
FORCE)

这是一个的主意,因为每次重新获得配置时,附加选项都会不断添加(每次您在)。


I'm trying to add a custom build type for my cmake build, targetted at code coverage.

I've found the FAQ entry about it : https://gitlab.kitware.com/cmake/community/wikis/FAQ#how-can-i-specify-my-own-configurations-for-generators-that-allow-it-

However, I can't make it work.

Here is my code, using 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()

And I get "XXX custom build types are not allowed..."...

解决方案

Found the problem : there is a confusion between adding custom builds and custom configurations :

  • configurations are for special tools like Visual Studio or XCode
  • build types are a much rawer feature

So to add a custom build type, there is no need to manipulate the CMAKE_CONFIGURATION_TYPES variable at all. Just set the corresponding variables and start using it, as 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 )

We may also want to udate the help string (along with setting the default build type by the way) :

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}")

A bit of warning about trying to inherit default options from another build type doing this :

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 )

This is a bad idea because the extra options keep being appended every time the config is sourced again (every time you change something in it).

这篇关于如何将自定义构建类型添加到cmake? (定位品牌)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆