gpt4 book ai didi

Cmake 生成器表达式命令

转载 作者:行者123 更新时间:2023-12-03 17:31:44 24 4
gpt4 key购买 nike

如果某个 bool 条件为真(例如 ENABLE_TESTING),那么我想运行如下:

COMMAND ./b2 --with-filesystem --with-program_options --with-test

如果 bool 条件为假,那么我想要:
COMMAND ""

看起来我可以用这个非常丑陋的代码来实现:
COMMAND $<$<BOOL:${ENABLE_TESTING}>:./b2> $<$<BOOL:${ENABLE_TESTING}>:--with-filesystem> $<$<BOOL:${ENABLE_TESTING}>:--with-program_options> $<$<BOOL:${ENABLE_TESTING}>:--with-test>

但是正如你所看到的,我必须一遍又一遍地重复 bool 测试。如果我天真地尝试将它们组合成一个表达式:
COMMAND $<$<BOOL:${ENABLE_TESTING}>:./b2 --with-filesystem --with-program_options --with-test>

然后我收到错误 /bin/sh: 1: $<1:./b2: not found .显然,在计算生成器表达式之前解析空格。所以我引用整件事:
COMMAND "$<$<BOOL:${ENABLE_TESTING}>:./b2 --with-filesystem --with-program_options --with-test>"

但这会产生错误 /bin/sh 1: /b2 --with-filesystem --with-program_options --with-test: not found .我想它将整个事情视为命令的名称,而不是带有选项的命令。我怎样才能以一种干净且有效的方式写这个?

编辑:我试图简化一个最小示例的代码,但我遗漏了一个额外的复杂性。此命令发生在 ExternalProject_Add 中部分,我需要依赖特殊 token ,例如 <BINARY_DIR> .
COMMAND ./b2 "--stagedir=<BINARY_DIR>" --with-filesystem --with-program_options --with-test

我无法将命令移到别处的 if 语句中,因为如果我这样做,则目录标记不会扩展。

最佳答案

在代码可读性方面,生成器表达式是 CMake 语言的不幸补充。在像您这样无法避免生成器表达式的场景中,我使用常规 CMake 变量来避免代码重复,即:

set (_runB2GenEx "$<BOOL:${ENABLE_TESTING}>")
ExternalProject_Add(example
...
COMMAND
$<${_runB2GenEx}:./b2>
$<${_runB2GenEx}:--stagedir=<BINARY_DIR>>
$<${_runB2GenEx}:--with-filesystem>
$<${_runB2GenEx}:--with-program_options>
$<${_runB2GenEx}:--with-test>
...
)

关于Cmake 生成器表达式命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52585555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com