file(READ
[OFFSET ] [LIMIT ] [HEX])

这个也比较简单: 将filename文件中的内容读取到variable总,可以指定OFFSET的值,也就是开始读取的位置,指定LISTMI的值,读取的长度,HEX是否以16进制形式读取。

file(STRINGS […])

类似于读取字符码,而不读取字节码。这个命令会将filename中的字符串读取到variable中,并且variable是一个list,每个元素保存每行的内容。二进制文件不会被读取,并且换行符会被忽略。举个例子,我们刚才写入的test.txt的文件内容是:

this is a test to wirte
this is a test to append
have tab #这个是我手动添加的

我们读取这个文件并打印结果,编写string.cmake文件如下:

file(STRINGS test.txt strings)
foreach(str IN LISTS strings)
message(STATUS ${str})
endforeach(str)

因为结果会用list保存,所以用foreach循环来查看结果:

– this is a test to wirte
– this is a test to append
– have tab

关于一些选项,用的不太多:

OPTION 说明
LENGTH_MAXIMUM 读取字符的最大个数
LENGTH_MINIMUM 读取的字符的最少个数
LIMIT_COUNT 提取的不同字符的最大数量
LIMIT_INPUT 限制读取的最大字节
LIMIT_OUTPUT 限制写入变量的最大字节
NEWLINE_CONSUME 不忽略换行符
NO_HEX_CONVERSION 不需要自动转换为16进制
REGEX 提取匹配正则表达式的字符串
ENCODING 重新编码UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE

文件的hash码

file( )

利用这个命令可以提取出文件的hash码

MD5,SHA1,SHA224,SHA256,SHA384,SHA512,SHA3_224,SHA3_256,SHA3_384,SHA3_512

如果看过我的bomebrew教程可应该知道,在生成formula.rb文件的时候需要填写打包好的文件的SHA256来验证下载文件的完整性,所以可以利用这个写一个简单的脚本来输出hash值,写一个简单的例子吧:

file(SHA256 test.txt hash)
message(STATUS ${hash})

– f9bb70f1a2036a73f611858d01a8fb498efc7c83568faf0c74e5a52037492702

收集文件

file(GLOB
[LIST_DIRECTORIES true|false] [RELATIVE ]
[…])
file(GLOB_RECURSE [FOLLOW_SYMLINKS]
[LIST_DIRECTORIES true|false] [RELATIVE ]
[…])

两个命令,首先讲一下第一个GLOB:

GLOB命令将所有匹配<globbing-expressions>(可选,假如不写,毛都匹配不到)的文件挑选出来,默认以字典顺序排序。

file(GLOB files *)
foreach(file IN LISTS files)
message(STATUS ${file})
endforeach(file)

这段代码的意思是挑选出当前文件下的所有文件,然后打印:

– /Users/rangaofei/Documents/program/tutorial/Stepfile/filelist.cmake
– /Users/rangaofei/Documents/program/tutorial/Stepfile/hash.cmake
– /Users/rangaofei/Documents/program/tutorial/Stepfile/string.cmake
– /Users/rangaofei/Documents/program/tutorial/Stepfile/test
– /Users/rangaofei/Documents/program/tutorial/Stepfile/test.txt
– /Users/rangaofei/Documents/program/tutorial/Stepfile/write.cmake

其实我这个文件夹下的内容如下:

.
├── filelist.cmake
├── hash.cmake
├── string.cmake
├── test
│ └── test.txt
├── test.txt
└── write.cmake

1 directory, 6 files

test是一个文件夹,但是在脚本中输出了这个文件夹。假如我们不想要这个文件夹,我们可以通过LIST_DIRECTORIES设置为false即可(默认为true),修改第一行代码如下:

file(GLOB files LIST_DIRECTORIES false *)

– /Users/rangaofei/Documents/program/tutorial/Stepfile/filelist.cmake
– /Users/rangaofei/Documents/program/tutorial/Stepfile/hash.cmake
– /Users/rangaofei/Documents/program/tutorial/Stepfile/string.cmake
– /Users/rangaofei/Documents/program/tutorial/Stepfile/test.txt
– /Users/rangaofei/Documents/program/tutorial/Stepfile/write.cmake

这次只输出了文件,而文件夹没有在里边,假如我们不需要绝对路径,只需要相对某个文件夹的路径,则可以通过设置RELATIVE的值来设置。 将文件修改如下:

set(CUR ${CMAKE_CURRENT_SOURCE_DIR})
file(GLOB files LIST_DIRECTORIES false RELATIVE ${CUR}/… *)
foreach(file IN LISTS files)
message(STATUS ${file})
endforeach(file)

我们设置了CUR为当前的文件夹,然后设置相对路径为当前文件夹的上级文件夹,而我的当前文件夹名称为Stepfile,则输出会包含当前文件夹的名字+文件名字:

