配置文件¶
将文件复制到另一个位置并修改其内容。
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_PERMISSIONS、USE_SOURCE_PERMISSIONS或``FILE_PERMISSIONS``),这已经是默认行为。USE_SOURCE_PERMISSIONS关键字主要用作在调用站点使预期行为更清晰的一种方式。FILE_PERMISSIONS <权限>...在 3.20 版本加入.
忽略输入文件的权限并使用指定的
<permissions>代替输出文件。只复制复制文件而不替换任何变量引用或其他内容。此选项不能与
NEWLINE_STYLE一起使用。ESCAPE_QUOTES使用反斜杠(C 风格)转义任何替换的引号。
@只有将变量替换限制为“@VAR@”形式的引用。这对于配置使用
${VAR}语法的脚本很有用。NEWLINE_STYLE <样式>指定输出文件的换行样式。为 n` 换行符指定
UNIX或LF,或者为\r\n指定DOS、WIN32或CRLF``换行符。此选项不能与 ``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>``。
也可以看看¶
文件(生成)()