一、系统版本

  • 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

cmake学习之-configure_file的更多相关文章

  1. cmake学习笔记(五)

    在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西.但靠这些知识还是不能看懂PySide使 ...

  2. CMake学习(1)---简单程序与库

    cmake是linux平台下重要的工具,可以方便的组织makefile.之前一直在windows平台下进行软件开发,在vs2010的IDE里,只要一点run程序就能跑出结果.但是程序的编译并没有那么简 ...

  3. cmake 学习笔记(三)

    转自:http://blog.csdn.net/dbzhang800/article/details/6329314 接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cma ...

  4. cmake 学习笔记(二)

    在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式. 这次应该简单看看语法和常用的命令了. 简单的语法 注释 # 我是注释 命令语法 COMMAND(参数1 参数2 ...) ...

  5. CMake学习

    CMake学习 本篇分享一下有关CMake的一些学习心得以及相关使用. 作者:AlphaGL.版权所有,欢迎保留原文链接进行转载 :) 本文目录如下: 1.CMake介绍 2.CMake安装与使用 2 ...

  6. cmake 学习笔记(三) (转)

    接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我 ...

  7. CMake学习笔记四:usb_cam的CMakeLists解析

    最近在学习cmake,在完整看了<cmake实践>一书后,跟着书上例程敲了跑了一遍,也写了几篇相关读书笔记,算是勉强基本入门了.所以找了usb_cam软件包的CMakeLists.txt来 ...

  8. cmake学习资料收集

    CMake 学习笔记 : https://www.jianshu.com/p/c417e4ab8b30

  9. cmake 学习笔记(六)

    希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^ 学习 cmake 的单元测试部分 ctest. 简单使用 最简单的使用ctest的方法,就是在 CMa ...

随机推荐

  1. 思维导图工具 & 原型设计工具

    最近需要画出系统流程架构什么的,就用到了几个思维导图工具 1. XMind -- 思维导图工具 2. MindManager -- 思维导图工具 3. AXURE RP --原型设计工具

  2. IDEA 注册问题,创建 和 删除项目

    目录 .....2016.3/2017.1 IDEA 注册码 .....IDEA 创建项目 .....IDEA 删除项目 IDEA 注册码 复制使用别人的注册码,启动选择如下: 复制粘贴如下代码: 这 ...

  3. JavaScript中in的用法

    JavaScript中的in 操作符是对Object(对象)操作的,并不是针对数组. in 的右边必须是对象变量 例如:var data = {id:1, name:'AAA'};if('name' ...

  4. BZOJ 4766: 文艺计算姬

    4766: 文艺计算姬 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 456  Solved: 239[Submit][Status][Discuss] ...

  5. Hibernate的merge与update方法的区别

    今天做了个测试,写了个测试用例来看看merge与update时控制台打印出来的日志有什么不一样.实体bean很简单,就id和name两个字段,接下来分别给出以下几种测试情形的控制台日志内容: 1. 数 ...

  6. android的布局-----FrameLayout(帧布局)

    (-)帧布局简介 帧布局容器为每个加入的其中的组件创建一个空白的区域称为一帧每个子组件占据一帧,这些帧都会根据gravity的属性执行自动对齐 (二)属性 foreground:这是帧布局的前景图像 ...

  7. SQL语句的执行顺序(转载+不同意见)

    MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来 ...

  8. python画直线

    #!/usr/bin/env python import matplotlib.pyplot as plt import numpy as np #beita = 1 #gama = 0.5 #x:f ...

  9. Kali Linux 2017中Scapy运行bug解决

    Kali Linux 2017中Scapy运行bug解决   Scapy是一款强大的网络数据包构建工具.在Kali Linux 2017中,当在scapy的命令行中,运行res.graph()生成图形 ...

  10. (入门SpringBoot)SpringBoot后台验证(八)

    后台验证的作用主要是防止postman...等等工具的恶意提交,前后台都判断数据,双保险. .可以在SpringBoot传参数 加上NotNull.... //分组Default,分组的好处就是可重复 ...