CMake/Tutorials/SettingVariableGroups: Difference between revisions
From KitwarePublic
Jump to navigationJump to search
Daviddoria (talk | contribs) mNo edit summary |
Daviddoria (talk | contribs) No edit summary |
||
Line 12: | Line 12: | ||
# Add options to build specific targets | # Add options to build specific targets | ||
option(build_Green " | option(build_Green "Green doc string.") | ||
option(build_Blue " | option(build_Blue "Blue doc string.") | ||
# Add options to allow enabling/disabling of a set of targets | # Add options to allow enabling/disabling of a set of targets | ||
option(TurnOnAll "all") | option(TurnOnAll "Turn on all build_ variables.") | ||
option(TurnOffAll "all") | option(TurnOffAll "Turn off all build_ variables.") | ||
# A function to get all user defined variables with a specified prefix | # A function to get all user defined variables with a specified prefix | ||
function (getListOfVarsStartingWith _prefix _varResult) | function (getListOfVarsStartingWith _prefix _varResult) | ||
get_cmake_property(_vars | get_cmake_property(_vars CACHE_VARIABLES) | ||
string (REGEX MATCHALL "(^|;)${_prefix}[A-Za-z0-9_]*" _matchedVars "${_vars}") | string (REGEX MATCHALL "(^|;)${_prefix}[A-Za-z0-9_]*" _matchedVars "${_vars}") | ||
set (${_varResult} ${_matchedVars} PARENT_SCOPE) | set (${_varResult} ${_matchedVars} PARENT_SCOPE) | ||
Line 34: | Line 34: | ||
getListOfVarsStartingWith("build_" matchedVars) | getListOfVarsStartingWith("build_" matchedVars) | ||
foreach (_var IN LISTS matchedVars) | foreach (_var IN LISTS matchedVars) | ||
message("Turn on ${item}") | #message("Turn on ${item}") | ||
set(${_var} ON CACHE BOOL | get_property(currentHelpString CACHE "${_var}" PROPERTY HELPSTRING) | ||
set(${_var} ON CACHE BOOL ${currentHelpString} FORCE) | |||
endforeach() | endforeach() | ||
set(TurnOnAll OFF CACHE BOOL | get_property(turnOnHelpString CACHE "TurnOnAll" PROPERTY HELPSTRING) | ||
set(TurnOnAll OFF CACHE BOOL ${turnOnHelpString} FORCE) # Set itself back to off, as this is a one time thing. | |||
endif() | endif() | ||
Line 45: | Line 47: | ||
getListOfVarsStartingWith("build_" matchedVars) | getListOfVarsStartingWith("build_" matchedVars) | ||
foreach (_var IN LISTS matchedVars) | foreach (_var IN LISTS matchedVars) | ||
message("Turn off ${item}") | #message("Turn off ${item}") | ||
set(${_var} OFF CACHE BOOL | get_property(currentHelpString CACHE "${_var}" PROPERTY HELPSTRING) | ||
set(${_var} OFF CACHE BOOL ${currentHelpString} FORCE) | |||
endforeach() | endforeach() | ||
set(TurnOffAll OFF CACHE BOOL | get_property(turnOffHelpString CACHE "TurnOffAll" PROPERTY HELPSTRING) | ||
set(TurnOffAll OFF CACHE BOOL ${turnOffHelpString} FORCE) # Set itself back to off, as this is a one time thing. | |||
endif() | endif() | ||
Line 59: | Line 63: | ||
# Conditional executables | # Conditional executables | ||
if(build_Green) | if(build_Green) | ||
ADD_EXECUTABLE( | ADD_EXECUTABLE(Green GroupVariables.cpp) | ||
endif() | endif() | ||
if(build_Blue) | if(build_Blue) | ||
ADD_EXECUTABLE( | ADD_EXECUTABLE(Blue GroupVariables.cpp) | ||
# other options here | # other options here | ||
endif() | endif() | ||
</source> | </source> |
Revision as of 14:16, 24 September 2012
<source lang="cmake"> cmake_minimum_required(VERSION 2.6)
- The idea of this demo is to show how to set a group of CMake variables together.
- A common use case is to allow easy enabling/disabling of a large set of targets, while
- maintaining manual individual target control. This is in contrast to a BUILD_ALL style variable,
- where targets are build if a corresponding variable to the target is set, OR the BUILD_ALL variable
- is set. The problem with this method is that if you want to set "all but one" of the targets to ON,
- it is not possible without manually setting all N-1 of the targets to OFF.
PROJECT(VariablePrefix)
- Add options to build specific targets
option(build_Green "Green doc string.") option(build_Blue "Blue doc string.")
- Add options to allow enabling/disabling of a set of targets
option(TurnOnAll "Turn on all build_ variables.") option(TurnOffAll "Turn off all build_ variables.")
- A function to get all user defined variables with a specified prefix
function (getListOfVarsStartingWith _prefix _varResult)
get_cmake_property(_vars CACHE_VARIABLES) string (REGEX MATCHALL "(^|;)${_prefix}[A-Za-z0-9_]*" _matchedVars "${_vars}") set (${_varResult} ${_matchedVars} PARENT_SCOPE)
endfunction()
- Mass toggle "commands". These variables (TurnOnAll and TurnOffAll) let you
- enable or disable all of the variables starting with "build_". This is an abuse
- of a CMake "variable" to be used as an instruction to issue a command once.
- For example, when TurnOnAll is set to ON and then configure is run, the following
- block is run once, and then TurnOnAll sets itself back to OFF.
if(TurnOnAll)
getListOfVarsStartingWith("build_" matchedVars) foreach (_var IN LISTS matchedVars) #message("Turn on ${item}") get_property(currentHelpString CACHE "${_var}" PROPERTY HELPSTRING) set(${_var} ON CACHE BOOL ${currentHelpString} FORCE) endforeach()
get_property(turnOnHelpString CACHE "TurnOnAll" PROPERTY HELPSTRING) set(TurnOnAll OFF CACHE BOOL ${turnOnHelpString} FORCE) # Set itself back to off, as this is a one time thing.
endif()
- In exactly the same manner, if TurnOffAll is set to ON, all of the variables starting with build_ are set to OFF.
if(TurnOffAll)
getListOfVarsStartingWith("build_" matchedVars) foreach (_var IN LISTS matchedVars) #message("Turn off ${item}") get_property(currentHelpString CACHE "${_var}" PROPERTY HELPSTRING) set(${_var} OFF CACHE BOOL ${currentHelpString} FORCE) endforeach()
get_property(turnOffHelpString CACHE "TurnOffAll" PROPERTY HELPSTRING) set(TurnOffAll OFF CACHE BOOL ${turnOffHelpString} FORCE) # Set itself back to off, as this is a one time thing.
endif()
- Of course turning on all variables at the same time as turning off all variables does not make sense.
if(TurnOnAllTargets AND TurnOffAllTargets)
message(FATAL_ERROR "You cannot turn targets on and off at the same time!")
endif()
- Conditional executables
if(build_Green)
ADD_EXECUTABLE(Green GroupVariables.cpp)
endif()
if(build_Blue)
ADD_EXECUTABLE(Blue GroupVariables.cpp) # other options here
endif()
</source>