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 ...
随机推荐
- web前端安全的三个关键点
一.浏览器的同源策略 同源策略:不同域的客户端脚本在未经授权的情况下不能读写对方的资源. 这里有几个关键词:域.脚本.授权.读写.资源 1.同域要求两个站点:同协议.同域名.同端口.下表展示了所列站点 ...
- 使用ab对网站进行压力测试
1.安装yum install httpd-tools 2.ab -kc 1000 -n 1000 http://localhost/ab.html 这个指令会使用1000个并发,进行连接1000次
- Linux磁盘空间不足处理方法
维护Linux服务器正常使用需要经常删除Linux系统运行产生的系统日志和业务环境产生的debug日志文件.安装包等.本文主要描述如何通过脚本实现清理业务环境产生的 debug日志文件和上传或备份的打 ...
- JDBC有哪些接口
1 实现Driver接口的对象是JDBC进行数据库访问的开始,可以通过java.lang.Class类的forName(),动态加载驱动程序. Class.forName("驱动程序&quo ...
- jQuery垂直二级导航菜单代码
http://www.sucaihuo.com/js/395.html 分享一个简单的垂直二级菜单导航. HTML <div id="my_menu" class=&qu ...
- Vue sync修饰符的使用
父子组件传值,父组件可以给子组件传值,但是子组件是不能修改组件提供的值,这里vue提供了sync修饰符,以前父组件点击子组件显示,子组件关闭按钮,父组件再点击子组件就无法让子组件显示.因为子组件点击关 ...
- 解决python3.6的UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 28613: illegal multibyte sequence
这是python3.6的print()函数自身有限制,不能完全打印所有的unicode字符. 主要的是windows下python的默认编码不是'utf-8',改一下python的默认编码成'utf- ...
- Spring AOP @Aspect
spring提供了两个核心功能,一个是IoC(控制反转),另外一个便是Aop(面向切面编程),IoC有助于应用对象之间的解耦,AOP则可以实现横切关注点(如日志.安全.缓存和事务管理)与他们所影响的对 ...
- python3 获得shell的输出内容(subprocess.getstatusoutput)
默认通过os.system(“shell")命令赋值,结果是0之类的,0表示shell命令运行正确 如果想获得shell输出的内容,可以通过[subprocess.getstatusoutp ...
- 【OpenGL】纹理(Texture)
纹理是一个2D图片(也有1D和3D),它用来添加物体的细节:这就像有一张绘有砖块的图片贴到你的3D的房子上,你的房子看起来就有了一个砖墙.因为我们可以在一张图片上插入足够多的细节,这样物体就会拥有很多 ...