| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- project
- -------
- Set the name of the project.
- Synopsis
- ^^^^^^^^
- .. code-block:: cmake
- project(<PROJECT-NAME> [<language-name>...])
- project(<PROJECT-NAME>
- [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
- [COMPAT_VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
- [SPDX_LICENSE <license-string>]
- [DESCRIPTION <description-string>]
- [HOMEPAGE_URL <url-string>]
- [LANGUAGES <language-name>...])
- Sets the name of the project, and stores it in the variable
- :variable:`PROJECT_NAME`. When called from the top-level
- ``CMakeLists.txt`` also stores the project name in the
- variable :variable:`CMAKE_PROJECT_NAME`.
- Also sets the variables:
- :variable:`PROJECT_SOURCE_DIR`, :variable:`<PROJECT-NAME>_SOURCE_DIR`
- Absolute path to the source directory for the project.
- :variable:`PROJECT_BINARY_DIR`, :variable:`<PROJECT-NAME>_BINARY_DIR`
- Absolute path to the binary directory for the project.
- :variable:`PROJECT_IS_TOP_LEVEL`, :variable:`<PROJECT-NAME>_IS_TOP_LEVEL`
- .. versionadded:: 3.21
- Boolean value indicating whether the project is top-level.
- Further variables are set by the optional arguments described in `Options`_
- further below. Where an option is not given, its corresponding variable is
- set to the empty string.
- Note that variables of the form ``<name>_SOURCE_DIR`` and ``<name>_BINARY_DIR``
- may also be set by other commands before ``project()`` is called (see the
- :command:`FetchContent_MakeAvailable` command for one example).
- Projects should not rely on ``<PROJECT-NAME>_SOURCE_DIR`` or
- ``<PROJECT-NAME>_BINARY_DIR`` holding a particular value outside of the scope
- of the call to ``project()`` or one of its child scopes.
- .. versionchanged:: 3.30
- ``<PROJECT-NAME>_SOURCE_DIR``, ``<PROJECT-NAME>_BINARY_DIR``, and
- ``<PROJECT-NAME>_IS_TOP_LEVEL``, if already set as normal variables when
- ``project(<PROJECT-NAME> ...)`` is called, are updated by the call.
- Cache entries by the same names are always set as before.
- See release notes for 3.30.3, 3.30.4, and 3.30.5 for details.
- .. versionchanged:: 3.31
- ``<PROJECT-NAME>_SOURCE_DIR``, ``<PROJECT-NAME>_BINARY_DIR``, and
- ``<PROJECT-NAME>_IS_TOP_LEVEL`` are always set as normal variables by
- ``project(<PROJECT-NAME> ...)``. See policy :policy:`CMP0180`.
- Cache entries by the same names are always set as before.
- Options
- ^^^^^^^
- The options are:
- ``VERSION <version>``
- Optional; may not be used unless policy :policy:`CMP0048` is
- set to ``NEW``.
- Takes a ``<version>`` argument composed of non-negative integer components,
- i.e. ``<major>[.<minor>[.<patch>[.<tweak>]]]``,
- and sets the variables
- * :variable:`PROJECT_VERSION`,
- :variable:`<PROJECT-NAME>_VERSION`
- * :variable:`PROJECT_VERSION_MAJOR`,
- :variable:`<PROJECT-NAME>_VERSION_MAJOR`
- * :variable:`PROJECT_VERSION_MINOR`,
- :variable:`<PROJECT-NAME>_VERSION_MINOR`
- * :variable:`PROJECT_VERSION_PATCH`,
- :variable:`<PROJECT-NAME>_VERSION_PATCH`
- * :variable:`PROJECT_VERSION_TWEAK`,
- :variable:`<PROJECT-NAME>_VERSION_TWEAK`.
- .. versionadded:: 3.12
- When the ``project()`` command is called from the top-level
- ``CMakeLists.txt``, then the version is also stored in the variable
- :variable:`CMAKE_PROJECT_VERSION`.
- ``COMPAT_VERSION <version>``
- .. versionadded:: 4.1
- .. note::
- Experimental. Gated by ``CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_INFO``.
- Optional; requires ``VERSION`` also be set.
- Takes a ``<version>`` argument composed of non-negative integer components,
- i.e. ``<major>[.<minor>[.<patch>[.<tweak>]]]``,
- and sets the variables
- * :variable:`PROJECT_COMPAT_VERSION`,
- :variable:`<PROJECT-NAME>_COMPAT_VERSION`
- When the ``project()`` command is called from the top-level
- ``CMakeLists.txt``, then the compatibility version is also stored in the
- variable :variable:`CMAKE_PROJECT_COMPAT_VERSION`.
- ``SPDX_LICENSE <license-string>``
- .. versionadded:: 4.2
- Optional.
- Sets the variables
- * :variable:`PROJECT_SPDX_LICENSE`,
- :variable:`<PROJECT-NAME>_SPDX_LICENSE`
- to ``<license-string>``, which shall be a |SPDX|_ (SPDX)
- `License Expression`_ that describes the license(s) of the project as a
- whole, including documentation, resources, or other materials distributed
- with the project, in addition to software artifacts. See the SPDX
- `License List`_ for a list of commonly used licenses and their identifiers.
- See the :prop_tgt:`SPDX_LICENSE` property for specifying the license(s) on
- individual software artifacts.
- .. _SPDX: https://spdx.dev/
- .. |SPDX| replace:: System Package Data Exchange
- .. _License Expression: https://spdx.github.io/spdx-spec/v3.0.1/annexes/spdx-license-expressions/
- .. _License List: https://spdx.org/licenses/
- ``DESCRIPTION <description-string>``
- .. versionadded:: 3.9
- Optional.
- Sets the variables
- * :variable:`PROJECT_DESCRIPTION`, :variable:`<PROJECT-NAME>_DESCRIPTION`
- to ``<description-string>``.
- It is recommended that this description is a relatively short string,
- usually no more than a few words.
- When the ``project()`` command is called from the top-level ``CMakeLists.txt``,
- then the description is also stored in the variable :variable:`CMAKE_PROJECT_DESCRIPTION`.
- .. versionadded:: 3.12
- Added the ``<PROJECT-NAME>_DESCRIPTION`` variable.
- ``HOMEPAGE_URL <url-string>``
- .. versionadded:: 3.12
- Optional.
- Sets the variables
- * :variable:`PROJECT_HOMEPAGE_URL`, :variable:`<PROJECT-NAME>_HOMEPAGE_URL`
- to ``<url-string>``, which should be the canonical home URL for the project.
- When the ``project()`` command is called from the top-level ``CMakeLists.txt``,
- then the URL also is stored in the variable :variable:`CMAKE_PROJECT_HOMEPAGE_URL`.
- ``LANGUAGES <language-name>...``
- Optional.
- Can also be specified without ``LANGUAGES`` keyword per the first, short signature.
- Selects which programming languages are needed to build the project.
- .. include:: include/SUPPORTED_LANGUAGES.rst
- By default ``C`` and ``CXX`` are enabled if no language options are given.
- Specify language ``NONE``, or use the ``LANGUAGES`` keyword and list no languages,
- to skip enabling any languages.
- The variables set through the ``VERSION``, ``COMPAT_VERSION``,
- ``SPDX_LICENSE``, ``DESCRIPTION`` and ``HOMEPAGE_URL`` options are
- intended for use as default values in package metadata and documentation.
- The :command:`export` and :command:`install` commands use these accordingly
- when generating |CPS| package descriptions.
- .. |CPS| replace:: Common Package Specification
- .. _`Code Injection`:
- Code Injection
- ^^^^^^^^^^^^^^
- A number of variables can be defined by the user to specify files to include
- at different points during the execution of the ``project()`` command.
- The following outlines the steps performed during a ``project()`` call:
- * .. versionadded:: 3.15
- For every ``project()`` call regardless of the project
- name, include the file(s) and module(s) named by
- :variable:`CMAKE_PROJECT_INCLUDE_BEFORE`, if set.
- * .. versionadded:: 3.17
- If the ``project()`` command specifies ``<PROJECT-NAME>`` as its project
- name, include the file(s) and module(s) named by
- :variable:`CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE_BEFORE`, if set.
- * Set the various project-specific variables detailed in the `Synopsis`_
- and `Options`_ sections above.
- * For the very first ``project()`` call only:
- * If :variable:`CMAKE_TOOLCHAIN_FILE` is set, read it at least once.
- It may be read multiple times and it may also be read again when
- enabling languages later (see below).
- * Set the variables describing the host and target platforms.
- Language-specific variables might or might not be set at this point.
- On the first run, the only language-specific variables that might be
- defined are those a toolchain file may have set. On subsequent runs,
- language-specific variables cached from a previous run may be set.
- * .. versionadded:: 3.24
- Include each file listed in :variable:`CMAKE_PROJECT_TOP_LEVEL_INCLUDES`,
- if set. The variable is ignored by CMake thereafter.
- * Enable any languages specified in the call, or the default languages if
- none were provided. The toolchain file may be re-read when enabling a
- language for the first time.
- * .. versionadded:: 3.15
- For every ``project()`` call regardless of the project
- name, include the file(s) and module(s) named by
- :variable:`CMAKE_PROJECT_INCLUDE`, if set.
- * If the ``project()`` command specifies ``<PROJECT-NAME>`` as its project
- name, include the file(s) and module(s) named by
- :variable:`CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE`, if set.
- Usage
- ^^^^^
- The top-level ``CMakeLists.txt`` file for a project must contain a
- literal, direct call to the ``project()`` command; loading one
- through the :command:`include` command is not sufficient. If no such
- call exists, CMake will issue a warning and pretend there is a
- ``project(Project)`` at the top to enable the default languages
- (``C`` and ``CXX``).
- .. note::
- Call the ``project()`` command near the top of the top-level
- ``CMakeLists.txt``, but *after* calling :command:`cmake_minimum_required`.
- It is important to establish version and policy settings before invoking
- other commands whose behavior they may affect and for this reason the
- ``project()`` command will issue a warning if this order is not kept.
- See also policy :policy:`CMP0000`.
|