本节要讨论的是cmake的两个命令: option 和 configure_file option 选项,让你可以根据选项值进行条件编译。 configure_file 配置文件,让你可以在代码文件中使用CMake中定义的的变量
option
Provides an option that the user can optionally select. option 提供一个用户可以任选的选项。语法如下
option(<option_variable> "help string describing option" [initial value])
Provide an option for the user to select as ON or OFF. If no initial value is provided, OFF is used. option 提供选项让用户选择是 ON 或者 OFF ,如果没有提供初始化值,使用OFF。 也就是说默认的值是OFF。 但是请注意:这个option命令和你本地是否存在编译缓存的关系很大。 所以,如果你有关于 option 的改变,那么请你务必清理 CMakeCache.txt 和 CMakeFiles 文件夹。 还有,请使用标准的 [initial value] 值 ON 或者 OFF。 可以在命令行通过以下的方式设置选项 比如想打开 FOO_ENABLE 选项 -DFOO_ENABLE=ON
configure_file
configure_file 的作用是让普通文件也能使用CMake中的变量。 也就是说代码文件中可以使用CMake中的变量。 语法如下:
configure_file(<input> <output> [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 @[email protected] 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: 拷贝一个 <input>(输入文件) 文件到 <output> (输出文件),并且替换输入文件中被 @[email protected] 或者 ${VAR} 引用的变量值。每一个变量将被替换成当前的变量值(注:CMake中的变量值)或者空串当变量未定义。 输入文件中的
#cmakedefine VAR ...
将被替换为
#define VAR ...
或者
/* #undef VAR */
下面看看各选项的意义 COPYONLY Copy the file without replacing any variable references or other content. This option may not be used with NEWLINE_STYLE. 只拷贝文件,不进行任何的变量替换。这个选项在指定了 NEWLINE_STYLE 选项时不能使用(无效)。 ESCAPE_QUOTES Escape any substituted quotes with backslashes (C-style). 躲过任何的反斜杠(C风格)转义。 注:躲避转义,比如你有个变量在CMake中是这样的 set(FOO_STRING "\"foo\"") 那么在没有 ESCAPE_QUOTES 选项的状态下,通过变量替换将变为 ""foo"",如果指定了 ESCAPE_QUOTES 选项,变量将不变。 @ONLY Restrict variable replacement to references of the form @[email protected] This is useful for configuring scripts that use ${VAR} syntax. 限制变量替换,让其只替换被 @[email protected] 引用的变量(那么 ${VAR} 格式的变量将不会被替换)。这在配置 ${VAR} 语法的脚本时是非常有用的。 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. 指定输出文件中的新行格式。UNIX 和 LF 的新行是 \n ,DOS 和 WIN32 和 CRLF 的新行格式是 \r\n 。 这个选项在指定了 COPYONLY 选项时不能使用(无效)。 Example Consider a source tree containing a foo.h.in file:
#cmakedefine FOO_ENABLE #cmakedefine FOO_STRING "@[email protected]"
An adjacent CMakeLists.txt may use configure_file to configure the header:
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:
#define FOO_ENABLE #define FOO_STRING "foo"
Otherwise it will contain:
/* #undef FOO_ENABLE */ /* #undef FOO_STRING */
One may then use the include_directories() command to specify the output directory as an include directory:
include_directories(${CMAKE_CURRENT_BINARY_DIR})
so that sources may include the header as #include <foo.h>.
时间: 2024-10-08 08:03:25