| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- set
- ---
- Set a CMake, cache or environment variable to a given value.
- ::
- set(<variable> <value>
- [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])
- Within CMake sets <variable> to the value <value>. <value> is
- expanded before <variable> is set to it. Normally, set will set a
- regular CMake variable. If CACHE is present, then the <variable> is
- put in the cache instead, unless it is already in the cache. See
- section 'Variable types in CMake' below for details of regular and
- cache variables and their interactions. If CACHE is used, <type> and
- <docstring> are required. <type> is used by the CMake GUI to choose a
- widget with which the user sets a value. The value for <type> may be
- one of
- ::
- FILEPATH = File chooser dialog.
- PATH = Directory chooser dialog.
- STRING = Arbitrary string.
- BOOL = Boolean ON/OFF checkbox.
- INTERNAL = No GUI entry (used for persistent variables).
- If <type> is INTERNAL, the cache variable is marked as internal, and
- will not be shown to the user in tools like cmake-gui. This is
- intended for values that should be persisted in the cache, but which
- users should not normally change. INTERNAL implies FORCE.
- Normally, set(...CACHE...) creates cache variables, but does not
- modify them. If FORCE is specified, the value of the cache variable
- is set, even if the variable is already in the cache. This should
- normally be avoided, as it will remove any changes to the cache
- variable's value by the user.
- If PARENT_SCOPE is present, the variable will be set in the scope
- above the current scope. Each new directory or function creates a new
- scope. This command will set the value of a variable into the parent
- directory or calling function (whichever is applicable to the case at
- hand). PARENT_SCOPE cannot be combined with CACHE.
- If <value> is not specified then the variable is removed instead of
- set. See also: the unset() command.
- ::
- set(<variable> <value1> ... <valueN>)
- In this case <variable> is set to a semicolon separated list of
- values.
- <variable> can be an environment variable such as:
- ::
- set( ENV{PATH} /home/martink )
- in which case the environment variable will be set.
- *** Variable types in CMake ***
- In CMake there are two types of variables: normal variables and cache
- variables. Normal variables are meant for the internal use of the
- script (just like variables in most programming languages); they are
- not persisted across CMake runs. Cache variables (unless set with
- INTERNAL) are mostly intended for configuration settings where the
- first CMake run determines a suitable default value, which the user
- can then override, by editing the cache with tools such as ccmake or
- cmake-gui. Cache variables are stored in the CMake cache file, and
- are persisted across CMake runs.
- Both types can exist at the same time with the same name but different
- values. When ${FOO} is evaluated, CMake first looks for a normal
- variable 'FOO' in scope and uses it if set. If and only if no normal
- variable exists then it falls back to the cache variable 'FOO'.
- Some examples:
- The code 'set(FOO "x")' sets the normal variable 'FOO'. It does not
- touch the cache, but it will hide any existing cache value 'FOO'.
- The code 'set(FOO "x" CACHE ...)' checks for 'FOO' in the cache,
- ignoring any normal variable of the same name. If 'FOO' is in the
- cache then nothing happens to either the normal variable or the cache
- variable. If 'FOO' is not in the cache, then it is added to the
- cache.
- Finally, whenever a cache variable is added or modified by a command,
- CMake also *removes* the normal variable of the same name from the
- current scope so that an immediately following evaluation of it will
- expose the newly cached value.
- Normally projects should avoid using normal and cache variables of the
- same name, as this interaction can be hard to follow. However, in
- some situations it can be useful. One example (used by some
- projects):
- A project has a subproject in its source tree. The child project has
- its own CMakeLists.txt, which is included from the parent
- CMakeLists.txt using add_subdirectory(). Now, if the parent and the
- child project provide the same option (for example a compiler option),
- the parent gets the first chance to add a user-editable option to the
- cache. Normally, the child would then use the same value that the
- parent uses. However, it may be necessary to hard-code the value for
- the child project's option while still allowing the user to edit the
- value used by the parent project. The parent project can achieve this
- simply by setting a normal variable with the same name as the option
- in a scope sufficient to hide the option's cache variable from the
- child completely. The parent has already set the cache variable, so
- the child's set(...CACHE...) will do nothing, and evaluating the
- option variable will use the value from the normal variable, which
- hides the cache variable.
|