转: CMake 常用命令解析

参考:

http://www.cnblogs.com/coderfenghc/archive/2012/06/16/CMake_ch_01.html

一、常用命令解析

1、CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

     #CMake 最低版本要求,低于2.8 构建构过程会被终止


2、PROJECT(gpuMat)

     #定义工程名称


3、FIND_PACKAGE(CUDA REQUIRED)

 find_package 为外部工程加载设置。

 find_package(<package> [version] [EXACT] [QUIET]
               [[REQUIRED|COMPONENTS] [components...]]
               [NO_POLICY_SCOPE])

  查找并加载外来工程的设置。该命令会设置<package>_FOUND变量,用来指示要找的包是否被找到了。如果这个包被找到了,与它相关的信息可以通过包自身记载的变量中得到。QUIET选项将会禁掉包没有被发现时的警告信息。REQUIRED选项表示如果报没有找到的话,cmake的过程会终止,并输出警告信息。在REQUIRED选项之后,或者如果没有指定REQUIRED选项但是指定了COMPONENTS选项,在它们的后面可以列出一些与包相关的部件清单(components list)。[version]参数需要一个版本号,它是正在查找的包应该兼容的版本号(格式是major[.minor[.patch[.tweak]]])。EXACT选项要求该版本号必须精确匹配。如果在find-module内部对该命令的递归调用没有给定[version]参数,那么[version]和EXACT选项会自动地从外部调用前向继承。对版本的支持目前只存在于包和包之间(详见下文)。

  用户代码总体上应该使用上述的简单调用格式查询需要的包。本命令文档的剩余部分则详述了find_package的完整命令格式以及具体的查询过程。期望通过该命令查找并提供包的项目维护人员,我们鼓励你能继续读下去。

  该命令在搜索包时有两种模式:“模块”模式和“配置”模式。当该命令是通过上述的精简格式调用的时候,合用的就是模块模式。在该模式下,CMake搜索所有名为Find<package>.cmake的文件,这些文件的路径由变量由安装CMake时指定的CMAKE_MODULE_PATH变量指定。如果查找到了该文件,它会被CMake读取并被处理。该模式对查找包,检查版本以及生成任何别的必须信息负责。许多查找模块(find-module)仅仅提供了有限的,甚至根本就没有对版本化的支持;具体信息查看该模块的文档。如果没有找到任何模块,该命令会进入配置模式继续执行。


4、INCLUDE(FindCUDA)

  include 从给定的文件中读取CMake的列表文件。

  include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>]
                        [NO_POLICY_SCOPE])

  从给定的文件中读取CMake的清单文件代码。在清单文件中的命令会被立即处理,就像它们是写在这条include命令展开的地方一样。如果指定了OPTIONAL选项,那么如果被包含文件不存在的话,不会报错。如果指定了RESULT_VARIABLE选项,那么var或者会被设置为被包含文件的完整路径,或者是NOTFOUND,表示没有找到该文件。

  如果指定的是一个模块(module)而不是一个文件,查找的对象会变成路径CMAKE_MODULE_PATH下的文件<modulename>.camke。

       一句话, 就告诉了CMake “我们的程序需要CUDA”。


5、INCLUDE_DIRECTORIES(/usr/local/cuda/include)

  include_directories 为构建树添加包含路径。

  include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

  将给定的路径添加到编译器搜索包含文件(.h文件)的路径列表中。缺省情况下,该路径会被附加在当前路径列表的后面。这种缺省行为可以通过设置CMAKE_include_directories_BEFORE变量为ON被改变。通过将该变量改变为BEFORE或AFTER,你可以在追加和附加在前端这两种方式中选择,而不用理会缺省设置。如果指定了SYSTEM选项,编译器将会认为该路径是某种平台上的系统包含路径。


