CMake命令

CMake手册详解,作者翻译的很详细,以下是自己进行的摘录:

CMake80个命令(详细解释可以看here

CMD#1: add_custom_command为生成的构建系统添加一条自定义的构建规则。

add_custom_command命令有两种主要的功能;第一种是为了生成输出文件,添加一条自定义命令;第二种是为一个目标——比如一个库文件或者可执行文件——添加一条自定义命令。
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])

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

CMD#2: add_custom_target添加一个目标,它没有输出;这样它就总是会被构建。

add_custom_target(Name [ALL] [command1 [args1...]]
[COMMAND command2 [args2...] ...]
[DEPENDS depend depend depend ... ]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM]
[SOURCES src1 [src2...]])

CMD#3:add_definitions 为源文件的编译添加由-D引入的define flag。

add_definitions(-DFOO -DBAR ...)

CMD#4:add_dependencies 为顶层目标引入一个依赖关系。

add_dependencies(target-name depend-target1 depend-target2 ...)

CMD#5:add_executable: 使用给定的源文件,为工程生成一个可执行文件。

add_executable(<name> [WIN32] [MACOSX_BUNDLE]  //<name>对应于逻辑目标名字,并且在工程范围内必须是全局唯一的(比如<name>.exe或者仅仅是<name>)。如果指定了MACOSX_BUNDLE选项,对应的属性会附加在创建的目标上。
[EXCLUDE_FROM_ALL]     //如果指定了EXCLUDE_FROM_ALL选项,对应的属性将会设置在被创建的目标上。
source1 source2 ... sourceN)

CMD#6:add_library 使用指定的源文件向工程中添加一个库。

add_library(<name> [STATIC | SHARED | MODULE]  //<name>对应于逻辑目标名称,而且在一个工程的全局域内必须是唯一的(比如lib<name>.a或者<name>.lib)。指定STATIC,SHARED,或者MODULE参数用来指定要创建的库的类型。
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)

CMD#7:add_subdirectory 为构建添加一个子路径。

add_subdirectory(source_dir [binary_dir]   //source_dir选项指定了CMakeLists.txt源文件和代码文件的位置。binary_dir选项指定了输出文件的路径。
[EXCLUDE_FROM_ALL])   //如果指定了EXCLUDE_FROM_ALL选项,在子路径下的目标默认不会被包含到父路径的ALL目标里,并且也会被排除在IDE工程文件之外。

CMD#8:add_test 以指定的参数为工程添加一个测试。

add_test(testname Exename arg1 arg2 ... )   //如果已经运行过了ENABLE_TESTING [20]命令,这个命令将为当前路径添加一个测试目标。如果ENABLE_TESTING还没有运行过,该命令啥事都不做。 
//测试是由测试子系统运行的,它会以指定的参数执行Exename文件。Exename或者是由该工程构建的可执行文件,也可以是系统上自带的任意可执行文件(比如tclsh)。该测试会在CMakeList.txt文件的当前工作路径下运行,这个路径与二进制树上的路相对应。

add_test(NAME <name> [CONFIGURATIONS [Debug|Release|...]]
COMMAND <command> [arg1 [arg2 ...]])

CMD#9:aux_source_directory 查找在某个路径下的所有源文件。

aux_source_directory(<dir> <variable>)

CMD#10:break 从一个包围该命令的foreach或while循环中跳出。

CMD#11:build_command 获取构建该工程的命令行。

build_command(<variable>
[CONFIGURATION <config>]
[PROJECT_NAME <projname>]
[TARGET <target>])

CMD#12:cmake_minimum_required 设置一个工程所需要的最低CMake版本。

cmake_minimum_required(VERSION major[.minor[.patch[.tweak]]] [FATAL_ERROR])   //如果CMake的当前版本低于指定的版本,它会停止处理工程文件,并报告错误。


//当指定的版本高于2.4时,它会隐含调用:
cmake_policy(VERSION major[.minor[.patch[.tweak]]])

 //从而将cmale的策略版本级别设置为指定的版本。当指定的版本是2.4或更低时,这条命令隐含调用:

cmake_policy(VERSION 2.4)

CMD#13:cmake_policy 管理CMake的策略设置。

cmake_policy(VERSION major.minor[.patch[.tweak]])    //cmake_policy是用来设置“新行为”或“旧行为”的命令。如果支持单独设置策略,我们鼓励各项目根据CMake的版本来设置策略。

