[CMake] #cmakedefine and the #if vs #ifdef argument

Mike Jackson mike.jackson at bluequartz.net
Thu Jun 11 22:39:51 EDT 2009


Sometimes I'll do something like the following:

 set (FOO_SOMETHING_SUPPORT 0)
OPTION (USE_SOMETHING "blah blah" ON)
if (USE_SOMETHING)
 set (FOO_SOMETHING_SUPPORT 1)
endif()

then in my .h.in file I'll have:

#define FOO_SOMETHING_SUPPORT @ FOO_SOMETHING_SUPPORT@

That is just one way to do what you want. Others will chime in with more ideas.

Mike

On Thu, Jun 11, 2009 at 10:02 PM, Hostile Fork<hostilefork at gmail.com> wrote:
> On Jun 11, 2009, at 14:47 , Pau Garcia i Quiles wrote:
>>
>> #define VAR_THAT_IS_ON @VAR_THAT_IS_ON@
>> #define VAR_THAT_IS_OFF @VAR_THAT_IS_OFF@
>>
>> If you call CMake with 'cmake -DVAR_THAT_IS_ON=1 -DVAR_THAT_IS_OFF=0',
>> it will produce:
>>
>> #define VAR_THAT_IS_ON 1
>> #define VAR_THAT_IS_OFF 0
>
> Hello Pau, thanks for the quick response...
>
> This approach would work if I were using STRING.  However, the variables in
> question were created using "option", and are BOOL...which seems preferable.
>  Yet this gives rise to some very unusual behavior in how they substitute
> using @VAR at .
>
> Anything equivalent to 'off' (e.g. "0", "off", "falSE", "NO") produces an
> all-caps "OFF".  So that means I get:
>
>        #define VAR_THAT_IS_OFF OFF
>
> If using the command line ("-DVAR_THAT_IS_ON=[stuff]"), then any stuff
> equivalent to 'on' (e.g. "1", "Yes", "oN", "True") is forced to ON.  So that
> seemed pretty symmetric:
>
>        #define VAR_THAT_IS_ON ON
>
> I was tempted to just '#define OFF 0' and '#define ON 1' in my file and move
> on.  But when using the interactive mode ("cmake -i") it did something
> unusual... it preserved the specific string you had used to specify 'on'.
>  So you get a wide variety of possibilities, such as:
>
>        #define VAR_THAT_IS_ON 1
>        #define VAR_THAT_IS_ON on
>        #define VAR_THAT_IS_ON On
>        #define VAR_THAT_IS_ON oN
>        #define VAR_THAT_IS_ON ON
>        #define VAR_THAT_IS_ON yes
>        #define VAR_THAT_IS_ON Yes
>        #define VAR_THAT_IS_ON yEs
>        ...
>        #define VAR_THAT_IS_ON true
>        ...
>        #define VAR_THAT_IS_ON TRUe
>        #define VAR_THAT_IS_ON TRUE
>
> (Note: strings that aren't allowed signifiers of ON/OFF are treated as off.
>  So entering "banana" in the interactive mode will get you an all-caps OFF
> in the substitution.)
>
> The command line does not do the case standardization for variables declared
> as "BOOL", only those made using option.  So if you say:
>
>        set(VAR_BOOL OFF CACHE BOOL "A boolean variable")
>
> Then supplying '-DVAR_BOOL=oN' on the command line will substitute to 'oN'
> and not 'ON'.  Changing this to an option gets the normalization back:
>
>        option(VAR_BOOL "A boolean variable")
>
>
> ==> SOURCE INVESTIGATION <==
>
> Since I'm curious about CMake and understanding what it does, I looked into
> the source.  I gather the short answer is that any current appearance of
> standardization for boolean substitution is unintentional.
>
> I'm not sure how valuable establishing such a standard would be... since it
> could apply only to 'option' variables (and those 'set' variables that were
> declared to be in the cache and BOOL).  Though it doesn't look too hard to
> do.  All cached variables seem to be added through
> cmCacheManager::AddCacheEntry:
>
>
>  http://public.kitware.com/cgi-bin/viewcvs.cgi/Source/cmCacheManager.cxx?revision=1.112&root=CMake&view=markup
>
> So a quick hack would be to change the start of that function to:
>
>        CacheEntry& e = this->Cache[key];
>        e.Properties.SetCMakeInstance(this->CMakeInstance);
>        if ( value )
>                {
>                if ( type == cmCacheManager::BOOL )
>                        e.Value = cmSystemTools::IsOn(value) ? "ON" : "OFF";
>                else
>                        e.Value = value;
>                e.Initialized = true;
>                }
>        else
>                ...
>
> But you're still stuck with having to #define ON and OFF... which I don't
> particularly care for.  So perhaps a parameter to configure_file would help?
>  It could tell CMake to turn '#cmakedefine VAR_THAT_IS_OFF' into  '#define
> VAR_THAT_IS_OFF 0'.  Or rather than a parameter, there might just a new
> keyword (such as '#cmakedefine01 VAR_THAT_IS_OFF'.)
>
> Any thoughts?
>
> ---Brian
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.cmake.org/mailman/listinfo/cmake
>


More information about the CMake mailing list