add_custom_command
为生产的构建系统添加一条自定义的构建规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
add_custom_command(OUTPUT output1 [output2 ...] COMMAND command1 [ARGS] [args1...] [COMMAND command2 [ARGS] [args2...] ...] [MAIN_DEPENDENCY depend] [DEPENDS [depends...]] [IMPLICIT_DEPENDS <lang1> depend1 ...] [WORKING_DIRECTORY dir] [COMMENT comment] [VERBATIM] [APPEND]) |
这种命令格式定义了一条生成指定文件或文件组的生成命令。在相同路径下创建的CMakeLists文件,对于这个CMakeLists文件来说,任何自定义命令的输出都作为它的源文件,而这些源文件,都被设置了一条规则。
什么规则呢?
在构建的时候,使用指定的规则来生成这些文件。如果,一个输出文件名是相对路径,它将被解释成相对于构建树路径的相对路径,别且与当前源码路径是相应的。
注意
MAIN_DEPENDENCY完全是可选的,它用来向Visual Studio建议在哪个地方停止自定义命令
1 2 3 4 5 6 7 8 9 10 11 |
add_custom_command(TARGET target PRE_BUILD | PRE_LINK | POST_BUILD COMMAND command1 [ARGS] [args1...] [COMMAND command2 [ARGS] [args2...] ...] [WORKING_DIRECTORY dir] [COMMENT comment] [VERBATIM]) |
这种命令格式为一个目标添加一条自定义命令
目标,比如库文件或者可执行文件
这种格式可以用于目标构建前或者构建后的一些操作。
这条命令会成为目标的一部分,并且,只有目标被构建时它才会执行。如果目标已经构建了,将不会执行。
PRE_BUILD | 在所有其他依赖之前执行 |
PRE_LINK | 在所有其他的依赖之后执行 |
POST_BUILD | 在目标在构建之后执行 |
add_definitions
- 为源文件的编译添加由-D引入的define flag
1add_definitions(-DFOO -DBAR)- 再编译器的命令行上,为当前路径以及下层路径的源文件加入一些define flag。
- 这个命令可以引入任何flag,但是他的愿意是用来引入预处理器的定义
- 那些以-D或者/D开头的,看起来像是预处理器定义的flag,会被自动加入到当前路径的COMPILE_DEFINITIONS属性中
add_dependencies
为顶层目标引入一个依赖关系
1 |
add_dependencies(target-name depend-target1 depend-target2 ...) |
- 让一个顶层目标依赖于其他的顶层目标
- 一个顶层目标是由命令ADD_EXECUTABLE,ADD_LIBRARY或者是,ADD_CUSTOM_TARGET产生的目标
add_executable
- 使用给定得源文件,为工程引入一个可执行文件
123add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL]source1 source2 ... sourceN)- 可执行目标名是
- 该目标会由调用该命令时在源文件列表中指定得源文件来构建
-
对应于逻辑目标名字,并且在工程范围内必须是全局唯一的。
- 可执行目标名是
- 如果指定了MACOSX_BUNDLE选项,对应的属性会附加在创建的目标上
- 如果指定了EXCLUDE_FROM_ALL选项,对应的属性会附加在创建的目标上
- 如果使用下面的格式,可以用来创建导入的可执行目标
1add_executable(<name> IMPORTED) - 示例代码
123cmake_minimum_required (VERSION 2.6)project (Uitplugin)add_executable (Uitplugin uitplugin.cxx)
add_library
- 使用指定的源文件向工程中添加一个库
123add_library(<name> [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL]source1 source2 ... sourceN) - 添加一个名为
的库文件,这个库文件会根据调用的命令里列出的源文件来创建 -
对应于逻辑目标名称,且再一个工程的全局域内必须是唯一的 - 库文件名称将根据对应平台的命令约定来构造
- lib
.a -
.lib
- lib
- 可以指定参数来指定要创建的库的类型
- STATIC
- 库是目标文件的归档文件,在链接其他目标的时候使用
- SHARED
- 库会被动态链接,在运行时被加载
- MODULE
- 库是不会被链接到其他目标中的插件,但是可能会在运行时使用dlopen-系列的函数动态链接
- 如果没有类型被显示指定,这个选项会根据BUILD_SHARED_LIBS的当前值是否为真来决定是STATIC还是SHARED
- STATIC
- 注
- 导入的库目标是引用了在工程外的一个库文件的目标
- 并没有生成构建这个库的规则
- 这个目标名字的作用域在它被创建的路径及以下有效
add_subdirectory
- 为构建添加一个子路径
12add_subdirectory(source_dir [binary_dir][EXCLUDE_FROM_ALL]) - source_dir指定了CMakeLists.txt源文件和代码文件的位置
- 如果这个source_dir是一个相对路径,那么source_dir选项会被解释为相对于当前的目录
- 它可以是绝对路径
- binary_dir指定了输出文件的路径
- 如果这个binary是一个相对路径,那么它会被解释为相对于当前输出路径
- 它可以是绝对路径
- 如果没有指定binary_dir,binary_dir的值将会是没有做任何相对路径展开的source_dir。
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ CMake生成器10/02
- ♥ 使用Cmake构建工程:一05/17
- ♥ CMakeLists10/02
- ♥ Cmake应用记述二05/12
- ♥ Makefile记述一08/15
- ♥ CMake教程一06/20