cmake进阶:文件操作之写文件

一. 简介

cmake 提供了 file() 命令可对文件进行一系列操作,譬如读写文件、删除文件、文件重命名、拷贝文件、创建目录等等。 接下来 学习这个功能强大的 file() 命令。
本文学习 CMakeLists.txt语法中写文件操作。

二. cmake进阶:文件操作之写文件

1. 写文件:写、追加内容

使用 file() 命令写文件,使用方式如下所示:

复制代码
file(WRITE <filename> <content>...)
file(APPEND <filename> <content>...)

将 <content> 写入名为 <filename> 的文件中。如果文件不存在,它将被创建;
如果文件已经存在, WRITE 模式将覆盖它, APPEND 模式将内容追加到文件末尾。
准备一个工程,在工程根目录下的 CMakeLists.txt文件中加入如下代码:

复制代码
# file()写文件测试
file(WRITE wtest.txt "Hello World!") #给定内容生成 wtest.txt 文件
file(APPEND wtest.txt " China") #给定内容追加到 wtest.txt 文件末尾

注意文件可以使用绝对路径或相对路径指定,相对路径被解释为相对于当前源码路径。

进入工程 build目录下,执行 "cmake .."命令后,会在当前源码目录下生成一个名为 wtest.txt 的件,如下所示:

接着查看 wtest.txt 文件中内容,如下所示:

2. 写文件:由内容生成文件

由内容生成文件的命令为:

复制代码
file(GENERATE OUTPUT output-file
    <INPUT input-file|CONTENT content>
    [CONDITION expression])

output-file :指定输出文件名,可以带路径(绝对路径或相对路径);
INPUT input-file :指定输入文件,通过输入文件的内容来生成输出文件;
CONTENT content :指定内容,直接指定内容来生成输出文件;
CONDITION expression :如果表达式 expression 条件判断为真,则生成文件、否则不生成文件。

同样,指定文件既可以使用相对路径、也可使用绝对路径,不过在这里,相对路径被解释为相对于当前源码的 BINARY_DIR 路径,而不是当前源码路径。

在工程根目录下的 CMakeLists.txt文件中加入如下代码:

复制代码
# 由前面生成的 wtest.txt 中的内容去生成 out1.txt 文件
file(GENERATE OUTPUT out1.txt INPUT "${PROJECT_SOURCE_DIR}/wtest.txt")

# 由指定的内容生成 out2.txt
file(GENERATE OUTPUT out2.txt CONTENT "This is the out2.txt file")

# 由指定的内容生成 out3.txt,加上条件控制,用户可根据实际情况
# 用表达式判断是否需要生成文件,这里只是演示,直接是 1
file(GENERATE OUTPUT out3.txt CONTENT "This is the out3.txt file" CONDITION 1)

注意:这里 Linux系统上的 cmake安装的哪个版本,则在 CMakeLists.txt中关于最低版本需要设置为 所安装的 cmake版本号。否则,会在下一步 "cmake .." 命令后报错。
进入到 build 目录下执行 " cmake .." 命令 :

执行完 cmake 之后会在 build 目录(也就是顶层源码的 BINARY_DIR )下生成了 out1.txt 、 out2.txt 和 out3.txt 三个文件,内容如下:

关于 cmake写文件学习到这里。

相关推荐
程序员-Benothing13 分钟前
Shell 脚本条件判断与流程控制:if for while case 详解
linux·运维·服务器
mounter62515 分钟前
统一安全域:KVM Planes 如何驾驭硬件特权级
linux·安全·linux kernel·kernel
君生我老36 分钟前
Linux动静态库
linux·服务器
宵时待雨1 小时前
linux笔记归纳19:网络层协议IP
linux·网络·笔记·网络协议·tcp/ip
做运维的阿瑞2 小时前
Linux下DNS服务器搭建
linux·运维·服务器
团子股股东峥哥2 小时前
day37-RHEL-管理基本存储
linux·运维·服务器
君生我老2 小时前
Linux inode概念 &软硬连接
linux·服务器
Android系统攻城狮2 小时前
Linux Gstreamer深度解析之gst_audio_converter_reset调用流程与实战(二十一)
linux·运维·服务器·gstreamer音视频·音视频进阶
youyou-06063 小时前
AUTOSAR‑COM 常见问题 QA (1)
java·linux·服务器·单片机·汽车
m0_743697593 小时前
grep 的引号、反斜杠与正则方言:一次讲清我踩过的坑
linux