| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- cmake_parse_arguments
- ---------------------
- Parse function or macro arguments.
- .. code-block:: cmake
- cmake_parse_arguments(<prefix> <options> <one_value_keywords>
- <multi_value_keywords> <args>...)
- cmake_parse_arguments(PARSE_ARGV <N> <prefix> <options>
- <one_value_keywords> <multi_value_keywords>)
- .. versionadded:: 3.5
- This command is implemented natively. Previously, it has been defined in the
- module :module:`CMakeParseArguments`.
- This command is for use in macros or functions.
- It processes the arguments given to that macro or function,
- and defines a set of variables which hold the values of the
- respective options.
- The first signature reads arguments passed in the ``<args>...``.
- This may be used in either a :command:`macro` or a :command:`function`.
- .. versionadded:: 3.7
- The ``PARSE_ARGV`` signature is only for use in a :command:`function`
- body. In this case, the arguments that are parsed come from the
- ``ARGV#`` variables of the calling function. The parsing starts with
- the ``<N>``-th argument, where ``<N>`` is an unsigned integer.
- This allows for the values to have special characters like ``;`` in them.
- The ``<options>`` argument contains all options for the respective function
- or macro. These are keywords that have no value following them, like the
- ``OPTIONAL`` keyword of the :command:`install` command.
- The ``<one_value_keywords>`` argument contains all keywords for this function
- or macro which are followed by one value, like the ``DESTINATION`` keyword of
- the :command:`install` command.
- The ``<multi_value_keywords>`` argument contains all keywords for this
- function or macro which can be followed by more than one value, like the
- ``TARGETS`` or ``FILES`` keywords of the :command:`install` command.
- .. versionchanged:: 3.5
- All keywords must be unique. Each keyword can only be specified
- once in any of the ``<options>``, ``<one_value_keywords>``, or
- ``<multi_value_keywords>``. A warning will be emitted if uniqueness is
- violated.
- When done, ``cmake_parse_arguments`` will consider for each of the
- keywords listed in ``<options>``, ``<one_value_keywords>``, and
- ``<multi_value_keywords>``, a variable composed of the given ``<prefix>``
- followed by ``"_"`` and the name of the respective keyword. For
- ``<one_value_keywords>`` and ``<multi_value_keywords>``, these variables
- will then hold the respective value(s) from the argument list, or be undefined
- if the associated keyword was not given (policy :policy:`CMP0174` can also
- affect the behavior for ``<one_value_keywords>``). For the ``<options>``
- keywords, these variables will always be defined, and they will be set to
- ``TRUE`` if the keyword is present, or ``FALSE`` if it is not.
- All remaining arguments are collected in a variable
- ``<prefix>_UNPARSED_ARGUMENTS`` that will be undefined if all arguments
- were recognized. This can be checked afterwards to see
- whether your macro or function was called with unrecognized parameters.
- .. versionadded:: 3.15
- ``<one_value_keywords>`` and ``<multi_value_keywords>`` that were given no
- values at all are collected in a variable
- ``<prefix>_KEYWORDS_MISSING_VALUES`` that will be undefined if all keywords
- received values. This can be checked to see if there were keywords without
- any values given.
- .. versionchanged:: 3.31
- If a ``<one_value_keyword>`` is followed by an empty string as its value,
- policy :policy:`CMP0174` controls whether a corresponding
- ``<prefix>_<keyword>`` variable is defined or not.
- Choose a ``<prefix>`` carefully to avoid clashing with existing variable names.
- When used inside a function, it is usually suitable to use the prefix ``arg``.
- There is a very strong convention that all keywords are fully uppercase, so
- this prefix results in variables of the form ``arg_SOME_KEYWORD``. This makes
- the code more readable, and it minimizes the chance of clashing with cache
- variables, which also have a strong convention of being all uppercase.
- .. code-block:: cmake
- function(my_install)
- set(options OPTIONAL FAST)
- set(oneValueArgs DESTINATION RENAME)
- set(multiValueArgs TARGETS CONFIGURATIONS)
- cmake_parse_arguments(PARSE_ARGV 0 arg
- "${options}" "${oneValueArgs}" "${multiValueArgs}"
- )
- # The above will set or unset variables with the following names:
- # arg_OPTIONAL
- # arg_FAST
- # arg_DESTINATION
- # arg_RENAME
- # arg_TARGETS
- # arg_CONFIGURATIONS
- #
- # The following will also be set or unset:
- # arg_UNPARSED_ARGUMENTS
- # arg_KEYWORDS_MISSING_VALUES
- When used inside a macro, ``arg`` might not be a suitable prefix because the
- code will affect the calling scope. If another macro also called in the same
- scope were to use ``arg`` in its own call to ``cmake_parse_arguments()``,
- and if there are any common keywords between the two macros, the later call's
- variables can overwrite or remove those of the earlier macro's call.
- Therefore, it is advisable to incorporate something unique from the macro name
- in the ``<prefix>``, such as ``arg_lowercase_macro_name``.
- .. code-block:: cmake
- macro(my_install)
- set(options OPTIONAL FAST)
- set(oneValueArgs DESTINATION RENAME)
- set(multiValueArgs TARGETS CONFIGURATIONS)
- cmake_parse_arguments(arg_my_install
- "${options}" "${oneValueArgs}" "${multiValueArgs}"
- ${ARGN}
- )
- # ...
- endmacro()
- macro(my_special_install)
- # NOTE: Has the same keywords as my_install()
- set(options OPTIONAL FAST)
- set(oneValueArgs DESTINATION RENAME)
- set(multiValueArgs TARGETS CONFIGURATIONS)
- cmake_parse_arguments(arg_my_special_install
- "${options}" "${oneValueArgs}" "${multiValueArgs}"
- ${ARGN}
- )
- # ...
- endmacro()
- Suppose the above macros are called one after the other, like so:
- .. code-block:: cmake
- my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub CONFIGURATIONS)
- my_special_install(TARGETS barry DESTINATION sbin RENAME FAST)
- After these two calls, the following describes the variables that will be
- set or unset::
- arg_my_install_OPTIONAL = TRUE
- arg_my_install_FAST = FALSE # was not present in call to my_install
- arg_my_install_DESTINATION = "bin"
- arg_my_install_RENAME <UNSET> # was not present
- arg_my_install_TARGETS = "foo;bar"
- arg_my_install_CONFIGURATIONS <UNSET> # was not present
- arg_my_install_UNPARSED_ARGUMENTS = "blub" # nothing expected after "OPTIONAL"
- arg_my_install_KEYWORDS_MISSING_VALUES = "CONFIGURATIONS" # value was missing
- arg_my_special_install_OPTIONAL = FALSE # was not present
- arg_my_special_install_FAST = TRUE
- arg_my_special_install_DESTINATION = "sbin"
- arg_my_special_install_RENAME <UNSET> # value was missing
- arg_my_special_install_TARGETS = "barry"
- arg_my_special_install_CONFIGURATIONS <UNSET> # was not present
- arg_my_special_install_UNPARSED_ARGUMENTS <UNSET>
- arg_my_special_install_KEYWORDS_MISSING_VALUES = "RENAME"
- Keywords terminate lists of values. If a keyword is given directly after a
- ``<one_value_keyword>``, that preceding ``<one_value_keyword>`` receives no
- value and the keyword is added to the ``<prefix>_KEYWORDS_MISSING_VALUES``
- variable. In the above example, the call to ``my_special_install()`` contains
- the ``RENAME`` keyword immediately followed by the ``FAST`` keyword.
- In this case, ``FAST`` terminates processing of the ``RENAME`` keyword.
- ``arg_my_special_install_FAST`` is set to ``TRUE``,
- ``arg_my_special_install_RENAME`` is unset, and
- ``arg_my_special_install_KEYWORDS_MISSING_VALUES`` contains the value
- ``RENAME``.
- See Also
- ^^^^^^^^
- * :command:`function`
- * :command:`macro`
|