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 ...
随机推荐
- Docker(六):容器
一.启动容器 启动容器有两种方式,一种是基于镜像新建一个容器并启动,另一个是将一个在终止状态的容器重新启动,因为Docker的容器实在是太轻量了,很多用户都可以随时删除和新创建容器. 新建并启动 $s ...
- [LeetCode] Binary Tree Postorder Traversal dfs,深度搜索
Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...
- 享元模式FlyweightPattern(转)
解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象.比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象 ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---43
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- power key 啟動系統的相關電路
Platform Qualcomm MSM8917 / 37 + PM8937(main PMIC) + PMI8940 Schematic Principles 當 power key 按下時, K ...
- [Oracle] 某游戏大区DB IO负载过高分析
某游戏大区DB IO负载过高分析 [问题] 下图信息看出机器IO负载过高, IO使用率: 平均值 50%, 峰值 98%, 业务高峰时间段(19:00-22:00)IO使用率持续80%以上. [分析] ...
- Eclipse下搭建Maven框架
内容中包含 base64string 图片造成字符过多,拒绝显示
- 通过vSphere-client虚拟化服务器
一.什么是vClientvClient是vSphere的重要组件之一.用于用户连接ESXi或vCenter管理和分配vSphere的各种资源.有vClient和WebvClient两个版本.安装部署了 ...
- TCP/IP握手协议
转自:http://www.js123.net/t/n/n/2013/4/28/n_272.shtml 这篇介绍的也很棒:http://www.cnblogs.com/rootq/articles/1 ...
- Java微信开发以及对各种云的评价
目前一个人用Java开发一个微信的会员系统,开发已经结束,现在进入测试阶段. 有一些时间看看市面上的一些Java的微信开发视频,看了一下北风网的<微信公众平台开发Java版第一季>中的1, ...