CMD#14:configure_file: 将一份文件拷贝到另一个位置并修改它的内容。

configure_file(<input> <output>
[COPYONLY] [ESCAPE_QUOTES] [@ONLY])

CMD#15:create_test_sourcelist: 为构建测试程序创建一个测试驱动器和源码列表。

create_test_sourcelist(sourceListName driverName
test1 test2 test3
EXTRA_INCLUDE include.h
FUNCTION function)

CMD#16:define_property:定义并描述(Document)自定义属性。

define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE |
                    TEST | VARIABLE | CACHED_VARIABLE>
                    PROPERTY <name> [INHERITED]
                    BRIEF_DOCS <brief-doc> [docs...]
                    FULL_DOCS <full-doc> [docs...])

CMD#17:else 开始一个if语句块的else部分。(参见if命令。)

CMD#18: elseif 开始 if 块的 elseif 部分。

CMD#19: enable_language 支持某种语言(CXX/C/Fortran/等)

enable_language(languageName [OPTIONAL] )

CMD#20: enable_testing 打开当前及以下目录中的测试功能。

enable_testing()

CMD#21: endforeach 结束foreach语句块中的一系列命令。

CMD#22: endfunction 结束一个function语句块中的一系列命令。

CMD#23: endif 结束一个if语句块中的一系列命令。

CMD#24: endmacro 结束一个macro语句块中的一系列命令。

CMD#25:endwhile结束一个while语句块中的一系列命令。

CMD#26: execute_process 执行一个或更多个子进程。

execute_process(COMMAND <cmd1> [args1...]]
[COMMAND <cmd2> [args2...] [...]]
[WORKING_DIRECTORY <directory>]
[TIMEOUT <seconds>]
[RESULT_VARIABLE <variable>]
[OUTPUT_VARIABLE <variable>]
[ERROR_VARIABLE <variable>]
[INPUT_FILE <file>]
[OUTPUT_FILE <file>]
[ERROR_FILE <file>]
[OUTPUT_QUIET]
[ERROR_QUIET]
[OUTPUT_STRIP_TRAILING_WHITESPACE]
[ERROR_STRIP_TRAILING_WHITESPACE])
 

CMD#27:export 从构建树中导出目标供外部使用。

export(TARGETS [target1 [target2 [...]]] [NAMESPACE <namespace>]
[APPEND] FILE <filename>)

CMD#28: file 文件操作命令

file(WRITE filename "message to write"... )
file(APPEND filename "message to write"... )
file(READ filename variable [LIMIT numBytes] [OFFSET offset] [HEX])
file(STRINGS filename variable [LIMIT_COUNT num]
[LIMIT_INPUT numBytes] [LIMIT_OUTPUT numBytes]
[LENGTH_MINIMUM numBytes] [LENGTH_MAXIMUM numBytes]
[NEWLINE_CONSUME] [REGEX regex]
[NO_HEX_CONVERSION])
file(GLOB variable [RELATIVE path] [globbing expressions]...)
file(GLOB_RECURSE variable [RELATIVE path] 
[FOLLOW_SYMLINKS] [globbing expressions]...)
file(RENAME <oldname> <newname>)
file(REMOVE [file1 ...])
file(REMOVE_RECURSE [file1 ...])
file(MAKE_DIRECTORY [directory1 directory2 ...])
file(RELATIVE_PATH variable directory file)
file(TO_CMAKE_PATH path result)
file(TO_NATIVE_PATH path result)
file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log]
[EXPECTED_MD5 sum] [SHOW_PROGRESS])

CMD#29:find_file 查找一个文件的完整路径。

find_file(<VAR> name1 [path1 path2 ...])    

CMD#30:find_library 查找一个库文件

find_library(<VAR> name1 [path1 path2 ...])    //它与命令find_library(<VAR> name1 [PATHS path1 path2 ...])等价。

CMD#31:find_package 查找并加载外来工程的设置。

