zoukankan      html  css  js  c++  java
  • 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 指定连接器查找库的路径。

  • 相关阅读:
    k8s健康检查(9)
    k8s滚动更新(8)
    如何访问pod --- service(7)
    函数表达式
    面向对象的程序设计
    引用类型(下)
    引用类型(上)
    变量、作用域和内存问题
    JavaScript基本概念(下)
    JavaScript基本概念(上)
  • 原文地址:https://www.cnblogs.com/Jessica-jie/p/8511016.html
Copyright © 2011-2022 走看看