CMake自定义内容

Customize field.

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]
)

为某个目标(如库或可执行程序)添加一个定制命令。

这种定制命令可以设置在,构建这个目标过程中的某些时机。也就是就,这种场景可以在目标构建的过程中,添加一些额外执行的命令。这些命令本身将会成为该目标的一部分。

Last updated