find_package(<package> [version] [EXACT] [QUIET][[REQUIRED|COMPONENTS] [components...]] [NO_POLICY_SCOPE])  //[version]参数需要一个版本号。 EXACT选项要求该版本号必须精确匹配。
//该命令会设置<package>_FOUND变量,用来指示要找的包是否被找到了。如果这个包被找到了,与它相关的信息可以通过包自身记载的变量中得到。
//REQUIRED选项表示如果包没有找到的话,cmake的过程会终止,并输出警告信息。
//在REQUIRED选项之后,或者如果没有指定REQUIRED选项但是指定了COMPONENTS选项,在它们的后面可以列出一些与包相关的部件清单(components list)。

CMD#32 : find_path 搜索包含某个文件的路径

find_path(<VAR> name1 [path1 path2 ...])   //它与命令find_path(<VAR> name1 [PATHS path1 path2 ...])等价。

CMD#33:find_program 查找可执行程序

find_program(<VAR> name1 [path1 path2 ...])   //它与命令find_program(<VAR> name1 [PATHS path1 path2 ...])等价。

CMD#34:fltk_wrap_ui 创建FLTK用户界面包装器。

fltk_wrap_ui(resultingLibraryName source1 source2 ... sourceN )  //为所有列出的.fl和.fld文件生成.h和.cxx文件。这些生成的.h和.cxx文件将会加到变量resultingLibraryName_FLTK_UI_SRCS中,它也会加到你的库中。

CMD#35:foreach 对一个list中的每一个变量执行一组命令。

CMD#36 : function 开始记录一个函数,为以后以命令的方式调用它做准备。

CMD#37 : get_cmake_property 获取一个CMake实例的属性。

CMD#38 : get_directory_property 获取DIRECTORY域中的某种属性。

CMD#39 : get_filename_component 得到一个完整文件名中的特定部分。

CMD#40 : get_property 获取一个属性值

CMD#41 : get_source_file_property 为一个源文件获取一种属性值。

CMD#42 : get_target_property 从一个目标中获取一个属性值。

CMD#43 : get_test_property 获取一个测试的属性。

CMD#44 : if 条件执行一组命令。

CMD#45 : include 从给定的文件中读取CMake的列表文件。

include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR> [NO_POLICY_SCOPE])

CMD#46 : include_directories 为构建树添加包含路径。

include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)  //将给定的路径添加到编译器搜索包含文件(.h文件)的路径列表中。

CMD#47 : include_external_msproject 在一个workspace中包含一个外部的Microsoft工程。

include_external_msproject(projectname location dep1 dep2 ...)

CMD#48 : include_regular_expression 设置用于依赖性检查的正则表达式。

include_regular_expression(regex_match [regex_complain])

