CMake除了内置的一系列指令和规定的可执行文件/库两种构建目标之外,还允许用户定制自己的指令和构建目标,但在实际开发过程中并不常见。
add_custom_target
add_custom_target(Name [ALL] [command1 [args1...]]
[COMMAND command2 [args2...] ...]
[DEPENDS depend depend depend ... ]
[BYPRODUCTS [files...]]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[JOB_POOL job_pool]
[VERBATIM] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS]
[SOURCES src1 [src2...]])
ALL
:表明该目标会被添加到默认的构建目标,使得它每次都被运行; COMMAND
:指定要在构建时执行的命令行; DEPENDS
:指定命令所依赖的文件; COMMENT
:在构建时执行命令之前显示给定消息; WORKING_DIRECTORY
:使用给定的当前工作目录执行命令。如果它是相对路径,它将相对于对应于当前源目录的构建树目录; BYPRODUCTS
:指定命令预期产生的文件。
cmake_minimum_required(VERSION 3.10)
project(test)
# 添加一个自定义目标CopyTask
add_custom_target(CopyTask
# 复制文件到指定位置
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/config ${CMAKE_CURRENT_SOURCE_DIR}/etc
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/log.txt ${CMAKE_CURRENT_SOURCE_DIR}/etc
)
假如CMakeList.txt
未指定ALL
选项,在构建时需要使用--target <Name>
参数,系统才会将构建自定义的目标,即构建指令为:
cmake -H. -BBuild --target CopyTask
add_custom_command
add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1 [ARGS] [args1...]``
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS [depends...]]
[BYPRODUCTS [files...]]
[IMPLICIT_DEPENDS <lang1> depend1
[<lang2> depend2] ...]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[DEPFILE depfile]
[JOB_POOL job_pool]
[VERBATIM] [APPEND] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS]
)
OUTPUT
:指定命令预期产生的输出文件。如果输出文件的名称是相对路径,即相对于当前的构建的源目录路径; COMMAND
:指定要在构建时执行的命令行; DEPENDS
:指定命令所依赖的文件; COMMENT
:在构建时执行命令之前显示给定消息; WORKING_DIRECTORY
:使用给定的当前工作目录执行命令。如果它是相对路径,它将相对于对应于当前源目录的构建树目录; DEPFILE
:为生成器指定一个.d depfile .d文件保存通常由自定义命令本身发出的依赖关系; MAIN_DEPENDENCY
:指定命令的主要输入源文件; BYPRODUCTS
:指定命令预期产生的文件。
生成文件
cmake_minimum_required(VERSION 3.10)
project(test)
add_custom_command(OUTPUT COPY_RES
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/config ${CMAKE_CURRENT_SOURCE_DIR}/etc
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/log.txt ${CMAKE_CURRENT_SOURCE_DIR}/etc
)
add_custom_target(CopyTask ALL DEPENDS COPY_RES)
add_custom_target
生成一个目标CopyTask
,该目标依赖于COPY_RES
。而对于COPY_RES
而言,它实际上是用来复制文件夹或者复制文件的,也就是COMMAND
中定义的操作。
构建事件
add_custom_command(TARGET <target>
PRE_BUILD | PRE_LINK | POST_BUILD
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[BYPRODUCTS [files...]]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[VERBATIM] [USES_TERMINAL]
)
为某个目标(如库或可执行程序)添加一个定制命令。
这种定制命令可以设置在,构建这个目标过程中的某些时机。也就是就,这种场景可以在目标构建的过程中,添加一些额外执行的命令。这些命令本身将会成为该目标的一部分。