set
---

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>... [PARENT_SCOPE])

Set the given ``<variable>`` in the current function or directory scope.

If the ``PARENT_SCOPE`` option is given 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). The previous state of the variable's value stays the
same in the current scope (e.g., if it was undefined before, it is still
undefined and if it had a value, it is still that value).

Set Cache Entry
^^^^^^^^^^^^^^^

::

  set(<variable> <value>... CACHE <type> <docstring> [FORCE])

Set the given cache ``<variable>`` (cache entry).  Since cache entries
are meant to provide user-settable values this does not overwrite
existing cache entries by default.  Use the ``FORCE`` option to
overwrite existing entries.

The ``<type>`` must be specified as one of:

``BOOL``
  Boolean ``ON/OFF`` value.  :manual:`cmake-gui(1)` offers a checkbox.

``FILEPATH``
  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(ENV{<variable>} <value>...)

Set the current process environment ``<variable>`` to the given value.
