本節(jié)要討論的是cmake的兩個(gè)命令: option 和 configure_file
option 選項(xiàng),讓你可以根據(jù)選項(xiàng)值進(jìn)行條件編譯。
configure_file 配置文件,讓你可以在代碼文件中使用CMake中定義的的變量
Provides an option that the user can optionally select.
option 提供一個(gè)用戶可以任選的選項(xiàng)。語法如下
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 提供選項(xiàng)讓用戶選擇是 ON 或者 OFF ,如果沒有提供初始化值,使用OFF。
也就是說默認(rèn)的值是OFF。
但是請(qǐng)注意:這個(gè)option命令和你本地是否存在編譯緩存的關(guān)系很大。
所以,如果你有關(guān)于 option 的改變,那么請(qǐng)你務(wù)必清理 CMakeCache.txt 和 CMakeFiles 文件夾。
還有,請(qǐng)使用標(biāo)準(zhǔn)的 [initial value] 值 ON 或者 OFF。
可以在命令行通過以下的方式設(shè)置選項(xiàng)
比如想打開 FOO_ENABLE 選項(xiàng) -DFOO_ENABLE=ON
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 @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:
拷貝一個(gè) <input>(輸入文件) 文件到 <output> (輸出文件),并且替換輸入文件中被 @VAR@ 或者 ${VAR} 引用的變量值。每一個(gè)變量將被替換成當(dāng)前的變量值(注:CMake中的變量值)或者空串當(dāng)變量未定義。
輸入文件中的
將被替換為
或者
下面看看各選項(xiàng)的意義
COPYONLY
Copy the file without replacing any variable references or other content. This option may not be used with NEWLINE_STYLE.
只拷貝文件,不進(jìn)行任何的變量替換。這個(gè)選項(xiàng)在指定了 NEWLINE_STYLE 選項(xiàng)時(shí)不能使用(無效)。
ESCAPE_QUOTES
Escape any substituted quotes with backslashes (C-style).
躲過任何的反斜杠(C風(fēng)格)轉(zhuǎn)義。
注:躲避轉(zhuǎn)義,比如你有個(gè)變量在CMake中是這樣的
set(FOO_STRING "\"foo\"")
那么在沒有 ESCAPE_QUOTES 選項(xiàng)的狀態(tài)下,通過變量替換將變?yōu)?""foo"",如果指定了 ESCAPE_QUOTES 選項(xiàng),變量將不變。
@ONLY
Restrict variable replacement to references of the form @VAR@. This is useful for configuring scripts that use ${VAR} syntax.
限制變量替換,讓其只替換被 @VAR@ 引用的變量(那么 ${VAR} 格式的變量將不會(huì)被替換)。這在配置 ${VAR} 語法的腳本時(shí)是非常有用的。
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 。 這個(gè)選項(xiàng)在指定了 COPYONLY 選項(xiàng)時(shí)不能使用(無效)。
Example
Consider a source tree containing a foo.h.in file:
#cmakedefine FOO_ENABLE
#cmakedefine FOO_STRING "@FOO_STRING@"
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>.
|