支付宝开通-offce
2023年3月30日发(作者:怎样自动生成目录)
Cmake复制⽂件⽅法
⼀、FILE-COPY
file(
[FILE_PERMISSIONS
[DIRECTORY_PERMISSIONS
[NO_SOURCE_PERMISSIONS][USE_SOURCE_PERMISSIONS]
[FOLLOW_SYMLINK_CHAIN]
[FILES_MATCHING]
[[PATTERN
[EXCLUDE][PERMISSIONS
COPY将⽂件,⽬录和符号链接复制到⽬标⽂件夹。相对于当前源⽬录评估相对输⼊路径,相对于当前构建⽬录评估相对⽬的地。复制会保
留输⼊⽂件的时间戳,并优化⽂件(如果该⽂件存在于具有相同时间戳的⽬标⽂件中)。复制将保留输⼊权限,除⾮给出明确的权限或
NO_SOURCE_PERMISSIONS(默认为USE_SOURCE_PERMISSIONS)。
如果指定了FOLLOW_SYMLINK_CHAIN,则COPY将在给定的路径上递归解析符号链接,直到找到真实⽂件为⽌,然后在⽬标位置为遇
到的每个符号链接安装相应的符号链接。对于已安装的每个符号链接,解析都会从⽬录中剥离,仅保留⽂件名,这意味着新符号链接指向与
符号链接相同⽬录中的⽂件。此功能在某些Unix系统上很有⽤,在这些系统中,库是作为带有符号链接的版本号安装的,⽽较少特定的版本
指向的是特定版本。FOLLOW_SYMLINK_CHAIN会将所有这些符号链接和库本⾝安装到⽬标⽬录中。例如,如果您具有以下⽬录结构:
/opt/foo/lib/.1.2.3
/opt/foo/lib/.1.2->.1.2.3
/opt/foo/lib/.1->.1.2
/opt/foo/lib/->.1
你可以:
file(COPY/opt/foo/lib/INATIONlibFOLLOW_SYMLINK_CHAIN)
这会将所有符号链接和.1.2.3本⾝安装到lib中。
请参阅install(DIRECTORY)命令以获取权限,FILES_MATCHING,PATTERN,REGEX和EXCLUDE选项的⽂档。即使使⽤选项来选
择⽂件的⼦集,复制⽬录也会保留其内容的结构。
INSTALL与COPY略有不同:它打印状态消息(取决于CMAKE_INSTALL_MESSAGE变量),并且默认为
NO_SOURCE_PERMISSIONS。install()命令⽣成的安装脚本使⽤此签名(以及⼀些未记录的内部使⽤选项)。
⼆、ADD_CUSTOM_COMMAND
add_custom_command:
该命令可以为⽣成的构建系统添加⼀条⾃定义的构建规则。这⾥⼜包含两种使⽤⽅式,⼀种是通过⾃定义命令在构建中⽣成输出⽂件,另外
⼀种是向构建⽬标添加⾃定义命令。命令格式分别为:
(1)⽣成⽂件
add_custom_command(OUTPUToutput1[output2...]
COMMANDcommand1[ARGS][args1...]
[COMMANDcommand2[ARGS][args2...]...]
[MAIN_DEPENDENCYdepend]
[DEPENDS[depends...]]
[BYPRODUCTS[files...]]
[IMPLICIT_DEPENDS
[
[WORKING_DIRECTORYdir]
[COMMENTcomment]
[DEPFILEdepfile]
[JOB_POOLjob_pool]
[VERBATIM][APPEND][USES_TERMINAL]
[COMMAND_EXPAND_LISTS])
参数介绍:
OUTPUT:
指定命令预期产⽣的输出⽂件。如果输出⽂件的名称是相对路径,即相对于当前的构建的源⽬录路径。输出⽂件可以指定多个
output1,output2(可选)等。
COMMAND:
指定要在构建时执⾏的命令⾏。如果指定多个COMMAND,它们讲按顺⼼执⾏。ARGS参数是为了向后兼容,为可选参数。args1和
args2为参数,多个参数⽤空格隔开。
MAIN_DEPENDENCY:
可选命令,指定命令的主要输⼊源⽂件。
DEPENDS:
指定命令所依赖的⽂件。
BYPRODUCTS:
可选命令,指定命令预期产⽣的⽂件,但其修改时间可能会⽐依赖性更新,也可能不会更新。
IMPLICIT_DEPENDS:
可选命令,请求扫描输⼊⽂件的隐式依赖关系。给定的语⾔指定应使⽤相应的依赖性扫描器的编程语⾔。⽬前只⽀持C和CXX语⾔扫描器。
必须为IMPLICIT_DEPENDS列表中的每个⽂件指定语⾔。从扫描中发现的依赖关系在构建时添加到⾃定义命令的依赖关系。请注
意,IMPLICIT_DEPENDS选项⽬前仅⽀持Makefile⽣成器,并且将被其他⽣成器忽略。
WORKING_DIRECTORY:
可选命令,使⽤给定的当前⼯作⽬录执⾏命令。如果它是相对路径,它将相对于对应于当前源⽬录的构建树⽬录。
COMMENT:
可选命令,在构建时执⾏命令之前显⽰给定消息。
DEPFILE:
可选命令,为Ninja⽣成器指定⼀个.ddepfile。.d⽂件保存通常由⾃定义命令本⾝发出的依赖关系。对其他⽣成器使⽤DEPFILE是⼀个错
误。
COMMAND_EXPAND_LISTS:
将扩展COMMAND参数中的列表,包括使⽤⽣成器表达式创建的列表,从⽽允许COMMAND参数,例如${CC}"-
I$
VERBATIM:
对于构建⼯具,将正确转义命令的所有⾃变量,以便调⽤的命令不变地接收每个⾃变量。请注意,在add_custom_command甚⾄没有看
到参数之前,CMake语⾔处理器仍使⽤⼀种转义。建议使⽤VERBATIM,因为它可以使⾏为正确。如果未提供VERBATIM,则该⾏为是
特定于平台的,因为没有针对⼯具的特殊字符的保护。
使⽤实例:
add_executable()
add_custom_command(
OUTPUT${CMAKE_CURRENT_BINARY_DIR}/Table.h
COMMANDMakeTable${CMAKE_CURRENT_BINARY_DIR}/Table.h
DEPENDSMakeTable
COMMENT"Thisisatest"
)
(2)⾃定义构建事件
add_custom_command(TARGET
PRE_BUILD|PRE_LINK|POST_BUILD
COMMANDcommand1[ARGS][args1...]
[COMMANDcommand2[ARGS][args2...]...]
[BYPRODUCTS[files...]]
[WORKING_DIRECTORYdir]
[COMMENTcomment]
[VERBATIM][USES_TERMINAL])
上⾯这句所得到的效果是,当⽬标被新⽣成时,执⾏COMMAND后⾯的命令。
参数介绍:
TARGET:
定义了与构建指定相关联的新命令。当已经存在是,相应的command将不再执⾏。
PRE_BUILD:
在⽬标中执⾏任何其他规则之前运⾏。这仅在VisualStudio7或更⾼版本上受⽀持。对于所有其他⽣成器PRE_BUILD将被视为
PRE_LINK。
PRE_LINK:
在编译源之后运⾏,但在链接⼆进制⽂件或运⾏静态库的库管理器或存档器⼯具之前运⾏。
POST_BUILD:
在⽬标中的所有其他规则都已执⾏后运⾏。
⽰例:将⼦项⽬⽣成的库⽂件复制到项⽬运⾏时⽂件夹。
#=============CopyPluginsRuntimeFILEStoMainProject============
#⼀般将此内容放在lib⼦项⽬的的最后,该⽅法采⽤POST_BUILD,所以需注意要复制的源应该是⼀个固定字符串,⽽不能⽤FILEGLOB的⽅法
,因为在编译前该源为空,在VS中会出现MSB3073错误,提⽰copyfrom为空值。
SET(Plugins_TEST_Debug_DLL_FILE
${CMAKE_CURRENT_BINARY_DIR}/Debug/lib${PROJECT_NAME}.dll
)
SET(Plugins_TEST_Release_DLL_FILE
${CMAKE_CURRENT_BINARY_DIR}/Release/lib${PROJECT_NAME}.dll
)
add_custom_command(TARGET${PROJECT_NAME}
POST_BUILD
COMMAND${CMAKE_COMMAND}-E
copy_if_different
"$<$
"$<$
"${CMAKE_BINARY_DIR}/$<$
)
三、ADD_CUSTOM_TARGET
add_custom_target:
该命令可以给指定名称的⽬标执⾏指定的命令,该⽬标没有输出⽂件,并始终被构建。命令的格式为:
add_custom_target(Name[ALL][command1[args1...]]
[COMMANDcommand2[args2...]...]
[DEPENDSdependdependdepend...]
[BYPRODUCTS[files...]]
[WORKING_DIRECTORYdir]
[COMMENTcomment]
[JOB_POOLjob_pool]
[VERBATIM][USES_TERMINAL]
[COMMAND_EXPAND_LISTS]
[SOURCESsrc1[src2...]])
参数介绍:
Name:
指定⽬标的名称,单独成为⼀个⼦项⽬。
ALL:
表明此⽬标应添加到默认构建⽬标,以便每次都将运⾏(该命令名称不能为ALL)
SOURCES:
指定要包括在⾃定义⽬标中的其他源⽂件。指定的源⽂件将被添加到IDE项⽬⽂件中,以⽅便编辑,即使它们没有构建规则。
⽰例:将第三⽅库⽂件复制到项⽬运⾏时⽂件夹
#=============CopySourcefilestoBuildRuntimeDir===============
#该内容⼀般放在项⽬顶层的最后,
#⽬的是将项⽬⽣成后的执⾏⽂件所需的第三⽅库复制到执⾏程序⽬录,
#并区分Debug和Release版本。
#该⽅法中的COMMAND_EXPAND_LISTS参数值得关注,可以复制列表内所有⽂件。
FILE(GLOBPlugin_Runtime_Debug_DLL_FILESCONFIGURE_DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/Plugin_Runtime_Dir/Debug/*.*
)
FILE(GLOBPlugin_Runtime_Release_DLL_FILESCONFIGURE_DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/Plugin_Runtime_Dir/Release/*.*
)
FILE(GLOBPlugin_Runtime_Debug_Resources_FILESCONFIGURE_DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/Plugin_Runtime_Dir/Debug/Resources/icos/*.*
)
FILE(GLOBPlugin_Runtime_Release_Resources_FILESCONFIGURE_DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/Plugin_Runtime_Dir/Release/Resources/icos/*.*
)
add_custom_target(CopyRuntimeFilesALL
VERBATIM
COMMAND_EXPAND_LISTS
COMMAND${CMAKE_COMMAND}-E
make_directory"${PROJECT_BINARY_DIR}/$<$
COMMAND${CMAKE_COMMAND}-E
copy_if_different
"$<$
"$<$
"${PROJECT_BINARY_DIR}/$<$
COMMAND${CMAKE_COMMAND}-E
make_directory"${PROJECT_BINARY_DIR}/$<$
COMMAND${CMAKE_COMMAND}-E
copy_if_different
"$<$
"$<$
"${PROJECT_BINARY_DIR}/$<$
COMMAND${CMAKE_COMMAND}-E
make_directory"${PROJECT_BINARY_DIR}/$<$
)
四、COMMAND
cmakeversion3.15.2
Usage:
Availablecommands:
capabilities-ReportcapabilitiesbuiltintocmakeinJSONformat
chdirdircmd[args...]-runcommandinagivendirectory
compare_files[--ignore-eol]file1file2-checkiffile1issameasfile2
copy
copy_directory
copy_if_different
echo[
echo_append[
env[--unset=NAME]...[NAME=VALUE]...COMMAND[ARG]...
-runcommandinamodifiedenvironment
environment-displaythecurrentenvironment
make_directory
md5sum
sha1sum
sha224sum
sha256sum
sha384sum
sha512sum
remove[-f]
remove_directory
renameoldnamenewname-renameafileordirectory(ononevolume)
server-startcmakeinservermode
sleep
tar[cxt][vf][zjJ][file/dir1file/dir2...]-createorextractatarorziparchive
timecommand[args...]-runcommandanddisplayelapsedtime
touch
touch_nocreate
create_symlinkoldnew-createasymboliclinknew->old
AvailableonWindowsonly:
delete_regvkey-deleteregistryvalue
env_vs8_wincesdkname-displaysabatchfilewhichsetstheenvironmentfortheprovidedWindowsCESDKinstalledinVS2005
env_vs9_wincesdkname-displaysabatchfilewhichsetstheenvironmentfortheprovidedWindowsCESDKinstalledinVS2008
write_regvkeyvalue-writeregistryvalue
更多推荐
复制文件参数不正确
发布评论