configure_file -------------- .. only:: html .. contents:: 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 while performing `transformations`_ of the input file content. 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. Options ^^^^^^^ The options 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``. Transformations ^^^^^^^^^^^^^^^ :ref:`Variables <CMake Language Variables>` referenced in the input file content as ``@VAR@``, ``${VAR}``, ``$CACHE{VAR}``, and :ref:`environment variables <CMake Language Environment Variables>` referenced as ``$ENV{VAR}``, will each 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 ... 1``, 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 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:`target_include_directories` command to specify the output directory as an include directory: .. code-block:: cmake target_include_directories(<target> [SYSTEM] <INTERFACE|PUBLIC|PRIVATE> "${CMAKE_CURRENT_BINARY_DIR}") so that sources may include the header as ``#include <foo.h>``. See Also ^^^^^^^^ * :command:`file(GENERATE)`