【发布时间】:2025-12-25 10:20:26
【问题描述】:
在我们的项目中,我们有大量的配置,这些配置源自多种目标硬件类型,再加上几种模式。
为了避免不必要的细节,我们假设配置的格式为<hw>_<mode> are
-
<hw>是以下之一:A、B或C, -
<mode>是以下之一:1、2或3。
此外,为了接近实际情况,我们假设A_3 和C_1 是不受支持的异常。 (但是,我认为这并不重要。)
这给我们留下了 3 x 3 - 2 = 7 支持的配置。
现在,我们希望根据配置进行设置(其中还有编译器和 sysroot 的路径)。此外,某些来源应仅包含在某些配置中。我们更愿意根据部分配置来做。
例如,我们想对所有A_* 配置使用/this/g++,对所有其他配置使用/that/g++。或者我们想为所有 *_2 配置而不是其他配置添加 mode2.cpp 文件。
如果我们使用CMAKE_BUILD_TYPE,这是一个简单的任务。我们可以用正则表达式 (string(REGEX MATCH) 拆分它,并且每个部分都有变量。然后简单的if 就可以了。
但是,这种方法对多配置生成器并不友好(目前似乎只有 Visual Studio 和 Xcode)。为了很好地使用多配置生成器,AFAIK,我们必须使用generator expressions。
但问题是,我看不出有办法在生成器表达式中提取配置 (CONFIG) 的部分。
例如,我可以这样做:
add_executable(my_prog
source_1.cpp
# ...
source_n.cpp
$<$<CONFIG:A_2>:mode2.cpp>
$<$<CONFIG:B_2>:mode2.cpp>
$<$<CONFIG:C_2>:mode2.cpp>
)
但考虑到我们迟早会添加新的硬件类型(或删除过时的硬件类型),这看起来不像是一种可维护的方法。
有没有办法在生成器表达式中进行某种形式的匹配?
到目前为止,我发现的唯一解决方法是使用这样的方法:
set(CONFIG_IS_MODE_2 $<OR:$<CONFIG:A_2>,$<CONFIG:B_2>,$<CONFIG:C_2>>)
add_executable(my_target
source_1.cpp
# ...
source_n.cpp
$<${CONFIG_IS_MODE_2}:mode2.cpp>
)
这至少允许集中这些表达式,并且当添加新的硬件类型时,只有一个地方可以更新。但是,仍有许多变量需要更新。
有没有更好的解决方案?
【问题讨论】:
标签: cmake