cmake學習之-configure_file


一、系統版本

  • 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 主要實現如下兩個功能:

  1. <input> 文件里面的內容全部復制到 <output> 文件中;
  2. 根據參數規則,替換 @VAR@${VAR} 變量;

2.1 參數解析

  1. COPYONLY

    • 僅拷貝 <input> 文件里面的內容到 <output> 文件, 不進行變量的替換
  2. ESCAPE_QUOTES

    • 使用反斜杠(C語言風格)來進行轉義;
  3. @ONLY

    • 限制替換, 僅僅替換 @VAR@ 變量, 不替換 ${VAR} 變量
  4. NEWLINE_STYLE

    • 指定輸入文件的新行格式, 例如:Unix 中使用的是 \n, windows 中使用的 \r\n

**注意: ** COPYONLYNEWLINE_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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM