| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- configure_file
- --------------
- Copy a file to another location and modify its contents.
- .. code-block:: cmake
- configure_file(<input> <output>
- [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |
- FILE_PERMISSIONS <permissions>...]
- [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
- [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
- Copies an ``<input>`` file to an ``<output>`` file and substitutes
- variable values referenced as ``@VAR@`` or ``${VAR}`` in the input
- file content. Each variable reference will be replaced with the
- current value of the variable, or the empty string if the variable
- is not defined. Furthermore, input lines of the form
- .. code-block:: c
- #cmakedefine VAR ...
- will be replaced with either
- .. code-block:: c
- #define VAR ...
- or
- .. code-block:: c
- /* #undef VAR */
- depending on whether ``VAR`` is set in CMake to any value not considered
- a false constant by the :command:`if` command. The "..." content on the
- line after the variable name, if any, is processed as above.
- Unlike lines of the form ``#cmakedefine VAR ...``, in lines of the form
- ``#cmakedefine01 VAR``, ``VAR`` itself will expand to ``VAR 0`` or ``VAR 1``
- rather than being assigned the value ``...``. Therefore, input lines of the form
- .. code-block:: c
- #cmakedefine01 VAR
- will be replaced with either
- .. code-block:: c
- #define VAR 0
- or
- .. code-block:: c
- #define VAR 1
- Input lines of the form ``#cmakedefine01 VAR ...`` will expand
- as ``#cmakedefine01 VAR ... 0`` or ``#cmakedefine01 VAR ... 0``,
- which may lead to undefined behavior.
- .. versionadded:: 3.10
- The result lines (with the exception of the ``#undef`` comments) can be
- indented using spaces and/or tabs between the ``#`` character
- and the ``cmakedefine`` or ``cmakedefine01`` words. This whitespace
- indentation will be preserved in the output lines:
- .. code-block:: c
- # cmakedefine VAR
- # cmakedefine01 VAR
- will be replaced, if ``VAR`` is defined, with
- .. code-block:: c
- # define VAR
- # define VAR 1
- If the input file is modified the build system will re-run CMake to
- re-configure the file and generate the build system again.
- The generated file is modified and its timestamp updated on subsequent
- cmake runs only if its content is changed.
- The arguments are:
- ``<input>``
- Path to the input file. A relative path is treated with respect to
- the value of :variable:`CMAKE_CURRENT_SOURCE_DIR`. The input path
- must be a file, not a directory.
- ``<output>``
- Path to the output file or directory. A relative path is treated
- with respect to the value of :variable:`CMAKE_CURRENT_BINARY_DIR`.
- If the path names an existing directory the output file is placed
- in that directory with the same file name as the input file.
- If the path contains non-existent directories, they are created.
- ``NO_SOURCE_PERMISSIONS``
- .. versionadded:: 3.19
- Do not transfer the permissions of the input file to the output file.
- The copied file permissions default to the standard 644 value
- (-rw-r--r--).
- ``USE_SOURCE_PERMISSIONS``
- .. versionadded:: 3.20
- Transfer the permissions of the input file to the output file.
- This is already the default behavior if none of the three permissions-related
- keywords are given (``NO_SOURCE_PERMISSIONS``, ``USE_SOURCE_PERMISSIONS``
- or ``FILE_PERMISSIONS``). The ``USE_SOURCE_PERMISSIONS`` keyword mostly
- serves as a way of making the intended behavior clearer at the call site.
- ``FILE_PERMISSIONS <permissions>...``
- .. versionadded:: 3.20
- Ignore the input file's permissions and use the specified ``<permissions>``
- for the output file instead.
- ``COPYONLY``
- Copy the file without replacing any variable references or other
- content. This option may not be used with ``NEWLINE_STYLE``.
- ``ESCAPE_QUOTES``
- Escape any substituted quotes with backslashes (C-style).
- ``@ONLY``
- Restrict variable replacement to references of the form ``@VAR@``.
- This is useful for configuring scripts that use ``${VAR}`` syntax.
- ``NEWLINE_STYLE <style>``
- Specify the newline style for the output file. Specify
- ``UNIX`` or ``LF`` for ``\n`` newlines, or specify
- ``DOS``, ``WIN32``, or ``CRLF`` for ``\r\n`` newlines.
- This option may not be used with ``COPYONLY``.
- Example
- ^^^^^^^
- Consider a source tree containing a ``foo.h.in`` file:
- .. code-block:: c
- #cmakedefine FOO_ENABLE
- #cmakedefine FOO_STRING "@FOO_STRING@"
- An adjacent ``CMakeLists.txt`` may use ``configure_file`` to
- configure the header:
- .. code-block:: cmake
- option(FOO_ENABLE "Enable Foo" ON)
- if(FOO_ENABLE)
- set(FOO_STRING "foo")
- endif()
- configure_file(foo.h.in foo.h @ONLY)
- This creates a ``foo.h`` in the build directory corresponding to
- this source directory. If the ``FOO_ENABLE`` option is on, the
- configured file will contain:
- .. code-block:: c
- #define FOO_ENABLE
- #define FOO_STRING "foo"
- Otherwise it will contain:
- .. code-block:: c
- /* #undef FOO_ENABLE */
- /* #undef FOO_STRING */
- One may then use the :command:`include_directories` command to
- specify the output directory as an include directory:
- .. code-block:: cmake
- include_directories(${CMAKE_CURRENT_BINARY_DIR})
- so that sources may include the header as ``#include <foo.h>``.
|