cmake:Parameters to $<AND> must resolve to either '0' or '1'.

亦凉 2022-04-12 09:52 215阅读 0赞

如下是一段简单的cmake脚本,用于设置target的编译选项:
当编译器为msvc,且CMAKE_BUILD_TYPE为Release时,为target添加-arch:AVX2编译选项,
当编译器为gcc,且CMAKE_BUILD_TYPE为Release时,为target添加-mavx2编译选项。

这里用到了$<AND> 表达式(cmake-generator-expressions)

  1. target_compile_options(${_target} PRIVATE
  2. $<$<AND:$<C_COMPILER_ID:MSVC>,$<CONFIG:Release>>:-arch:AVX2>
  3. $<$<AND:$<C_COMPILER_ID:GNU> ,$<CONFIG:Release>>:-mavx2> )

cmake-generator-expressions表达式以前用过很多次了,比较熟练,感觉语法上没啥问题,但实际运行时居然报错了:

  1. CMake Error at src/core/CMakeLists.txt:109 (target_compile_options):
  2. Error evaluating generator expression:
  3. $<AND:$<C_COMPILER_ID:GNU>;,$<CONFIG:Release>>
  4. Parameters to $<OR> must resolve to either '0' or '1'.

代码中用到了两次$<AND>表达式,但第一个正常,第二个却报错。看了半天也没找到问题。实在没办法了,尝试把GNU> ,这里,号前的空格删除(为格式上的美观特意加了空格),通过!

然后尝试$<OR>表达式,也是同样的问题。
结论就是$<OR>,$<AND>表达式中子表达式之间的,号分隔符前不能有空格(后面有空格倒是是可以的)。
仔细想想,$<OR>,$<AND>表达式在实现时每个子表达返回结果是作为一个字符串处理的,如果加了空格,返回的字符串后面就多了个空格,就是不是‘1’‘0’,而是‘1 ’‘0 ’,所以报错Parameters to $<OR> must resolve to either '0' or '1'.
但为什么在‘,’之后的空格却能被正常处理呢?我觉得这还是个bug。
我用的CMAKE 版本是3.11.1,还没试过其他版本,不知道是不是有同样的问题。

发表评论

表情:
评论列表 (有 0 条评论,215人围观)

还没有评论,来说两句吧...

相关阅读