– Stepfile/filelist.cmake
– Stepfile/hash.cmake
– Stepfile/string.cmake
– Stepfile/test.txt
– Stepfile/write.cmake

就是这么蛋疼。还要说一下这个蛋疼的伪正则匹配,一般文件是够用的。

*.cxx - 匹配所有的cxx结尾的文件
*.vt? - 匹配所有的vta,…,vtz等文件
f[3-5].txt - 匹配f3.txt, f4.txt, f5.txt这三个文件

cmake官方不推荐使用GLOB来收集文件,因为在工程或者模块中的CMakeLists.txt文件未更改而用file搜寻的文件夹下有文件的删除或者增加,cmake构建并不会知晓,而是使用旧的list。

再来讲一下第二个,GLOB_CURSE:

这个命令是用来列出所有子文件夹中的文件和当前所有文件,具体深度多少我也不知道。用法基本同上,只是多了一个FOLLOW_SYMLINKS可选项。2.6.1版本之前对于链接的文件夹同样会列出所有的链接过去的文件夹下的文件,因为这样会引起一些麻烦,所以在以后的版本中去掉了这个属性,而是将链接当做一个文件,不会列出链接到的文件夹下的文件。假如需要列出,则添加FOLLOW_SYMLINKS参数即可。

cmake_minimum_required(VERSION 3.6)

if(POLICY CMP0009)

cmake_policy(SET CMP0009 NEW)

endif()

set(CUR ${CMAKE_CURRENT_SOURCE_DIR})
file(GLOB_RECURSE files FOLLOW_SYMLINKS LIST_DIRECTORIES true RELATIVE ${CUR}/… *)
foreach(file IN LISTS files)
message(STATUS ${file})
endforeach(file)

这段代码将会列出当前所有文件、子文件夹中的文件以及链接中的文件。

关于AUX_SOURCE_DIRECTORY

aux_source_directory(

)

注意这个命令不能用于script中,他是project命令。

寻找dir文件夹下所有的源文件,存入variable中。这个命令与之前的命令有所区别,因为它只会搜集当前设置语言的文件,cmake默认的设置语言是c/cxx,则会收集到的文件只有这些语言能识别的文件,比如在step中添加如下代码

aux_source_directory(./ SRCLIST)
foreach(file IN LISTS SRCLIST)
message(STATUS ${file})
endforeach(file)

当前目录结构如下

.
├── CMakeLists.txt
├── TutorialConfig.h.in
├── build
└── tutorial.cxx

看一下输出了什么

– ./tutorial.cxx

只有一个文件被假如list中了。

文件的操作

file(RENAME )

重命名文件或者文件夹

file(REMOVE […])
file(REMOVE_RECURSE […])

删除指定的文件,REMOVE_RECURSE则会删除文件和文件夹,假如不存在,不会抛出错误。

file(MAKE_DIRECTORY […])

递归创建文件,包括路径中的文件夹

file(RELATIVE_PATH )

计算file相对于directory的相对路径,存入variable中。类似于前边的收集文件。

file(TO_CMAKE_PATH “” )
file(TO_NATIVE_PATH “” )

在cmake路径和本地路径之间相互转换。cmake路径使用的是/

file(DOWNLOAD […])
file(UPLOAD […])

这两个命令真是让我的菊花紧到极致了。第一个是从url下载文件命名为file,第二个是将本地文件file上传至url。 以下的option适用于这两个命令

参数 说明
INACTIVITY_TIMEOUT 超时时间
LOG 将日志写入变量中
SHOW_PROGRESS 显示进度
STATUS a;b形式,a是返回的状态码,b是错误代码,假如没错误,b是0(鬼知道,我没试)
TIMEOUT 连接超时时间
USERPWD : 用户名和密码
HTTPHEADER http请求头
EXPECTED_HASH ALGO= 验证算法(适用于下载)

file(TIMESTAMP [] [UTC])

将filename文件的时间戳存储在varibale中。

