|
|
|
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>``.
|