[CMake] evaluating a simple boolean expression?

Brad King brad.king at kitware.com
Thu Mar 30 09:52:55 EST 2006


Brandon J. Van Every wrote:
> How do I evaluate a simple boolean expression in CMake?  I've tried {} 
> and ${} and they don't work for expressions, only for variable 
> substitutions.  () and $() give errors.  [] and $[] appear to be absent 
> from the language.  I've Googled all over the place and can't find any 
> documentation.

That's because there is no EVAL function.

 > I'm looking for something like an EVAL() function.  Why
> do I need an evaluator?  I get tired of writing my boolean conditionals 
> twice:
> 
> SET(HAVE_EXTANT_CHICKEN true)
> IF(${EXTANT_CHICKEN} STREQUAL "EXTANT_CHICKEN-NOTFOUND")
>  SET(HAVE_EXTANT_CHICKEN false)
> ENDIF(${EXTANT_CHICKEN} STREQUAL "EXTANT_CHICKEN-NOTFOUND")
> IF(HAVE_EXTANT_CHICKEN)
>  blah blah blah...
> ELSE(HAVE_EXTANT_CHICKEN)
>  bleh bleh bleh...
> ENDIF(HAVE_EXTANT_CHICKEN)
> 
> I would rather isolate my conditional and only edit it in 1 place.  
> Particularly when conditionals get longer.  Something like:
> 
> SET(HAVE_EXTANT_CHICKEN {${EXTANT_CHICKEN} STREQUAL 
> "EXTANT_CHICKEN-NOTFOUND"})
> IF(HAVE_EXTANT_CHICKEN)
>  blah blah blah...
> ELSE(HAVE_EXTANT_CHICKEN)
>  bleh bleh bleh...
> ENDIF(HAVE_EXTANT_CHICKEN)

In this particular case there is an easy fix.  The value 
EXTANT_CHICKEN-NOTFOUND is considered false for the variable 
EXANT_CHICKEN, so just write

IF(EXTANT_CHICKEN)
   # have it
ELSE(EXTANT_CHICKEN)
   # don't have it
ENDIF(EXTANT_CHICKEN)

However in general you can do this with a simple macro:

MACRO(MY_EVAL_CONDITION name)
   IF(${ARGN})
     SET(${name} 1)
   ELSE(${ARGN})
     SET(${name} 0)
   ENDIF(${ARGN})
ENDMACRO(MY_EVAL_CONDITION)

MY_EVAL_CONDITION(MYCOND "foo" STREQUAL "foo")
IF(MYCOND)
   MESSAGE(STATUS "Yes")
ELSE(MYCOND)
   MESSAGE(STATUS "No")
ENDIF(MYCOND)

-Brad


More information about the CMake mailing list