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实例的属性。
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)的规则。
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版本中指定的默认权限。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 指定连接器查找库的路径。
CMake命令的更多相关文章
- CMake命令/函数汇总(翻译自官方手册)
查看官方文档 cmake命令 选项 CMake变量 CMake命令汇总 / add_custom_command add_custom_target/add_definitions/add_depen ...
- Zsh安装CMake补全脚本进行CMake命令补全
最近在尝试使用Zsh,发现其补全命令的功能相当厉害.但对CMake命令的补全在默认的5.0.5中好像没有看到,网上找了下关于配置Zsh补全的文章也没有多少. 于是自己动手,发现在Zsh安装目录 ...
- cmake命令收集
cmake中一些预定义变量 PROJECT_SOURCE_DIR 工程的根目录 PROJECT_BINARY_DIR 运行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/bui ...
- CMake命令行添加编译参数
CMake命令行添加编译参数 学习自 coroserver 例程: https://github.com/windoze/coroserver coroserver 是一个应用 Boost.Asio ...
- cmake命令 安装、用法简介
前言 cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中所产生的衍生品.后来经过发展,最终形成体系,在2001年成为一个独立的开放源代码项目.其官方网站是www.cm ...
- mysql配置文件夹错误:在安装mysql 5.6.19 时运行cmake命令是出现CMake Error: The source directory does not appear to contai
在安装mysql 5.5.xx 时运行cmake命令是出现CMake Error: The source directory does not appear to contain CMakeLists ...
- CMake 命令行设定编译环境
笔者电脑安装了两个版本的VS(VS2012 和 VS2010),在使用CMake编译的时候,如果只在对应目录的命令行输入 "cmake .." 则系统会自动选择使用新版本(VS2 ...
- CMake命令笔记
project 为整个工程设置名称.版本和启用语言 project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])projec ...
- CMake命令之list
用途:提供一些列表操作 list(LENGTH <list><output variable>) list(GET <list> <elementindex ...
随机推荐
- kinematic与static刚体不会触发任何接触回调
Main.as package{ import Box2D.Common.Math.b2Vec2; import Box2D.Dynamics.b2Body; import Box2D.Dynamic ...
- linux /dev/null 中有数据
前段时间有个同事问我说,他 cat /dev/null有数据.这个颠覆大家认知的问题最终却是个小问题. 我们来看/dev/null的操作函数: static const struct memdev { ...
- 一小段测试atof的代码
#include <stdio.h> //#include <stdlib.h> double a=0; int main(int argc, char *argv[]) { ...
- 【x】 PAT/BasicLevel_C++/1002. 写出这个数 (20).cpp
C++中的to_string()函数[C++11支持] - Bravo Yeung-羊较瘦之自留地 - CSDN博客https://blog.csdn.net/lzuacm/article/detai ...
- userdel删除用户失败提示:userdel: user * is currently logged in 解决方法
操作环境 SuSE10/SuSE11 问题现象 执行userdel -rf oracle删除用户失败,提示userdel: user 'oracle' is currently logged in ...
- jQuery 知识体系
jQuery基础知识一 jQuery之知识二-选择器 [jQuery知识]jQuery之知识三-过滤器 [jQuery知识]jQuery之知识四-DOM和CSS操作 [jQuery知识]jQuery之 ...
- mysql 回顾
主键可以是一个或者是多个列,但所有的列(或者是列的组合)必须是唯一的,非空的 关键字distinct 可以去重,实现该效果还可以使用group by limit 默认从 0 开始,limit 5 其实 ...
- ArcGIS 10安装及破解
1.下载 ArcGIS 10 安装程序及破解文件后面提供电驴的下载地址(可以使用迅雷.QQ旋风等下载工具下载),下载文件是一个光盘镜像文件:? ArcGIS_Desktop10_122519.iso. ...
- ios instancetype 和 id 的异同
1.0 相同点:都可以作为方法的返回类型 2.0 不同点: a.instancetype 可以返回和方法所在类相同类型的对象 id 只能返回未知类型的对象 b. instancetype 只能作为 ...
- AndroidScreenSlide项目切换view动画效果《IT蓝豹》
AndroidScreenSlide项目切换view动画效果 AndroidScreenSlide项目中有几个不错的效果,一:Card Flip翻页立体效果,二:Screen Slide 左右切换vi ...