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实例的属性。
C
MD#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)的规则。
在该命令的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版本中指定的默认权限。 -
SCRIPT和CODE版本的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 指定连接器查找库的路径。