6、FILE(GLOB SOURCES “*.cu” “*.cpp” “*.c” “*.h”)

  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])

  WRITE选项将会写一条消息到名为filename的文件中。如果文件已经存在,该命令会覆盖已有的文件;如果文件不存在,它将创建该文件。

  APPEND选项和WRITE选项一样,将会写一条消息到名为filename的文件中,只是该消息会附加到文件末尾。

  READ选项将会读一个文件中的内容并将其存储在变量里。读文件的位置从offset开始,最多读numBytes个字节。如果指定了HEX参数,二进制代码将会转换为十六进制表达方式,并存储在变量里。

  STRINGS将会从一个文件中将一个ASCII字符串的list解析出来,然后存储在variable变量中。文件中的二进制数据会被忽略。回车换行符会被忽略。它也可以用在Intel的Hex和Motorola的S-记录文件;读取它们时,它们会被自动转换为二进制格式。可以使用NO_HEX_CONVERSION选项禁止这项功能。LIMIT_COUNT选项设定了返回的字符串的最大数量。LIMIT_INPUT设置了从输入文件中读取的最大字节数。LIMIT_OUTPUT设置了在输出变量中存储的最大字节数。LENGTH_MINIMUM设置了要返回的字符串的最小长度;小于该长度的字符串会被忽略。LENGTH_MAXIMUM设置了返回字符串的最大长度;更长的字符串会被分割成不长于最大长度的字符串。NEWLINE_CONSUME选项允许新行被包含到字符串中,而不是终止它们。REGEX选项指定了一个待返回的字符串必须满足的正则表达式。典型的使用方式是:

  file(STRINGS myfile.txt myfile)

该命令在变量myfile中存储了一个list,该list中每个项是输入文件中的一行文本。
  GLOB选项将会为所有匹配查询表达式的文件生成一个文件list,并将该list存储进变量variable里。文件名查询表达式与正则表达式类似,只不过更加简单。如果为一个表达式指定了RELATIVE标志,返回的结果将会是相对于给定路径的相对路径。文件名查询表达式的例子有:

   *.cxx      - 匹配所有扩展名为cxx的文件。
   *.vt?      - 匹配所有扩展名是vta,...,vtz的文件。
   f[3-5].txt - 匹配文件f3.txt, f4.txt, f5.txt。

  GLOB_RECURSE选项将会生成一个类似于通常的GLOB选项的list,只是它会寻访所有那些匹配目录的子路径并同时匹配查询表达式的文件。作为符号链接的子路径只有在给定FOLLOW_SYMLINKS选项或者cmake策略CMP0009被设置为NEW时,才会被寻访到。参见cmake –help-policy CMP0009 查询跟多有用的信息。

