CMake脚本中的Map

9
我想将一个变量映射到一个字符串中,就像这个伪cmake代码示例中一样。
map(mymap "val1" "key1" "val2" "key2") # <-- this seems not to exist
set(filename "prependfilename${mymap[${avar}]}otherpartoffilename") 

基本上在我的情况下,我必须根据${ANDROID_ABI}的值(表示目标架构类型的变量)将字符串“a32”或“a64”连接到文件名中。

如何为CMake中的变量实现简单的映射行为?


@KamilCuk,你的一分钟谷歌搜索失败得很惨,如果一个键包含等号,比如“o=ne”。但我猜这就是在一分钟内从谷歌上找到代码的结果。 - AndrewBloom
当然可以...那就修补一下吧?发明一些转义字符,并编写一个正则表达式将 = 替换为某个唯一的转义模式,比如 %=(并将 % 替换为 %%)。然后再编写一个正则表达式将其替换回来。这样应该就能解决了。 - KamilCuk
@KamilCuk的问题更多地是如何在Cmake上处理这个问题(因为解决方案/解决方法必须存在)。我认为Tsyvarev的答案非常好,完全回答了这个问题。 - AndrewBloom
我在那里测试了这个库 - 它正确处理值中的 =dict(SET mydict a "this=that") dict(GET mydict a value) message(STATUS "${value}") 显示 this=that - KamilCuk
1
@KamilCuk 不在键盘上,而是正则表达式找到了第一个 =。 - AndrewBloom
我也测试了这个库,只是为了找到可能会使我的问题看起来不那么愚蠢并舒缓我的自尊心的潜在陷阱。哈哈哈哈哈 - AndrewBloom
1个回答

18

CMake不支持[]{}运算符,但可以通过对变量使用命名方案来实现映射:

# The naming scheme: mymap_<val>
set(mymap_val1 key1) # Maps val1 => key1
set(mymap_val2 key2) # Maps val2 => key2
# ...
set(avar val1) # Some key
message("Key ${avar} is mapped into: ${mymap_${avar}}")

这种“映射”方式被 CMake 自身积极使用。

例如,变量CMAKE_<LANG>_COMPILER将一个编程语言映射到编译器,变量CMAKE_<LANG>_FLAGS_<CONFIG>将语言和配置类型映射到编译器标志,具体针对该配置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接