Merge topic 'doc-set-command'

77d466ec Help: Document conversion of PATH/FILEPATH cache values to absolute paths
91eb7363 Help: Rewrite 'set` command documentation
c6593511 Help: Add link target to cmake-language.7 variables section
This commit is contained in:
Brad King 2015-04-02 12:57:26 -04:00 committed by CMake Topic Stage
commit a5b4d19769
3 changed files with 82 additions and 99 deletions

View File

@ -1,116 +1,89 @@
set set
--- ---
Set a CMake, cache or environment variable to a given value. Set a normal, cache, or environment variable to a given value.
See the :ref:`cmake-language(7) variables <CMake Language Variables>`
documentation for the scopes and interaction of normal variables
and cache entries.
Signatures of this command that specify a ``<value>...`` placeholder
expect zero or more arguments. Multiple arguments will be joined as
a :ref:`;-list <CMake Language Lists>` to form the actual variable
value to be set. Zero arguments will cause normal variables to be
unset. See the :command:`unset` command to unset variables explicitly.
Set Normal Variable
^^^^^^^^^^^^^^^^^^^
:: ::
set(<variable> <value> set(<variable> <value>... [PARENT_SCOPE])
[[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])
Within CMake sets <variable> to the value <value>. <value> is Set the given ``<variable>`` in the current function or directory scope.
expanded before <variable> is set to it. Normally, set will set a
regular CMake variable. If CACHE is present, then the <variable> is If the ``PARENT_SCOPE`` option is given the variable will be set in
put in the cache instead, unless it is already in the cache. See the scope above the current scope. Each new directory or function
section 'Variable types in CMake' below for details of regular and creates a new scope. This command will set the value of a variable
cache variables and their interactions. If CACHE is used, <type> and into the parent directory or calling function (whichever is applicable
<docstring> are required. <type> is used by the CMake GUI to choose a to the case at hand).
widget with which the user sets a value. The value for <type> may be
one of Set Cache Entry
^^^^^^^^^^^^^^^
:: ::
FILEPATH = File chooser dialog. set(<variable> <value>... CACHE <type> <docstring> [FORCE])
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 Set the given cache ``<variable>`` (cache entry). Since cache entries
will not be shown to the user in tools like cmake-gui. This is are meant to provide user-settable values this does not overwrite
intended for values that should be persisted in the cache, but which existing cache entries by default. Use the ``FORCE`` option to
users should not normally change. INTERNAL implies FORCE. overwrite existing entries.
Normally, set(...CACHE...) creates cache variables, but does not The ``<type>`` must be specified as one of:
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 ``BOOL``
above the current scope. Each new directory or function creates a new Boolean ``ON/OFF`` value. :manual:`cmake-gui(1)` offers a checkbox.
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 ``FILEPATH``
set. See also: the unset() command. Path to a file on disk. :manual:`cmake-gui(1)` offers a file dialog.
``PATH``
Path to a directory on disk. :manual:`cmake-gui(1)` offers a file dialog.
``STRING``
A line of text. :manual:`cmake-gui(1)` offers a text field or a
drop-down selection if the :prop_cache:`STRINGS` cache entry
property is set.
``INTERNAL``
A line of text. :manual:`cmake-gui(1)` does not show internal entries.
They may be used to store variables persistently across runs.
Use of this type implies ``FORCE``.
The ``<docstring>`` must be specified as a line of text providing
a quick summary of the option for presentation to :manual:`cmake-gui(1)`
users.
If the cache entry does not exist prior to the call or the ``FORCE``
option is given then the cache entry will be set to the given value.
Furthermore, any normal variable binding in the current scope will
be removed to expose the newly cached value to any immediately
following evaluation.
It is possible for the cache entry to exist prior to the call but
have no type set if it was created on the :manual:`cmake(1)` command
line by a user through the ``-D<var>=<value>`` option without
specifying a type. In this case the ``set`` command will add the
type. Furthermore, if the ``<type>`` is ``PATH`` or ``FILEPATH``
and the ``<value>`` provided on the command line is a relative path,
then the ``set`` command will treat the path as relative to the
current working directory and convert it to an absolute path.
Set Environment Variable
^^^^^^^^^^^^^^^^^^^^^^^^
:: ::
set(<variable> <value1> ... <valueN>) set(ENV{<variable>} <value>...)
In this case <variable> is set to a semicolon separated list of Set the current process environment ``<variable>`` to the given value.
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.

View File

@ -10,7 +10,7 @@
containing SET commands that use the CACHE option, not a containing SET commands that use the CACHE option, not a
cache-format file. cache-format file.
``-D <var>:<type>=<value>`` ``-D <var>:<type>=<value>, -D <var>=<value>``
Create a cmake cache entry. Create a cmake cache entry.
When cmake is first run in an empty build tree, it creates a When cmake is first run in an empty build tree, it creates a
@ -19,6 +19,14 @@
takes priority over the project's default value. The option may be takes priority over the project's default value. The option may be
repeated for as many cache entries as desired. repeated for as many cache entries as desired.
If the ``:<type>`` portion is given it must be one of the types
specified by the :command:`set` command documentation for its
``CACHE`` signature.
If the ``:<type>`` portion is omitted the entry will be created
with no type if it does not exist with a type already. If a
command in the project sets the type to ``PATH`` or ``FILEPATH``
then the ``<value>`` will be converted to an absolute path.
``-U <globbing_expr>`` ``-U <globbing_expr>``
Remove matching entries from CMake cache. Remove matching entries from CMake cache.

View File

@ -485,6 +485,8 @@ The :command:`macro`/:command:`endmacro`, and
:command:`function`/:command:`endfunction` commands delimit :command:`function`/:command:`endfunction` commands delimit
code blocks to be recorded for later invocation as commands. code blocks to be recorded for later invocation as commands.
.. _`CMake Language Variables`:
Variables Variables
========= =========