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

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

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

最后

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

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

cmake使用教程(十)-关于file,真是恍然大悟啊_第1张图片

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

cmake使用教程(十)-关于file,真是恍然大悟啊_第2张图片

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

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

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

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

你可能感兴趣的:(程序员,面试)