使用递归查询的例子有:

 /dir/*.py  - 匹配所有在/dir及其子目录下的python文件。

  MAKE_DIRECTORY选项将会创建指定的目录,如果它们的父目录不存在时,同样也会创建。(类似于mkdir命令——译注)

  RENAME选项对同一个文件系统下的一个文件或目录重命名。(类似于mv命令——译注)

  REMOVE选项将会删除指定的文件,包括在子路径下的文件。(类似于rm命令——译注)

  REMOVE_RECURSE选项会删除给定的文件以及目录,包括非空目录。(类似于rm -r 命令——译注)

  RELATIVE_PATH选项会确定从direcroty参数到指定文件的相对路径。

  TO_CMAKE_PATH选项会把path转换为一个以unix的 / 开头的cmake风格的路径。输入可以是一个单一的路径,也可以是一个系统路径,比如”$ENV{PATH}”。注意,在调用TO_CMAKE_PATH的ENV周围的双引号只能有一个参数(Note the double quotes around the ENV call TO_CMAKE_PATH only takes one argument. 原文如此。quotes和后面的takes让人后纠结,这句话翻译可能有误。欢迎指正——译注)。

  TO_NATIVE_PATH选项与TO_CMAKE_PATH选项很相似,但是它会把cmake风格的路径转换为本地路径风格:windows下用\,而unix下用/。

  DOWNLOAD 将给定的URL下载到指定的文件中。如果指定了LOG var选项,下载日志将会被输出到var中。如果指定了STATUS var选项,下载操作的状态会被输出到var中。该状态返回值是一个长度为2的list。list的第一个元素是操作的数字返回值,第二个返回值是错误的字符串值。错误信息如果是数字0,操作中没有发生错误。如果指定了TIMEOUT time选项,在time秒之后,操作会超时退出;time应该是整数。如果指定了EXPECTED_MD5 sum选项,下载操作会认证下载的文件的实际MD5和是否与期望值匹配。如果不匹配,操作将返回一个错误。如果指定了SHOW_PROGRESS选项,进度信息会以状态信息的形式被打印出来,直到操作完成。

  file命令还提供了COPY和INSTALL两种格式:

  file(<COPY|INSTALL> files... DESTINATION <dir>
       [FILE_PERMISSIONS permissions...]
       [DIRECTORY_PERMISSIONS permissions...]
       [NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
       [FILES_MATCHING]
       [[PATTERN <pattern> | REGEX <regex>]
        [EXCLUDE] [PERMISSIONS permissions...]] [...])

7、CUDA_ADD_EXECUTABLE(app ${SOURCES})

  add_executable: 使用给定的源文件,为工程引入一个可执行文件。

  add_executable(<name> [WIN32] [MACOSX_BUNDLE]
                 [EXCLUDE_FROM_ALL]
                 source1 source2 ... sourceN)

  引入一个名为<name>的可执行目标,该目标会由调用该命令时在源文件列表中指定的源文件来构建。<name>对应于逻辑目标名字,并且在工程范围内必须是全局唯一的。被构建的可执行目标的实际文件名将根据具体的本地平台创建出来(比如<name>.exe或者仅仅是<name>)。

  默认情况下,可执行文件将会在构建树的路径下被创建,对应于该命令被调用的源文件树的路径。如果要改变这个位置,查看RUNTIME_OUTPUT_DIRECTORY目标属性的相关文档。如果要改变最终文件名的<name>部分,查看OUTPUT_NAME目标属性的相关文档。

  如果指定了MACOSX_BUNDLE选项,对应的属性会附加在创建的目标上。查看MACOSX_BUNDLE目标属性的文档可以找到更多的细节。

  如果指定了EXCLUDE_FROM_ALL选项,对应的属性将会设置在被创建的目标上。查看EXCLUDE_FROM_ALL目标属性的文档可以找到更多的细节。

  使用下述格式,add_executable命令也可以用来创建导入的(IMPORTED)可执行目标:

  add_executable(<name> IMPORTED)

   一个导入的可执行目标引用了一个位于工程之外的可执行文件。该格式不会生成构建这个目标的规则。该目标名字的作用域在它被创建的路径以及底层路径有效。它可以像在该工程内的其他任意目标一样被引用。导入可执行文件为类似于add_custom_command之类的命令引用它提供了便利。


8、LIST(APPEND CMAKE_CXX_FLAGS “-std=c++0x -O3 -ffast-math -Wall”)

  list 列表操作命令。

  list(LENGTH <list> <output variable>)
    list(GET <list> <element index> [<element index> ...] <output variable>)
    list(APPEND <list> <element> [<element> ...])
    list(FIND <list> <value> <output variable>)
    list(INSERT <list> <element_index> <element> [<element> ...])
    list(REMOVE_ITEM <list> <value> [<value> ...])
    list(REMOVE_AT <list> <index> [<index> ...])
    list(REMOVE_DUPLICATES <list>)
    list(REVERSE <list>)
    list(SORT <list>)

  使用LENGTH选项时,该命令会返回给定list的长度。

  使用GET选项时,该命令返回list中所有被index索引的元素构成的list。

  使用APPEND选项时,该命令将会在该list之后追加若干元素。

  使用FIND选项时,该命令将返回list中指定的元素的索引;若果未找到,返回-1。

  使用INSERT选项时,该命令将在list中指定的位置插入若干元素。

  使用REMOVE_AT和REMOVE_ITEM选项将会从list中删除一些元素。它们之间的区别是:REMOVE_ITEM删除的是指定的项,而REMOVE_AT删除的是在指定索引处的项。

  使用REMOVE_DUPLICATES选项时,该命令将删除list中的重复项。

  使用REVERSE选项时,该命令将把list的内容就地前后倒换。

  使用SORT选项时,该命令将按字母序对list总的内容就地排序。

  注意:在CMake中,一个list是一个由封号;分割的一组字符串。使用set命令可以创建一个list。例如,set(var a b c d e)命令将会创建一个list:a;b;c;d;e;而set(var “a b c d e”)命令创建的只是一个字符串,或者说是只有一个项的list。

  当使用指定索引的命令格式时,如果<element index>是大于等于0的数,<element index>是从list第一个项开始的序号,list的第一项的索引是0。如果<element index>小于等于-1,这个索引是从结尾开始的逆向索引,其中-1表示的是list的最后一项。当使用负数索引时,注意它们不是从0开始!-0与0等价,它指向list的第一个成员。


9、TARGET_LINK_LIBRARIES(app /usr/local/cuda/lib64/libcudart.so  ${OpenCV_LIBS})

      显式指定链接时需要的库文件 

      为每个目标分别指定需要链接的库文件(指定部分目标专用的库文件)

     TARGET_LINK_LIBRARIES: Link a target to given libraries.

     TARGET_LINK_LIBRARIES(target library1                        <debug | optimized> library2                        …)

     Specify a list of libraries to be linked into the specified target. The debug and optimized strings may be used to indicate that the next library listed is to be used only for that specific type of build

阅读更多
个人分类: cmake
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