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 |
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命令将所有匹配
(可选,假如不写,毛都匹配不到)的文件挑选出来,默认以字典顺序排序。
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。
这个命令是用来列出所有子文件夹中的文件和当前所有文件,具体深度多少我也不知道。用法基本同上,只是多了一个FOLLOW_SYMLINKS
可选项。2.6.1版本之前对于链接的文件夹同样会列出所有的链接过去的文件夹下的文件,因为这样会引起一些麻烦,所以在以后的版本中去掉了这个属性,而是将链接当做一个文件,不会列出链接到的文件夹下的文件。假如需要列出,则添加FOLLOW_SYMLINKS
参数即可。
cmake_minimum_required(VERSION 3.6)
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(
)注意这个命令不能用于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开发却还不知道如何去提升自己的,还处于迷茫的朋友!
群内有许多技术大牛,高手如云,有任何问题,欢迎广大网友一起来交流,群内还不定期免费分享高阶Android学习视频资料和面试资料包~
需要架构学习笔记导图的可以点击我的GitHub领取
群内有许多技术大牛,高手如云,有任何问题,欢迎广大网友一起来交流,群内还不定期免费分享高阶Android学习视频资料和面试资料包~