自定义 CMake 配置类型。我可以以某种方式“继承”调试吗?

问题描述 投票:0回答:2

我使用 CMAKE_CONFIGURATION_TYPES 来针对两种架构。这似乎是在 CLion 中执行此操作的唯一方法。

设置(CMAKE_CONFIGURATION_TYPES“Debug_x86_64;Debug_aarch64”)

我的自定义配置类型似乎不包含调试标志,这并不是我所期望的。我怎么能这么做呢?可以说,继承默认选项(例如“调试”)会很好。

c++ c cmake clion
2个回答
1
投票

CMake 分别在 CMAKE_C_FLAGS_${CONFIGURATION} 和 CMAKE_CXX_FLAGS_${CONFIGURATION} 中保存 C 和 C++ 的编译器标志

“继承”标志的简单方法是:

SET (CMAKE_C_FLAGS_Debug_x86_64 ${CMAKE_C_FLAGS_DEBUG})
SET (CMAKE_CXX_FLAGS_Debug_x86_64 ${CMAKE_CXX_FLAGS_DEBUG})

0
投票

我知道这个问题已经过时了,但是如果您有具有大量配置的复杂项目,那么提供的答案没有帮助,所以我想出了自己的解决方案。

在CMake中没有继承这样的概念,继承属性的唯一方法是嵌套。一种可能的方法是通过堆栈嵌套属性,如 @user2517908 所示。另一种更通用的方法是

variant
set()
 命令的 
set_target_properties()
参数。尽管除了这个答案之外我找不到任何相关文档https://stackoverflow.com/a/4937486/4121301

基本上

variant
允许您为任何特定配置设置属性:

set(CMAKE_C_FLAGS[variant=Release] "${CMAKE_C_FLAGS_DEBUG} -O3")

当您想要为特定构建系统(例如 Visual Studio 项目文件或 Xcode)设置特定属性时,事情会变得有点复杂,通常您想要使用为其设计的特定属性。知道这一点很重要,因为即使是最新的 CMake 3.29 也没有正确设置所有必要的调试配置,以防我们生成 Xcode 项目,例如

Testability
选项。例如,这里是 XCodeVisual Studio:

set(CMAKE_XCODE_ATTRIBUTE_ENABLE_TESTABILITY[variant=Debug] "YES")

最后,由于

CMAKE_CONFIGURATION_TYPES
只是一个列表,我们可以迭代它。此外,重要的是要知道我们在 CMake 中有运行时字符串比较,因此我们能够迭代列表并为满足我们检查的每个配置设置相同的属性。

假设我们有 10 种不同的配置,并且我们希望为每个

Debug
嵌套配置设置正确的 XCode 属性:

# Set configuration list
set(CMAKE_CONFIGURATION_TYPES 
    "Debug"
    "Debug Demo"
    "Debug Prod"
    "Debug Stage"
    "Debug Stage Integration Test"
    "Release"
    "Release Demo"
    "Release Prod"
    "Release Stage"
    "Release Stage Integration Test")

# Set default options
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_NS_ASSERTIONS "NO")

# Iterate through configurations and set
# properties for each that starts with 'Debug'
foreach(CONFIG ${CMAKE_CONFIGURATION_TYPES})
    if(${CONFIG} MATCHES "^Debug.*")
        set(CMAKE_XCODE_ATTRIBUTE_ENABLE_TESTABILITY[variant=${CONFIG}] "YES")
        set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=${CONFIG}] "dwarf")
        set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL[variant=${CONFIG}] "0")
        set(CMAKE_XCODE_ATTRIBUTE_ENABLE_NS_ASSERTIONS[variant=${CONFIG}] "YES")
    endif()
endforeach()

是的,此代码可以在工具链文件中使用,因此您可以使用单个文件以相同的方式为每个项目设置每个配置。

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