常用的从文件中读取操作为file(READ <filename> <variable>),将filename文件中内容原封不动读取到variable变量中,命令行全部格式为:
file(read <filename> <variable> [OFFSET <offset>] [LIMIT <max-in>] [HEX])
LIMIT <max-in>: 可选项 最多读取<max-in>长度的内容到变量中
以一个例子说明,实验目录下有两个文件,使用tree命令查看:
$ tree
.
├── CMakeLists.txt
└── test.cpp0 directories, 2 files
$
test.cpp文件内容如下:
#include <stdio.h>
#include <stdlib.h>
int main(){
printf("hello world!\n");
}
CMakeList.txt文件内容如下:
cmake_minimum_required(VERSION 3.13.4)
project(cmake_read)
message("--------Proj Src Dir: " ${PROJECT_SOURCE_DIR})
file(READ ${PROJECT_SOURCE_DIR}/test.cpp TEST_RESULT)
message("--------TEST RESULT: " ${TEST_RESULT})
使用file(read)命令将文件test.cpp的内容读取到TEST_RESULT变量中,并打印出来,使用cmake运行:
$ /public/home/huozhikun/cmake/cmake-3.17.0/bin/cmake ..
CMake Error: The source directory "/public/home/huozhikun/test/cmake/read" does not appear to contain CMakeLists.txt.
Specify --help for usage, or press the help button on the CMake GUI.
[huozhikun@login09 example]$ cd build/
[huozhikun@login09 build]$ /public/home/huozhikun/cmake/cmake-3.17.0/bin/cmake ..
-- The C compiler identification is GNU 7.3.1
-- The CXX compiler identification is GNU 7.3.1
-- Check for working C compiler: /opt/rh/devtoolset-7/root/usr/bin/cc
-- Check for working C compiler: /opt/rh/devtoolset-7/root/usr/bin/cc - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /opt/rh/devtoolset-7/root/usr/bin/c++
-- Check for working CXX compiler: /opt/rh/devtoolset-7/root/usr/bin/c++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
--------Proj Src Dir: /public/home/huozhikun/test/cmake/read/example
--------TEST RESULT: #include <stdio.h>
#include <stdlib.h>
int main(){
printf("hello world!\n")
}
-- Configuring done
-- Generating done
-- Build files have been written to: /public/home/huozhikun/test/cmake/read/example/build
将test.cpp的文件内容原封不动读取到TEST_RESULT变量中。
file STRINGS命令是将文件的内容读取成一串ASCII字符串到变量中,其中二进制文件将会被忽略,在读取文件中 回车及\r将会被忽略:
file(STRINGS <filename> <variable> [<options> ...])
options支持的可选项有以下:
继续上上述用例cmakelist修改为:
cmake_minimum_required(VERSION 3.13.4)
project(cmake_read)
message("--------Proj Src Dir: " ${PROJECT_SOURCE_DIR})
file(STRINGS ${PROJECT_SOURCE_DIR}/test.cpp TEST_RESULT)
message("--------TEST RESULT: " ${TEST_RESULT})
运行结果如下:
$ /public/home/huozhikun/cmake/cmake-3.17.0/bin/cmake ..
--------Proj Src Dir: /public/home/huozhikun/test/cmake/read/example_2
--------TEST RESULT: #include <stdio.h>#include <stdlib.h>int main(){ printf("hello world!\n");}
-- Configuring done
-- Generating done
-- Build files have been written to: /public/home/huozhikun/test/cmake/read/example_2/build
$
file <HASH>主要是将文件的字符串内容经过加密读取到变量中,命令格式为:
file(<HASH> <filename> <variable>)
支持的HASH 加密算法 有如下:
file TIMESTAMP只读取文件最后修改的时间搓,命令行格式如下:
file(TIMESTAMP <filename> <variable> [<format>] [UTC])
%% A literal percent sign (%).
%d The day of the current month (01-31).
%H The hour on a 24-hour clock (00-23).
%I The hour on a 12-hour clock (01-12).
%j The day of the current year (001-366).
%m The month of the current year (01-12).
%b Abbreviated month name (e.g. Oct).
%B Full month name (e.g. October).
%M The minute of the current hour (00-59).
%s Seconds since midnight (UTC) 1-Jan-1970 (UNIX time).
%S The second of the current minute.
60 represents a leap second. (00-60)
%U The week number of the current year (00-53).
%w The day of the current week. 0 is Sunday. (0-6)
%a Abbreviated weekday name (e.g. Fri).
%A Full weekday name (e.g. Friday).
%y The last two digits of the current year (00-99)
%Y The current year.
默认情况下格式为:
%Y-%m-%dT%H:%M:%S 当地时间格式 %Y-%m-%dT%H:%M:%SZ UTC时间时间格式.
继续上次用例继续修改CMakelist:
cmake_minimum_required(VERSION 3.13.4)
project(cmake_read)
message("--------Proj Src Dir: " ${PROJECT_SOURCE_DIR})
file(TIMESTAMP ${PROJECT_SOURCE_DIR}/test.cpp TEST_RESULT)
message("--------TEST RESULT: " ${TEST_RESULT})
cmake运行结果:
$ /public/home/huozhikun/cmake/cmake-3.17.0/bin/cmake ..
--------Proj Src Dir: /public/home/huozhikun/test/cmake/read/example_4
--------TEST RESULT: 2022-01-18T20:25:12
-- Configuring done
-- Generating done
-- Build files have been written to: /public/home/huozhikun/test/cmake/read/example_4/build
$
file WRITE命令是常用的写操作命令,命令行格式如下:
file(WRITE <filename> <content> ... )
把<content>内容写入到文件<filename>中,如果文件不存在,则创建该文件将<content>写入到文件中。如果该文件存在则将该文件内容清空并将<content>写入到文件中。
cmakelist中通过WRITE命令,创建test.cpp文件并向其中写入hello world:
cmake_minimum_required(VERSION 3.13.4)
project(cmake_read)
message("--------Proj Src Dir: " ${PROJECT_SOURCE_DIR})
set(TEST_CONTENT "hello world")
file(WRITE ${PROJECT_SOURCE_DIR}/test.cpp ${TEST_CONTENT})
message("--------TEST_CONTENT: " ${TEST_CONTENT}
cmake ..运行结果 查看生成test.cpp文件,文件内容如下:
hello world
file APPEND用于向文件中追加内容,如果文件不存在,会创建该文件,如果该文件存在不会覆盖文件中的旧内容,将内容<content>追加到文件末尾,命令行格式如下:
file(APPEND <filename> <content> ... )
继续上一个用例,在文件test.cpp末尾添加 "I am coming":
cmake_minimum_required(VERSION 3.13.4)
project(cmake_read)
message("--------Proj Src Dir: " ${PROJECT_SOURCE_DIR})
set(TEST_CONTENT "\nI am coming")
file(APPEND ${PROJECT_SOURCE_DIR}/test.cpp ${TEST_CONTENT})
message("--------TEST_CONTENT: " ${TEST_CONTENT})
cmake运行完毕之后,test.cpp文件内容, I am coming 追加到文件末尾如下:
hello world
I am coming
file TOUCH命令用于创建一个空文件,命令行格式如下:
file(TOUCH [<files> ...])
如果文件没有,则创建一个新的空文件,如果文件已经存在,则只是刷新文件最后修改时间。
TOUCH命令还有一个扩展TOUCH_NOCREATE命令:
file(TOUCH_NOCREATE [<files> ...])
TOUNCH_NOCREATE命令当文件不存在时,不创建新的文件。
file GENARATE命令用于一般用于每次构建时将一些所需要过程信息或者调试变量等信息输出到文件中,与其他命令区是支持cmake generator生成器,而且保证是本次构建生成的内容,命令行格式为:
file(GENERATE OUTPUT output-file <INPUT input-file|CONTENT content> [CONDITION expression])
cmake 支持的常用逻辑表达式<expression> 格式大概有如下:
add_executable(myapp main.cpp foo.c bar.cpp zot.cu)
target_compile_options(myapp
PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
)
target_compile_definitions(myapp
PRIVATE $<$<COMPILE_LANGUAGE:CXX>:COMPILING_CXX>
$<$<COMPILE_LANGUAGE:CUDA>:COMPILING_CUDA>
)
target_include_directories(myapp
PRIVATE $<$<COMPILE_LANGUAGE:CXX>:/opt/foo/cxx_headers>
)
下面以一个简单用例说明:
cmake_minimum_required(VERSION 3.13.4)
project(cmake_read)
#message("--------Proj Src Dir: " ${PROJECT_SOURCE_DIR})
set(TEST_CONTENT "hello world")
file(GENERATE OUTPUT ${PROJECT_SOURCE_DIR}/test_2.cpp CONTENT ${TEST_CONTENT} CONDITION $<BOOL:0>)
#message("--------TEST_CONTENT: " ${TEST_CONTENT})
上述file GENERATE表达式中bool结果为0,不将内容输出到GENERATE中。
file GLOB命令主要用于匹配规则在指定的目录内匹配到所需要的文件,命令行格式:
file(GLOB <variable> [LIST_DIRECTORIES true[false] [RELATIVE <path> ] [CONFIGURE_DEPENDS] [<globbing-expression> ...])
*.cxx - match all files with extension cxx
*.vt? - match all files with extension vta,...,vtz
f[3-5].txt - match files f3.txt, f4.txt, f5.txt
cmake_minimum_required(VERSION 3.13.4)
project(cmake_filesystem)
message("--------Proj Src Dir: " ${CMAKE_CURRENT_SOURCE_DIR})
file(GLOB TEST_RESULT LIST_DIRECT true RELATIVE /public/home *.cpp)
message("--------TEST_RESULT: ${TEST_RESULT}")
寻找当前路径下的cpp文件,且返回的结果中为/public/home的相对路径,结果:
$ /public/home/huozhikun/cmake/cmake-3.17.0/bin/cmake ..
... ...
--------Proj Src Dir: /public/home/huozhikun/test/cmake/filesystem/example_3
--------TEST_RESULT: huozhikun/test/cmake/filesystem/example_3/test_2.cpp
... ...
GLOB_RECURSE命令不仅可以遍历当前路径,还可以遍历路径下面的所有子目录,命令行格式如下:
file(GLOB_RECURSE <variable> [LIST_DIRECTORIES true[false] [RELATIVE <path> ] [CONFIGURE_DEPENDS] [<globbing-expression> ...])
参数同上。
RENAME命令将文件重新命名:
file(RENAME <oldname> <newname>)
将旧文件<oldname>重新命名为新名称newname.
cmake_minimum_required(VERSION 3.13.4)
project(cmake_filesystem)
file(RENAME test_2.cpp test.cpp)
RENAME命令删除文件:
file(RENAME_RECURES [<files> ...])
RENAME_RECURSE 命令不仅可以删除文件还可以删除目录,当目录里面没有包含该文件也会被删除:
file(RENAME_RECURES [<files> ...])
MAKE_DIRECTORY创建目录命令:
file(MAKE_DIRECTORY [<directories> ...])
file COPY命令用于将文件copy到目标目录中,命令行格式如下:
file(COPY <files> ... DESTINATION <dir>
[FILE_PERMISSIONS <permissions> ...]
[DIRECTORY_PERMISSIONS <permissions> ... ]
[NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
[FILES_MATCHING]
[ [PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS <permissions> ... ] ]
[...])
OWNER_READ
OWNER_WRITE
OWNER_EXECUTE
GROUP_READ
GROUP_WRITE
GROUP_EXECUTE
WORLD_READ
WORLD_WRITE
WORLD_EXECUTE
file INSTALL命令功能与COPY功能类似,与copy功能不同的时 会打印出详细信息,且权限默认时NO_SOURCE_PERMISSION,命令行格式如下:
file(COPY <files> ... DESTINATION <dir>
[FILE_PERMISSIONS <permissions> ...]
[DIRECTORY_PERMISSIONS <permissions> ... ]
[NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
[FILES_MATCHING]
[ [PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS <permissions> ... ] ]
[...])
COPY和INSTALL 用例如下:
cmake_minimum_required(VERSION 3.13.4)
project(cmake_filesystem)
file(COPY test_2.cpp DESTINATION copy)
file(INSTALL test_2.cpp DESTINATION install)
运行结果结果如下:
$ /public/home/huozhikun/cmake/cmake-3.17.0/bin/cmake ..
... ...
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Installing: /public/home/huozhikun/test/cmake/filesystem/example_5/build/install/test_2.cpp
-- Configuring done
-- Generating done
... ...
INSTALL命令 有详细输出,分布在copy和install目录有一份test_2.cpp文件。
file RELATIVE_PATH根据制定的路径和文件推断出其相对路径,命令行格式:
file(RELATIVE_PATH <variable> <directory> <file>
根据指定的<file>文件 推断出该文件相对于<directory>目录的相对路径,并保存到<variable>变量中,其中<file>要带绝对路径。
将制定的路径转换成cmake style形式,命令行格式:
file(TO_CMAKE_PATH "<path>" <variable>
将传入的<path>路径统一转换成cmake目录形式,cmkae目录形式为“/",该命令主要是考虑到不同操作系统平台使用目标分隔符表示方法不一样,如window下为”\"进行区分,使用该命令可以解决不同系统平台目录兼容问题。
用例
cmake_minimum_required(VERSION 3.13.4)
project(cmake_filesystem)
message("--------Proj Src Dir: " ${CMAKE_CURRENT_SOURCE_DIR})
file(TO_CMAKE_PATH "/public/home/test" TEST_RESULT)
message("-----TEST_RESULT:${TEST_RESULT}")
~
方向是相反的,将cmake格式的目录表示方法转换成具体使用的操作系统表示的方法,winods使用“\”表示,其他都是使用“\",命令行格式如下:
file(TO_NATIVE_PATH "<path>" <variable>
传送相关命令如下:
file(DOWNLOAD <url> <file> [<option> ...]
file(UPLOAD <file> <url> [<option> ...])
DOWNLOAD用于从指定的<url>中下载指定的<file>文件。
UPLOAD用于向指定的<url>上传<file>文件。
支持的<option>选项如下:
通过LOCK指令对指定的文件进行上锁,指令格式为:
file(LOCK <path> [DIRECTORY] [RELEASE] [GUARD <FUNCTION|FILE|PROCESS>] [RESULT_VARIABLE <variable>] [TIMEOUT <second>])
file — CMake 3.12.4 Documentation
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A