[CMake] Master-switch options

Oliver kfsone Smith osmith at playnet.com
Thu Mar 22 11:31:37 EDT 2012


I'm looking to have a certain group of variables controlled primarily by 
one master setting

I want the cache value to be ignored when the user explicitly provides 
the master variable on the command line and whenever the value of the 
variable changes.

Put another way: When the user EXPLICITLY specifies or changes the value 
of MasterVariable, I want to delete the values of 
${${AffectedVariables_MasterVariable}} from the cache.

Example:

     Master: "VARIANT"
     Controls: SSE2, SSE3, PACKAGE_FORMAT
     Setting1: VARIANT=Internal, SSE2=OFF, SSE3=OFF, PACKAGE_FORMAT=TGZ
     Setting83: VARIANT=Eval, SSE2=ON, SSE3=ON, PACKAGE_FORMAT=DEB
     Setting509: VARIANT=Client623, SSE=ON, SSE3=OFF, PACKAGE_FORMAT=RPM
     PIZZA: XL
     ...

CMakeCache.txt  values:
   VARIANT=Internal, SSE2=ON, SSE3=OFF, PACKAGE_FORMAT=TGZ, PIZZA=L
$ cmake -DVARIANT=Internal -DPIZZA=Medium
VARIANT=Internal, *SSE2=OFF*, SSE3=OFF, PACKAGE_FORMAT=TGZ, PIZZA=M
(SSE2 was reset to it's default value)
$ cmake -DPACKAGE_FORMAT=RPM -DVARIANT=Internal
VARIANT=Internal, SSE2=OFF, SSE3=OFF, PACKAGE_FORMAT=RPM, PIZZA=M
(All values were reset but the -DPACKAGE_FORMAT overrode the default of 
that option, non-controlled value, PIZZA, left alone)
$ cmake -DEval
VARIANT=Eval, *SSE2=ON*, *SSE3=ON*, *PACKAGE_FORMAT=DEB*, PIZZA=M
(previously user-specified package_format was reset because it was not 
explicitly provided)
$ cmake .
(No changes because no VARIANT explicitly specified)

If this was being implemented by deleting the CMakeCache.txt file, then 
the value of "PIZZA" would be continually clobbered along with all the 
other values...

Is there a way to do this? I'm wanting to build it something like:

    OPTION(SSE2 "Enable SSE2 instructions" OFF)    -- General default.
    ...

    IF ( VARIANT BECOMES "Internal" )
       DEFAULT(SSE2 OFF)
       DEFAULT(SSE3 OFF)
       DEFAULT(PACKAGE_FORMAT "TGZ")
    ELSEIF ( VARIANT BECOMES "Eval" )
       DEFAULT(SSE2 ON)
       DEFAULT(SSE3 OFF)
       DEFAULT(PACKAGE_FORMAT "DEB")
    ELSEIF ( VARIANT BECOMES "Client623" )
       DEFAULT(SSE2 ON)
       DEFAULT(SSE3 OFF)
       DEFAULT(PACKAGE_FORMAT "RPM")
    ELSEIF ...

Or perhaps the slightly less error-prone:

OPTIONS(<name of control variable> VALUE <value to default to> DEFAULTS
                     VARIABLE:VALUE
                      ...)

This would then complain about the following, because the second OPTIONS 
has a different list for the same control as the previous incarnation:

     OPTIONS(VARIANT VALUE "Internal" DEFAULTS
                         SSE2 OFF
                         SSE3 OFF
                         PACKAGE_FORMAT "TGZ"
     )
     OPTIONS(VARIANT VALUE "Eval" DEFAULTS
                         SSE2 ON
                         SES3 OFF    # Typo
                         PACKAGE_FORMAT "DEB"
     )
     OPTIONS(VARIANT VALUE "Client623" DEFAULTS
                         SSE2 ON
                         SSE3 OFF
                         PACKAGE_FORMAT "RPM"
     )

Another advantage of this is that the GUI/CCMake could use these to 
build a drop-down list of "VARIANT" settings, and CMake itself could 
ascertain that "-DVARIANT=Intrenal" (typo) is invalid (-DVARIANT is used 
in OPTIONS but there is no OPTIONS that matches Intrenal).

- Oliver

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20120322/7f852eeb/attachment-0001.htm>


More information about the CMake mailing list