file(GENERATE OUTPUT output-file
<INPUT input-file|CONTENT content>

最后

分享一份工作1到5年以上的Android程序员架构进阶学习路线体系,希望能对那些还在从事Android开发却还不知道如何去提升自己的,还处于迷茫的朋友!

  • 阿里P7级Android架构师技术脑图;查漏补缺,体系化深入学习提升(详细点击我的GitHub领取)

  • **全套体系化高级架构视频;**七大主流技术模块,视频+源码+笔记

需要架构学习笔记导图的可以点击我的GitHub领取

群内有许多技术大牛,高手如云,有任何问题,欢迎广大网友一起来交流,群内还不定期免费分享高阶Android学习视频资料和面试资料包~

需要架构学习笔记导图的可以点击我的GitHub领取

群内有许多技术大牛,高手如云,有任何问题,欢迎广大网友一起来交流,群内还不定期免费分享高阶Android学习视频资料和面试资料包~

cmake使用教程(十)-关于file,真是恍然大悟啊相关推荐

  1. cmake使用教程(十一)-使用cpack打包源码并编写自动化脚本上传到仓库

    [cmake系列使用教程] cmake使用教程(一)-起步 cmake使用教程(二)-添加库 cmake使用教程(三)-安装.测试.系统自检 cmake使用教程(四)-文件生成器 cmake使用教程( ...

  2. cmake详细教程(经验版)

    一.参考资料 CMake DSL语言 CMake 快速入门 cmake使用教程 CMake简明教程 CMake 入门实战 | HaHack Cmake入门和MindsporeLite Cmake文件分 ...

  3. Wix 安装部署教程(十六) -- 自动生成多语言文件

    Wix 安装部署教程(十六) -- 自动生成多语言文件 原文:Wix 安装部署教程(十六) -- 自动生成多语言文件 因为持续集成需要,所有项目编译完之后生成一个多语言的安装包.之前生成mst文件都是 ...

  4. cmake使用教程(一)-起步

    [cmake系列使用教程] cmake使用教程(一)-起步 cmake使用教程(二)-添加库 cmake使用教程(三)-安装.测试.系统自检 cmake使用教程(四)-文件生成器 cmake使用教程( ...

  5. Wix 安装部署教程(十二) -- 自动更新WXS文件

    原文:Wix 安装部署教程(十二) -- 自动更新WXS文件 上一篇分享了一个QuickWIX,用来对比两个工程前后的差异,但是这样还是很繁琐,而且昨天发现有Bug,目录对比有问题.这次改变做法,完全 ...

  6. 现代 CMake 简明教程(一)- CMake 基础

    系列文章目录 现代 CMake 简明教程(一)- CMake 基础 现代 CMake 简明教程(二)- 设计理念与使用 文章目录 系列文章目录 前言 CMake 基础 1. Modern CMake ...

  7. ComicEnhancerPro 系列教程十八:JPG文件长度与质量

    作者:马健 邮箱:stronghorse_mj@hotmail.com 主页:http://www.comicer.com/stronghorse/ 发布:2017.07.23 教程十八:JPG文件长 ...

  8. Clause 开发技能之 CMake 进阶教程(三)

    书接上文:https://chatopera.blog.csdn.net/article/details/109025400 本文转载自[使用 CMake 组织 C++工程]3:CMake 函数和宏 ...

  9. PVE系列教程(十九)、ubuntu22.04使用Nginx配置chevereto服务器

    PVE系列教程(十九).ubuntu22.04使用Nginx配置chevereto服务器 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000 一.环 ...

  10. 现代CMake高级教程 - 第 0 章:命令行小技巧

    双笙子佯谬老师的[公开课]现代CMake高级教程课程笔记 为什么要学习现代 CMake? 现代 CMake 指的是 CMake 3.x. 古代 CMake 指的是 CMake 2.x. 通过互联网和学 ...

最新文章

  1. 数据治理(Data Governance)
  2. Android日志Log使用
  3. Apache+Tomcat动静分离
  4. python数据结构剑指offer-替换空格
  5. Linux常用命令一 查看系统负载 版本信息 工作目录
  6. Java for selenium(webdriver) 环境搭建
  7. 简述STL中容器适配器的概念
  8. VB2010(17)_消息对话框MessageBox
  9. 迅雷的php文件_使用迅雷下载.php文件的方法(Picjumbo可用)
  10. Ruby语言的优点和缺点
  11. 「Thymeleaf页面在浏览器加载不出来」
  12. Android 仿自如APP裸眼3D效果
  13. uvalive 3713 2-sat
  14. 关于增量学习的一点总结思考
  15. excel查找出不来了_Excel查找全部,如何把查找出来内容全部复制?
  16. JSP设置Excel表格换行_工作中常见的11个Excel难题,一次解决!
  17. VisualBasic使用CDO发送SSL加密邮件【我TM还是太年轻了】
  18. spring的继承与依赖
  19. Go-Micro微服务框架使用
  20. fastjson 如何去掉反斜杠

热门文章

  1. 《MFC 控件透明处理》
  2. 支付宝小程序开发笔记
  3. html影院选座模板,html影院前台模板
  4. 计算机输入什么指令关机,电脑关机命令是什么 电脑关机命令详解
  5. win10电脑用命令行关机
  6. 多序列比对要多久时间_序列比对,几个常用的多序列比对软件
  7. css属性table
  8. win10系统装服务器2008蓝屏,win10专业版系统出现蓝屏的原因及解决方法
  9. 计算机的装机配件,京东买的配件怎么装机自己组装教程
  10. 龙之谷手游微信连接授权服务器失败,龙之谷手游ios微信授权失败怎么办_龙之谷手游ios微信授权失败解决办法-66街机网...