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
主要实现如下两个功能:
- 将
<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
cmake学习之-configure_file的更多相关文章
- cmake学习笔记(五)
在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西.但靠这些知识还是不能看懂PySide使 ...
- CMake学习(1)---简单程序与库
cmake是linux平台下重要的工具,可以方便的组织makefile.之前一直在windows平台下进行软件开发,在vs2010的IDE里,只要一点run程序就能跑出结果.但是程序的编译并没有那么简 ...
- cmake 学习笔记(三)
转自:http://blog.csdn.net/dbzhang800/article/details/6329314 接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cma ...
- cmake 学习笔记(二)
在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式. 这次应该简单看看语法和常用的命令了. 简单的语法 注释 # 我是注释 命令语法 COMMAND(参数1 参数2 ...) ...
- CMake学习
CMake学习 本篇分享一下有关CMake的一些学习心得以及相关使用. 作者:AlphaGL.版权所有,欢迎保留原文链接进行转载 :) 本文目录如下: 1.CMake介绍 2.CMake安装与使用 2 ...
- cmake 学习笔记(三) (转)
接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我 ...
- CMake学习笔记四:usb_cam的CMakeLists解析
最近在学习cmake,在完整看了<cmake实践>一书后,跟着书上例程敲了跑了一遍,也写了几篇相关读书笔记,算是勉强基本入门了.所以找了usb_cam软件包的CMakeLists.txt来 ...
- cmake学习资料收集
CMake 学习笔记 : https://www.jianshu.com/p/c417e4ab8b30
- cmake 学习笔记(六)
希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^ 学习 cmake 的单元测试部分 ctest. 简单使用 最简单的使用ctest的方法,就是在 CMa ...
随机推荐
- Intelli IDEA快捷键(配合IdeaVim)
Intelli IDEA开发环境,个人总结的一些常用的快捷键. 想要使用vim方式编辑代码,可以使用Intelli IDEA的IdeaVim.IdeaVim插件功能很强大,在vim编辑模式下还可以使用 ...
- 如何在MySQL中导入大容量SQL文件
在实际工作中,有时需要导入大容量sql文件到MySQL,通常有以下三种方法: (1)通过phpmyadmin,不推荐,有内存等的限制: (2)通过Navicat Premium工具运行sql,不推荐, ...
- [LeetCode] Linked List Cycle II 链表环起始位置
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...
- Http协议和Tomcat服务器安装与eclipse集成(重要)
一.Http协议 1.什么是Http协议 HTTP,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的 一种网络协议.所有的WWW文件都必须遵守这 ...
- Java EE学习记录(一)
话说大家都在说java EE,但是java EE的分层结构如下: 1.数据持久层:主要由一些负责操作POJO(Plain Old Java Object)的类构成,主要负责将数据保存进入数据库; 2. ...
- linux(debian)安装USB无线网卡(tp-link TL-WN725N rtl8188eu )
1: 台式机家里面不想再走线了. 于是去某东买了个USB无线网卡.tp的WN725N USB,非常小, 和罗技的优联接收器差不多大. 2: 驱动能自己识别是不指望了,既然是usb网卡,插入USB后 ...
- CSS:水平居中与垂直居中
CSS居中算是一个比较基础的问题,在实际运用中,需要考虑到的一般是两种情况,一种是主要是表现为文字,图片等行内元素的居中,一种是指 div 等块级标签元素的居中. 水平居中 1.行内元素 行内元素(主 ...
- luogu P1027 Car的旅行路线
题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位 ...
- 某考试 T2 Tree
2 树 2.1 题目描述 给一棵n 个节点的树,节点分别编号为0 到n - 1.你可以通过如下的操作来修改这棵树:首先先删去树上的一条边,此时树会分裂为两个连通块,然后在两个连通块之间加上一条新的边使 ...
- 如何使用Ext.create() 调用一个窗体
Ext.define("Scripts.Code.QM.OutgoingQuality.OQC.ReinspRequest.view.DefectContentsDetailInfoWind ...