zoukankan      html  css  js  c++  java
  • 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 中使用的是 , windows 中使用的

    **注意: ** 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
    ", CMAKEDEFINE_VAR1);
    #endif 
    
    #ifdef CMAKEDEFINE_VAR2
       fprintf(stdout,"CMAKEDEFINE_VAR2 = %d
    ", CMAKEDEFINE_VAR2);
    #endif 
    
    #ifdef DEFINE_VAR1
       fprintf(stdout,"DEFINE_VAR1 = %d
    ", DEFINE_VAR1);
    #endif 
    
    #ifdef DEFINE_VAR2
       fprintf(stdout,"DEFINE_VAR2 = %d
    ", 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

  • 相关阅读:
    升级到 classpath 'com.android.tools.build:gradle:1.0.0-rc1
    OnScrollListenerPro
    dp和px的转换
    ListView 中判断是否滚动到底部
    为什么setAdapter之后不能addHeadView或者addfooterView
    SwipeRefreshLayout使用小记
    Git-Flow 带你飞!
    在aws的ec2服务器上搭建nginx+php的环境
    PHP程序员的技术成长规划
    GeoHash核心原理解析
  • 原文地址:https://www.cnblogs.com/gaox97329498/p/10952732.html
Copyright © 2011-2022 走看看