配置文件

将文件复制到另一个位置并修改其内容。

configure_file(<input> <output>
               [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |
                FILE_PERMISSIONS <permissions>...]
               [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
               [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

<input> 文件复制到 <output> 文件,并在输入文件内容中替换引用为 @VAR@${VAR} 的变量值。每个变量引用都将替换为变量的当前值,如果未定义变量,则替换为空字符串。此外,表格的输入行

#cmakedefine VAR ...

将被替换为

#define VAR ...

或者

/* #undef VAR */

取决于是否在 CMake 中将 VAR 设置为任何不被 if() 命令视为错误常量的值。变量名后一行的“...”内容,如果有的话,同上处理。

与``#cmakedefine VAR ...`` 形式的行不同,在``#cmakedefine01 VAR`` 形式的行中,VAR 本身将扩展为``VAR 0`` 或``VAR 1` ` 而不是分配值 ...`。因此,表格的输入行

#cmakedefine01 VAR

将被替换为

#define VAR 0

或者

#define VAR 1

#cmakedefine01 VAR ... 形式的输入行将扩展为``#cmakedefine01 VAR ... 0`` 或``#cmakedefine01 VAR ... 1``,这可能会导致未定义的行为。

在 3.10 版本加入: 结果行(“#undef”注释除外)可以在“#”字符和“cmakedefine”或“cmakedefine01”单词之间使用空格和/或制表符缩进。此空白缩进将保留在输出行中:

#  cmakedefine VAR
#  cmakedefine01 VAR

如果定义了``VAR``,将被替换为

#  define VAR
#  define VAR 1

如果修改了输入文件,构建系统将重新运行 CMake 以重新配置文件并再次生成构建系统。仅当其内容发生更改时,才会修改生成的文件,并在随后的 cmake 运行中更新其时间戳。

论点是:

<输入>

输入文件的路径。相对路径根据 CMAKE_CURRENT_SOURCE_DIR 的值进行处理。输入路径必须是文件,而不是目录。

<输出>

输出文件或目录的路径。相对路径根据 CMAKE_CURRENT_BINARY_DIR 的值进行处理。如果路径命名为现有目录,则输出文件将放置在该目录中,文件名与输入文件相同。如果路径包含不存在的目录,则会创建它们。

NO_SOURCE_PERMISSIONS

在 3.19 版本加入.

不要将输入文件的权限转移到输出文件。复制的文件权限默认为标准 644 值 (-rw-r--r--)。

USE_SOURCE_PERMISSIONS

在 3.20 版本加入.

将输入文件的权限转移到输出文件。如果没有给出三个与权限相关的关键字(NO_SOURCE_PERMISSIONSUSE_SOURCE_PERMISSIONS 或``FILE_PERMISSIONS``),这已经是默认行为。 USE_SOURCE_PERMISSIONS 关键字主要用作在调用站点使预期行为更清晰的一种方式。

FILE_PERMISSIONS <权限>...

在 3.20 版本加入.

忽略输入文件的权限并使用指定的 <permissions> 代替输出文件。

只复制

复制文件而不替换任何变量引用或其他内容。此选项不能与 NEWLINE_STYLE 一起使用。

ESCAPE_QUOTES

使用反斜杠(C 风格)转义任何替换的引号。

@只有

将变量替换限制为“@VAR@”形式的引用。这对于配置使用 ${VAR} 语法的脚本很有用。

NEWLINE_STYLE <样式>

指定输出文件的换行样式。为 n` 换行符指定 UNIXLF,或者为 \r\n 指定 DOSWIN32CRLF``换行符。此选项不能与 ``COPYONLY 一起使用。

例子

考虑一个包含“foo.h.in”文件的源代码树:

#cmakedefine FOO_ENABLE
#cmakedefine FOO_STRING "@FOO_STRING@"

相邻的 CMakeLists.txt 可以使用 configure_file 来配置标头:

option(FOO_ENABLE "Enable Foo" ON)
if(FOO_ENABLE)
  set(FOO_STRING "foo")
endif()
configure_file(foo.h.in foo.h @ONLY)

这会在与此源目录对应的构建目录中创建一个“foo.h”。如果“FOO_ENABLE”选项打开,配置文件将包含:

#define FOO_ENABLE
#define FOO_STRING "foo"

否则它将包含:

/* #undef FOO_ENABLE */
/* #undef FOO_STRING */

然后可以使用 target_include_directories() 命令将输出目录指定为包含目录:

target_include_directories(<target> [SYSTEM] <INTERFACE|PUBLIC|PRIVATE> "${CMAKE_CURRENT_BINARY_DIR}")

这样源代码就可以将标题包含为``#include <foo.h>``。

也可以看看

  • 文件(生成)()