[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