cmake:Parameters to $ must resolve to either '0' or '1'.
阿新 • • 發佈:2018-12-03
如下是一段簡單的cmake指令碼,用於設定target的編譯選項:
當編譯器為msvc,且CMAKE_BUILD_TYPE為Release時,為target新增-arch:AVX2
編譯選項,
當編譯器為gcc,且CMAKE_BUILD_TYPE為Release時,為target新增-mavx2
編譯選項。
這裡用到了$<AND>
表示式(cmake-generator-expressions)
target_compile_options(${_target} PRIVATE $<$<AND:$<C_COMPILER_ID:MSVC>,$<CONFIG:Release>>:-arch:AVX2> $<$<AND:$<C_COMPILER_ID:GNU> ,$<CONFIG:Release>>:-mavx2> )
cmake-generator-expressions表示式以前用過很多次了,比較熟練,感覺語法上沒啥問題,但實際執行時居然報錯了:
CMake Error at src/core/CMakeLists.txt:109 (target_compile_options): Error evaluating generator expression: $<AND:$<C_COMPILER_ID:GNU>;,$<CONFIG:Release>> 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,還沒試過其他版本,不知道是不是有同樣的問題。