cmake使⽤教程(⼗)-关于file,附⾯试题答案
⽂件的读取
file(READ
[OFFSET ] [LIMIT ] [HEX])
这个也⽐较简单: 将filename⽂件中的内容读取到variable总,可以指定OFFSET的值,也就是开始读取的位置,指定LISTMI的值,读取的长度,HEX是否以16进制形式读取。
file(STRINGS […])
类似于读取字符码,⽽不读取字节码。这个命令会将filename中的字符串读取到variable中,并且variable是⼀个list,每个元素保存每⾏的内容。⼆进制⽂件不会被读取,并且换⾏符会被忽略。举个例⼦,我们刚才写⼊的的⽂件内容是:
this is a test to wirte
this is a test to append
have tab #这个是我⼿动添加的
我们读取这个⽂件并打印结果,编写ake⽂件如下:
file( 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( hash)
message(STATUS ${hash})
– f9bb70f1a2036a73f611858d01a8fb498efc7c83568faf0c74e5a52037492702
收集⽂件
file(GLOB
[LIST_DIRECTORIES true|false] [RELATIVE ]
[…])
file(GLOB_RECURSE [FOLLOW_SYMLINKS]
[LIST_DIRECTORIES true|false] [RELATIVE ]
[…])
两个命令,⾸先
《Android学习笔记总结+最新移动架构视频+⼤⼚安卓⾯试真题+项⽬实战源码讲义》
【docs.qq/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
讲⼀下第⼀个GLOB:
GLOB命令将所有匹配<globbing-expressions>(可选,假如不写,⽑都匹配不到)的⽂件挑选出来,默认以字典顺序排序。
file(GLOB files *)
foreach(file IN LISTS files)
message(STATUS ${file})
endforeach(file)
这段代码的意思是挑选出当前⽂件下的所有⽂件,然后打印:
– /Users/rangaofei/Documents/program/tutorial/ake
– /Users/rangaofei/Documents/program/tutorial/ake
– /Users/rangaofei/Documents/program/tutorial/ake
– /Users/rangaofei/Documents/program/tutorial/Stepfile/test
– /Users/rangaofei/Documents/program/tutorial/
– /Users/rangaofei/Documents/program/tutorial/ake
其实我这个⽂件夹下的内容如下:
.
├── ake
├── ake
├── ake
├── test
│ └──
├──
└── ake
1 directory, 6 files
test是⼀个⽂件夹,但是在脚本中输出了这个⽂件夹。假如我们不想要这个⽂件夹,我们可以通过LIST_DIRECTORIES设置为false即可(默认为true),修改第⼀⾏代码如下:
file(GLOB files LIST_DIRECTORIES false *)
– /Users/rangaofei/Documents/program/tutorial/ake
– /Users/rangaofei/Documents/program/tutorial/ake
– /Users/rangaofei/Documents/program/tutorial/ake
– /Users/rangaofei/Documents/program/tutorial/
– /Users/rangaofei/Documents/program/tutorial/ake
这次只输出了⽂件,⽽⽂件夹没有在⾥边,假如我们不需要绝对路径,只需要相对某个⽂件夹的路径,则可以通过设置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,则输出会包含当前⽂件夹的名字+⽂件名字:
– ake
– ake
– ake
– ake
就是这么蛋疼。还要说⼀下这个蛋疼的伪正则匹配,⼀般⽂件是够⽤的。
*.cxx - 匹配所有的cxx结尾的⽂件
*.vt? - 匹配所有的vta,…,vtz等⽂件
f[3-5].txt - 匹配f3.txt, f4.txt, f5.txt这三个⽂件
cmake官⽅不推荐使⽤GLOB来收集⽂件,因为在⼯程或者模块中的⽂件未更改⽽⽤file搜寻的⽂件夹下有⽂件的删除或者增加,cmake构建并不会知晓,⽽是使⽤旧的list。
cmake如何使用再来讲⼀下第⼆个,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)
当前⽬录结构如下
.
├──
├── TutorialConfig.h.in
├── build
└──
看⼀下输出了什么
– ./
只有⼀个⽂件被假如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])

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。