`
doujiu
  • 浏览: 89089 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

cmake 词法和语法

阅读更多
《你所不知的OSG》第一章:CMake初步(2) - OpenSceneGraph教程专区 - OpenSceneGraph中国讨论区-有您OSG在中国才更好 - Powered by Discuz!
词法和语法

在开始本节的学习之前,我们先总结一下之前所了解到的CMake基本词法和命令。

CMake命令通常使用如下的格式:

1. COMMAND( ARG1 ARG2 … )

复制代码
命令关键字之后使用括号来包含所有的参数;各个参数之间使用空格或者换行符分隔;而参数通常有以下几种形式:

变量,以${MY_VAIRABLE}的形式表达,其储存类型为字符串类型,但是可以根据具体命令的要求自动转换为布尔型、整型或者浮点类型。变量可以出现在字符串中,也可以实现“内省”。变量有用户自定义和系统内置两种,用户自定义变量使用SET命令设置;而系统变量由系统自动赋值,例如${PROJECT_SOURCE_DIR}。

枚举量,例如ADD_LIBRARY可以设置要生成的链接库为SHARED或者STATIC,还可以设置为MODULE(插件,可动态调用,但不作为其他工程的依赖),除此之外的赋值都是不能被识别的。

值,也就是任意的字符串内容,它可以用来指示要编译的源代码文件名,也可以表达一段文字提示信息,或者表达特定的功能。值可以使用引号进行标识,多数情况下也可以不用。

前文中我们已经了解到的命令列举如下,此外这里还简要地介绍了另一些可能在各类CMake工程中遇到的命令及其语法格式。CMake部分命令的语法歌是十分复杂,这里仅仅介绍它的某一种实现形式,建议读者阅读CMake的帮助文档以获取更多信息。

括号中为该命令的一个或多个参数项,其中使用“[…]”包含的项表示可忽略项,使用“…|…”分隔的项表示只能选择其中一项。

ADD_CUSTOM_COMMAND(
TARGET name
PRE_BUILD|PRE_LINK|POST_BUILD
COMMAND cmd1 [COMMAND cmd2 …] ):
为目标工程name添加一个或多个新的自定义的编译规则cmd1,cmd2等,执行时机可以选择编译前,链接前或者编译后。它的作用相当于Visual Studio工程的“Custom Build Step”属性。

ADD_CUSTOM_TARGET( name COMMAND cmd1 [COMMAND cmd2 …] ):
添加一个名为name的编译目标,并指定一个或多个自定义的命令cmd1,cmd2等。注意ADD_CUSTOM_COMMAND与这个命令的区别:前者是针对一个已有的子工程进行自定义编译规则的设置;后者则是建立一个新的自定义的目标工程,例如一个专用于将已生成文件拷贝到指定文件夹的INSTALL工程;以及与之作用截然相反的UNINSTALL工程。

ADD_DEFINITIONS( -DMACRO1 –DMACRO2 … ):
添加-D预编译宏定义,可以一次添加多个。

ADD_EXECUTABLE( name [WIN32]
source1 source2 … ):
指定一个名为name的可执行程序工程,其源文件为source1,source2等,此外还可以追加一个枚举量WIN32,表示此程序为Win32程序,使用WinMain作为程序入口。

ADD_LIBRARY( name [STATIC|SHARED|MODULE]
source1 source2 … ):
指定一个名为name的链接库工程,其源文件为source1,source2等,此外还可以指示该工程的生成结果为静态库(STATIC),动态库(SHARED)还是模块(MODULE)。

ADD_SUBDIRECTORY( dir ):
指示下一级CMake脚本所在位置位于dir子目录。

CMAKE_MINIMUM_REQUIRED( VERSION major[.minor[.patch]] ):
指示当前脚本所需的CMake版本,不能低于版本号major.minor.patch。

CONFIGURE_FILE( infile outfile ):
将文件infile复制到outfile的位置,同时执行其中变量的自动配置和更替,即,将infile中所有形同“${VAR}”和“@VAR@”的变量替换为对应的内容,并拷贝到outfile中,而这个新生成的outfile文件也可以在之后的脚本代码中得以使用。

FIND_LIBRARY( ${var}
NAMES name1 [name2 …]
PATHS path1 [path2 …]
PATH_SUFFIXES suffix1 [suffix2 …] ):
搜索一个外部的链接库文件,并将结果的全路径保存到var变量中。要搜索的链接库文件名字可能是name1,name2等;搜索路径为path1,path2等;此外还可以指定路径的后缀词为suffix1,suffix2等。因此,系统将尝试在path1/suffix1,path1/suffix2,path2/suffix1,path2/suffix2这些目录中搜索名为name1或name2的链接库文件,并将结果(路径和文件名)保存到var中。

FIND_PACKAGE( name ):
在指定的模块目录中搜索一个名为Find<name>.cmake(例如,FindOSG.cmake)的CMake脚本模块文件,执行其中的内容,以图搜索到指定的外部依赖库头文件和库文件位置。<br><br>FIND_PATH( ${var}<br> NAMES name1 [name2 …]<br> PATHS path1 [path2 …]<br> PATH_SUFFIXES suffix1 [suffix2 …] ):<br>搜索一个包含name1,name2等文件的目录,并将此路径(不包含文件名)保存到var变量中,搜索路径为path1,path2等;此外还可以指定路径的后缀词为suffix1,suffix2等。通常可以使用此命令来确认外部头文件的依赖路径。<br><br>FIND_PROGRAM( ${var}<br> NAMES name1 [name2 …]<br> PATHS path1 [path2 …]<br> PATH_SUFFIXES suffix1 [suffix2 …] ):<br>搜索一个外部的可执行程序,并将结果的全路径保存到var变量中。要搜索的程序名字可能是name1,name2等;搜索路径为path1,path2等;此外还可以指定路径的后缀词为suffix1,suffix2等。<br><br>INCLUDE( file ):<br>在当前文件中包含另一个CMake脚本文件的内容。<br><br>INCLUDE_DIRECTORIES( dir1 dir2 … ):<br>指定编译器搜索头文件的依赖路径,可以添加多个。<br><br>INSTALL( TARGETS proj1 proj2<br> RUNTIME DESTINATION runtime_dir<br> LIBRARY DESTINATION library_dir<br> ARCHIVE DESTINATION archive_dir):<br>这只是此命令的一种语法格式,安装目标工程proj1,proj2等到指定的文件夹。其中,可执行文件安装到RUNTIME DESTINATION指定的runtime_dir目录;动态链接库安装到LIBRARY DESTINATION指定的library_dir目录;静态链接库安装到ARCHIVE DESTINATION指定的archive_dir目录。如果需要安装头文件或者数据文件,则通常使用INSTALL( FILES … DESTINATION … )的形式。<br><br>LINK_DIRECTORIES( dir1 dir2 … ):<br>设置外部依赖库的搜索路径。<br><br>MESSAGE( [SEND_ERROR|STATUS|FATAL_ERROR] “text” … ):<br>在控制台或者对话框输出一行或多行调试信息文本text,枚举量用于控制信息的类型(错误,状态显示,致命错误)。<br><br>OPTION( ${var} “text” value ):<br>向用户提供一个可选项,提示信息为text,初始值为value,并将最终的结果传递到var变量中。在CMake-GUI中它将以配置选项的方式出现。<br><br>PROJECT( name ):<br>设置整个工程的名称为name。<br><br>SET( variable value<br> [CACHE FILEPATH|PATH|STRING|BOOL “text”] ):<br>定义一个用户自定义变量variable,取值为value。此外还可以使用CACHE关键字,允许用户在CMake-GUI中修改变量的值,修改方式包括文件对话框(FILEPATH),目录对话框(PATH),编辑框(STRING)或者复选框(BOOL),并使用text作为提示信息。<br><br>SET_TARGET_PROPERTIES( name PROPERTIES prop value ):<br>设置名为name的工程的属性,这里主要可选的prop属性包括PROJECT_LABEL, DEBUG_POSTFIX,OUTPUT_NAME等等,value为设置值。<br><br>TARGET_LINK_LIBRARIES( name<br> lib1 lib2 …<br> [debug|optimized] lib1 lib2 … ):<br>指定工程name所用的依赖库,并可以使用debug和optimized关键字分别指定DEBUG与RELEASE版本所用的一个或多个依赖库。</name>


分享到:
评论

相关推荐

    cmake实践教程&语法简介

    cmake实践教程.pdf cmake语法简介.pdf

    CMake语法和常用命令 与案例源码

    CMake语法和常用命令。还有具体的案例源码来讲解哦哦。

    CMake基本语法与应用.pptx

    这是本人自己结合很多资料、博客总结出的cmake基本语法,用于组内分享

    cmake语法简单教程

    CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。cmake编写规则,cmake简单教程.

    cmake-3.6.3和cmake-3.12.2源码

    cmake-3.6.3和cmake-3.12.2的源码,可以在linux下编译安装cmake,安装完成之后就可以使用cmake来编译源码了.

    cmake3.13和cmake3.16.rar

    编译opencv源码,需要cmake,这里cmake3.13和cmake3.16两个版本都有,我使用cmake3.16编译opencv的cuda加速。

    CMake实战-20200708.pdf

    CMake是Kitware公司和一些开源开发者在开发一些工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开放源代码项目。项 mục诞生时间是2001年。CMake的流行其实要归功于KDE4的开发,在KDE开发者使用了近10...

    cmake教程 cmake教程 cmake教程

    cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 ...

    CMake基本语法与应用.pdf

    PDF版

    CMake学习手册

    android studio 对cmake支持以后就需要学习, 简单,实用,快速,高效。对于ndk的开发而言,掌握cmake的语法是非常有必要的

    cmake-3.5.1和cmake-3.14.5.zip

    cmake-3.5.1和cmake-3.14.5.zip

    Cmake使用手册,CMakeLists.txt的语法规则!

    详细描述linux平台cmake的使用过程!以及

    cmake3.6最新版本

    CMAKE3.6自用

    cmake菜谱中文版, cmake practice 很好的cmake入门资料

    cmake菜谱中文版, cmake practice 很好的cmake入门资料

    从零开始详细介绍CMake

    * 环境变量CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH:可以使用SET命令来设置环境变量CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH。 CMake的优势: *跨平台支持:CMake支持多种平台,包括Windows、Linux、Mac OS等。 *...

    CMake中文手册_cmake手册_cmake_

    CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性

    CMake交叉编译配置

    Cmake交叉编译环境配置文档 1、设置交叉编译之前,必须在CMake...2、在通知CMake要交叉编译以后,还要告诉CMake到哪个路径下去找库文件,因为在交叉编译的时候CMake是不会自动去系统默认的目录找库文件和头文件的:...

    cmake实践,学习cmake的一本好书

    CMake是一个跨平台的安装(编译)工具,可以用简单...这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

    cmake搭建vs和qt环境实例

    通过cmake搭建vs和qt开发环境实例代码, 主要是CMakeLists.txt

    现代CMake设计理念和使用.pdf

    现代CMake设计理念和使用.pdf 现代CMake设计理念和使用.pdf 现代CMake设计理念和使用.pdf 现代CMake设计理念和使用.pdf 现代CMake设计理念和使用.pdf 现代CMake设计理念和使用.pdf 现代CMake设计理念和使用.pdf 现代...

Global site tag (gtag.js) - Google Analytics