CMD#49 : install 指定在安装时要运行的规则。

  • TARGETS版本的install命令规定了安装工程中的目标(targets)的规则。

    install(TARGETS targets... [EXPORT <export-name>]
    [[ARCHIVE|LIBRARY|RUNTIME|FRAMEWORK|BUNDLE|
    PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE] //有5中可以被安装的目标文件:ARCHIVE存档,LIBRARY库,RUNTIME运行时间,FRAMEWORK框架,和BUNDLE批量。 [DESTINATION <dir>] [PERMISSIONS permissions...] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [OPTIONAL] [NAMELINK_ONLY|NAMELINK_SKIP] ] [...])
    //除了被标记为MACOSX_BUNDLE属性的可执行文件被当做OS X上的BUNDLE目标外,其他的可执行文件都被当做RUNTIME目标。
    静态链接的库文件总是被当做ARCHIVE目标。模块库总是被当做LIBRARY目标。
    对于动态库不是DLL格式的平台来说,动态库会被当做LIBRARY目标来对待,被标记为FRAMEWORK的动态库是例外,它们被当做OS X上的FRAMEWORK目标。对于DLL平台而言,动态库的DLL部分被当做一个RUNTIME目标而对应的导出库被当做是一个ARCHIVE目标。
    所有基于Windows的系统,包括Cygwin,都是DLL平台。ARCHIVE,LIBRARY,RUNTIME和FRAMEWORK参数改变了后续属性会加诸之上的目标的类型。如果只给出了一种类型,那么只有那种类型的目标会被安装(这样通常只会安装一个DLL或者一个导出库。)

    //可以指定NAMELINK_ONLY或者NAMELINK_SKIP选项作为LIBRARY选项。在一些平台上,版本化的共享库有一个符号链接,比如lib<name>.so -> lib<name>.so.1,其中“lib<name>.so.1”是so库文件名(soname)而“lib<name>.so”是一个符号链接,
    当指定“-l<name>”选项时,链接器将会查找这个符号链接。如果一个库目标已经被安装,NAMELINK_ONLY选项表示仅仅安装符号链接;而NAME_SKIP选项则表示仅仅安装库文件而不是符号链接。当两种选项都没有给出时,动态库的两个部分都会被安装。
    在那些版本化的共享库没有符号链接或者库没有被版本化的平台,选项NAMELINK_SKIP安装这个库,而NAMELINK_ONLY选项什么都不会安装。
   在该命令的TARGETS版本的一次调用中,可以一次性指定一个或多个属性组。一个目标也可以被多次安装到不同的位置。
假设有三个目标myExe,mySharedLib和myStaticLib,下面的代码:
install(TARGETS myExe mySharedLib myStaticLib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib/static)
install(TARGETS mySharedLib DESTINATION /some/full/path)
//将会把myExe安装到<prefix>/bin目录下,把myStaticLib安装到<prefix>/lib/static目录下。
//在非-DLL平台上,mySharedLib将会被安装到<prefix>/lib和/some/full/path下。
//在DLL平台上,mySharedLib DLL将会被安装到<prefix>/bin和/some/full/path路径下,它的导出库会被安装到<prefix>/lib/static和/some/full/path路径下。[对应上面有相应解释]
  • FILES版本的install命令指定了为一个工程安装文件的规则。

    install(FILES files... DESTINATION <dir>
    [PERMISSIONS permissions...]
    [CONFIGURATIONS [Debug|Release|...]]
    [COMPONENT <component>]
    [RENAME <name>] [OPTIONAL])

    //在命令中,以相对路径方式给出的文件名是相对于当前源代码路径而言的。以这个版本安装的文件,如果没有指定PERMISSIONS选项,默认会具有OWNER_WRITE,OWNER_READ,GROUP_READ,和WORLD_READ的权限。
  • PROGRAMS版本的install命令(装不是目标的程序,比如shell脚本。使用TARGETS格式安装该工程内部构建的目标。

    install(PROGRAMS files... DESTINATION <dir>
    [PERMISSIONS permissions...]
    [CONFIGURATIONS [Debug|Release|...]]
    [COMPONENT <component>]
    [RENAME <name>] [OPTIONAL])

    //PROGRAMS版本与FILES版本一样,只在默认权限上有所不同:它还包括了OWNER_EXECUTE,GROUP_EXECUTE和WORLD_EXECUTE选项。
  • DIRECTORY版本的install命令将一个或者多个路径下的内容安装到指定的目标地址下。

    install(DIRECTORY目录 dirs... DESTINATION目的地 <dir>
    [FILE_PERMISSIONS permissions...]
    [DIRECTORY_PERMISSIONS permissions...]
    [USE_SOURCE_PERMISSIONS] [OPTIONAL]
    [CONFIGURATIONS [Debug|Release|...]]
    [COMPONENT <component>] [FILES_MATCHING]
    [[PATTERN <pattern> | REGEX <regex>]
    [EXCLUDE] [PERMISSIONS permissions...]] [...])

    //目录结构会原封不动地(verbatim)拷贝到目标地址。每个路径名的最后一部分会追加到目标路径下,但是结尾反斜杠(trailing slash)可以用来避免这一点,因为这样最后一部分就是空的。
    给定的相对路径名被解释成相对于当前源路径的路径。如果没有指定输入目录名字,目标目录会被创建,但是不会安装任何东西。
    FILE_PERMISSIONS和DIRECTORY_PERMISSIONS选项指定了赋予目标路径和目标文件的权限。
    如果指定了USE_SOURCE_PERMISSIONS选项,但没有指定FILE_PERMISSIONS选项,文件权限将沿袭源目录结构的权限,而且这个路径会被赋予PAROGRAMS版本中指定的默认权限。
  • SCRIPTCODE版本的install命令

    install([[SCRIPT <file>] [CODE <code>]] [...])
  • EXPORT版本的install命令
install(EXPORT <export-name> DESTINATION <dir>
[NAMESPACE <namespace>] [FILE <name>.cmake]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>])

CMD#50 :link_directories 指定连接器查找库的路径。

原文地址:https://www.cnblogs.com/Jessica-jie/p/8511016.html