Cmake ARGV和Macro BUG?

时间:2012-05-23 14:35:09

标签: cmake

以下是奇怪的!

macro(foo in1)
  message("FIRST" ${in1})
  message("OPtional1:" ${ARGV1})
  message("OPtional2:" ${ARGV2})
if( NOT ${ARGV1} AND ${ARGV2} )
   message("IF")  
else()
   message("ELSE")  
endif()
endmacro()

运行以下内容:

foo("gaga" false true)   

(应该给“如果”) WORKS!

BUT

foo("gaga" false)   

(应该给“ELSE”,因为第二个可选参数是FALSE!)

导致错误:

cmake:126 (if):
given arguments:  "NOT" "false" "AND"
Unknown arguments specified

这是一个错误吗?

以下作品:

if( NOT "${ARGV1}" AND "${ARGV2}" )
   message("IF")  
else()
   message("ELSE")  
endif()

WHY ???

感谢任何帮助!

(功能有效)

2 个答案:

答案 0 :(得分:3)

在宏中,ARGV1等不是真正的CMake变量。相反,${ARGV1}是宏调用的字符串替换。这意味着只有一个参数的调用会扩展为

if( NOT false AND )

解释了错误消息。通过将字符串扩展括在引号中,您现在有了

if( NOT "false" AND "")

给IF命令一个空字符串进行评估。其他解决方案:在尝试扩展ARGV2之前,使用$ {ARGC}字符串替换来确定参数是否存在。或者,正如您所提到的,切换到函数而不是宏。在一个函数中,ARGV1是一个实际的CMake变量,即使没有$ {}扩展,你也可以更明智地编写它:

function(foo in1)
  message("Optional1: " ${ARGV1})
  message("Optional2: " ${ARGV2})
if( NOT ARGV1 AND ARGV2 )
   message("IF")  
else()
   message("ELSE")  
endif()
endfunction()

参考: http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:macro

答案 1 :(得分:0)

if(NOT ARGV1 AND ARGV2)

相同
if(ARGV2 AND NOT ARGV1)

逻辑否定(以及大多数其他一元运算符)在连接之前绑定。