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 指定连接器查找库的路径。

  • 相关阅读:
    204. Count Primes (Integer)
    203. Remove Linked List Elements (List)
    202. Happy Number (INT)
    201. Bitwise AND of Numbers Range (Bit)
    200. Number of Islands (Graph)
    199. Binary Tree Right Side View (Tree, Stack)
    198. House Robber(Array; DP)
    191. Number of 1 Bits (Int; Bit)
    190. Reverse Bits (Int; Bit)
    189. Rotate Array(Array)
  • 原文地址:https://www.cnblogs.com/Jessica-jie/p/8511016.html
Copyright © 2011-2022 走看看