一、系統版本
- cmake version: 3.5.2
- 系統版本: Ubuntun 16.04
- cmake docment: 3.14.4
- 最后更新: 2019-05-30
二、指令說明
configure_file(<input> <output>
[COPYONLY] [ESCAPE_QUOTES] [@ONLY]
[NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
configure_file
主要實現如下兩個功能:
- 將
<input>
文件里面的內容全部復制到<output>
文件中; - 根據參數規則,替換
@VAR@
或${VAR}
變量;
2.1 參數解析
-
COPYONLY
- 僅拷貝
<input>
文件里面的內容到<output>
文件, 不進行變量的替換;
- 僅拷貝
-
ESCAPE_QUOTES
- 使用反斜杠(C語言風格)來進行轉義;
-
@ONLY
- 限制替換, 僅僅替換
@VAR@
變量, 不替換${VAR}
變量
- 限制替換, 僅僅替換
-
NEWLINE_STYLE
- 指定輸入文件的新行格式, 例如:Unix 中使用的是
\n
, windows 中使用的\r\n
- 指定輸入文件的新行格式, 例如:Unix 中使用的是
**注意: ** COPYONLY
和 NEWLINE_STYLE
是沖突的,不能同時使用;
三、Coding
文件目錄結構如下:
rs:cmake-demo$ tree
.
├── CMakeLists.txt
├── Config.h.in
├── make.sh
└── tutorial.cpp
l
CMakeLists.txt 文件內容:
cmake_minimum_required(VERSION 3.5)
project(Tutorial)
message(STATUS "PROJECT_SOURCE_DIR " ${PROJECT_SOURCE_DIR})
message(STATUS "PROJECT_BINARY_DIR " ${PROJECT_BINARY_DIR})
set(CMAKEDEFINE_VAR1 1)
set(CMAKEDEFINE_VAR2 0)
set(DEFINE_VAR1 1)
set(DEFINE_VAR2 0)
configure_file (
"${PROJECT_SOURCE_DIR}/Config.h.in"
"${PROJECT_BINARY_DIR}/Config.h"
)
include_directories("$PROJECT_SOURCE_DIR")
add_executable(DEMO tutorial.cpp)
Config.h.in 文件內容
/**
* This is the configure demo
* - CMAKEDEFINE_VAR1 = @CMAKEDEFINE_VAR1@
* - CMAKEDEFINE_VAR2 = @CMAKEDEFINE_VAR2@
* - DEFINE_VAR1 = @DEFINE_VAR1@
* - DEFINE_VAR2 = @DEFINE_VAR2@
*/
/**
* cmakedefine 會根據變量的值是否為真(類似 if)來變換為 #define VAR ... 或 #undef VAR
*/
#cmakedefine CMAKEDEFINE_VAR1 @CMAKEDEFINE_VAR1@
#cmakedefine CMAKEDEFINE_VAR2 @CMAKEDEFINE_VAR2@
/**
* define 會直接根據規則來替換
*/
#define DEFINE_VAR1 @DEFINE_VAR1@
#define DEFINE_VAR2 ${DEFINE_VAR2}
**tutorial.cpp ** 文件內容
// 計算平方根的簡單程序。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "Config.h"
int main (int argc, char *argv[]) {
#ifdef CMAKEDEFINE_VAR1
fprintf(stdout,"CMAKEDEFINE_VAR1 = %d\n", CMAKEDEFINE_VAR1);
#endif
#ifdef CMAKEDEFINE_VAR2
fprintf(stdout,"CMAKEDEFINE_VAR2 = %d\n", CMAKEDEFINE_VAR2);
#endif
#ifdef DEFINE_VAR1
fprintf(stdout,"DEFINE_VAR1 = %d\n", DEFINE_VAR1);
#endif
#ifdef DEFINE_VAR2
fprintf(stdout,"DEFINE_VAR2 = %d\n", DEFINE_VAR2);
#endif
return 0;
}
make.sh 保存一些指令(這個非必須)
#!/bin/sh
# 刪除一些產生的文件
rm -rf CMakeFiles
rm cmake_install
rm Makefile
rm Config.h
rm DEMO
rm CMakeCache.txt
rm -rf ./vscode
rm cmake_install.cmake
cmake ./
make
./DEMO
3.1 運行 sh make.sh
- 生成一個 Config.h 配置文件,文件內容為:
/**
* This is the configure demo
* - CMAKEDEFINE_VAR1 = 1
* - CMAKEDEFINE_VAR2 = 0
* - DEFINE_VAR1 = 1
* - DEFINE_VAR2 = 0
*/
/**
* cmakedefine 會根據變量的值是否為真(類似 if)來變換為 #define VAR ... 或 #undef VAR
*/
#define CMAKEDEFINE_VAR1 1
/* #undef CMAKEDEFINE_VAR2 */
/**
* define 會直接根據規則來替換
*/
#define DEFINE_VAR1 1
#define DEFINE_VAR2 0
- 終端顯示:
.....
Scanning dependencies of target DEMO
[ 50%] Building CXX object CMakeFiles/DEMO.dir/tutorial.cpp.o
[100%] Linking CXX executable DEMO
[100%] Built target DEMO
CMAKEDEFINE_VAR1 = 1
DEFINE_VAR1 = 1
DEFINE_VAR2 = 0
四、參考鏈接
https://cmake.org/cmake/help/v3.14/command/configure_file.html?highlight=cmakedefine