`
doujiu
  • 浏览: 90282 次
  • 性别: 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>


分享到:
评论

相关推荐

    java语言的词法分析器(手动与flex)。使用cmake、c语言构建。.zip

    通过这个项目,学习者可以深入理解词法分析的过程,同时熟悉CMake和Flex的使用,这对于软件开发和编译器设计领域来说是非常重要的技能。此外,手动编写和自动化工具的对比也有助于理解底层原理和工具的效率。

    CMaker:IntelliJ Idea 的 CMake 插件

    它为 CMake 构建和运行系统带来了语法高亮支持。 学习intellij语言支持是我的游戏项目。 工作仍在进行中。 执照 插件是开源软件,并在 GPL v3 许可下获得许可。 版本 v.0.0.1 支持基本语法高亮、折叠、装订线图标...

    简易C语言编译器+虚拟机(CMake,C++14).zip

    1. **编译原理**:理解编译器的工作原理,包括词法分析、语法分析、语义分析和代码生成等阶段。编译器首先将源代码(C语言)转换为抽象语法树(AST),然后生成中间代码或目标代码。 2. **LLVM框架**:虽然未直接...

    基于c++的词法分析器.zip

    在本案例中,它可能会包含关于如何编译和运行词法分析器的指导,以及可能遇到的问题和解决方案。 `CMakeLists.txt`是CMake构建系统的配置文件,它定义了项目构建的规则。通过这个文件,开发者可以指定源文件、库...

    SQL引擎和兼容各种SQL语法协议的解析器源代码.zip

    1. **SQL解析原理**:解析器通常采用词法分析和语法分析两个阶段。词法分析(也叫扫描器或分词器)将SQL语句分解成一个个小的标记(tokens),如关键字、标识符、数字等。语法分析(也叫解析器或解析树生成器)则将...

    antlr4_cmake_demo:使用ANTLR4和CMake(通过CLion)使用ANTLR4的示例项目,以生成解析器并执行可能引导自托管编译器(编译器)的构建步骤

    ANTLR4是一款强大的解析器...通过这个项目,你可以学习到ANTLR4的语法定义、CMake的项目管理和构建流程,以及如何在CLion中高效地开发C/C++项目。这对于理解编译原理、解析技术和构建工具的使用有着重要的实践价值。

    精选_基于QT实现的语法分析器_源码打包

    2. **语法分析基础**:学习词法分析、语法分析(如LL(1)、LR(0)、LL(*)或LALR(1)方法)、解析树和抽象语法树(AST)的概念。 3. **C++编程**:掌握面向对象的C++编程技巧,包括类、对象、继承、多态和模板等。 4. ...

    基于C++实现pascal转C的编译器【100012871】

    综上所述,这个项目涵盖了编译器设计与实现的核心技术,包括词法分析、语法分析、中间代码生成,并使用C++和Cmake作为主要的开发工具。虽然它仅支持PASCAL的一个子集,但这样的限制反而使项目更加聚焦,便于理解和...

    kaleidoscope:万花筒语言和编译器

    后来我想整合的词法分析器和作为AST解析器,而不是编写自己的词法和语法分析器从教程。 为什么在 GitHub 上 这主要是一个学习词法分析器、解析器和编译器的个人项目。 GitHub 既可以作为在线备份,也可以展示我的...

    PLCT实验室提供的用于USTC编译原理实验课程-内含源码和说明书(可自己修改).zip

    5. **tools**:这个目录可能包含辅助工具,例如词法分析工具(如Flex)、语法分析工具(如Bison)或者其他用于测试、调试和分析编译器性能的工具。 6. **runtimes**:运行时环境或库,用于提供编译生成代码执行时所...

    antlr4-cpp-runtime-4.13.1-source.zip

    ANTLR4的工作原理是基于词法分析和语法解析。词法分析器(Lexer)将输入文本分解为词法单元(Token),然后语法解析器(Parser)根据预定义的语法规则对这些Token进行解析,生成抽象语法树(AST)。ANTLR4支持多种...

    Flex与Bison使用教程

    Flex与Bison是用于生成词法分析器和语法分析器的工具,广泛应用于编译器的构建中。Flex(快速词法分析生成器)负责将正则表达式转换为C代码,用于匹配输入的文本并将其转换为一系列的token,而Bison(类似Yacc的语法...

    PL0编译程序

    编译器是将高级语言(如PL0)转换为机器可执行代码的软件,这个过程涉及词法分析、语法分析、语义分析以及代码生成等多个阶段。 **源代码** 标签“源代码”表明了这个压缩包包含的是程序的原始编写文本,而非编译...

    c-sharp-language-parser:执行词法分析、句法分析和中间代码生成的 C# 解析器

    它执行词法分析、语法分析和中间代码生成(以中间解析树和三元组的形式)。 词法分析: token 读取是通过使用正则表达式来实现的。 指令“#if”是使用语法实现的(这很慢,所以我将来会改变这种方式)。 语法分析...

    中国科学技术大学编译原理课程实验项目内含源码和说明书.zip

    这些测试用例涵盖了各种语法和语义情况,是评估编译器性能和功能的重要工具。 通过这个实验项目,学习者可以深入理解以下编译原理的关键概念: - **词法分析**:识别源代码中的词汇单元(tokens),例如标识符、...

    flex与bison安装包

    在安装这两款工具后,开发者可以开始为QGIS编写词法分析器(由Flex生成)和语法分析器(由Bison生成)的规则文件。这些规则文件定义了QGIS接受的输入格式和语法,使得程序能够理解和处理各种数据和指令。 需要注意...

    实验报告1

    实验中,开发者王晨宇使用了一系列的开发工具,包括Ubuntu操作系统、GCC编译器、Bison语法分析器、Flex词法分析器、CLion IDE、CMake构建系统以及NASM汇编器。 在词法分析部分,实验涵盖了以下几个关键点: 1. **...

    lepage:编译时词法分析器和解析器生成器

    5. 构建脚本:`.cmake`或`Makefile`等文件,帮助用户构建和安装库。 使用`lepage`库,开发者可以轻松定义自己的语言规范,快速生成相应的词法分析器和解析器。这对于构建DSL(Domain Specific Language)或者扩展...

    minGW+MSYS+flex+bison完全套件

    Flex和Bison结合使用,可以快速地生成词法分析器和语法分析器,极大地简化了语言解析器的开发工作。 总的来说,MinGW+MSYS+Flex+Bison的组合为Windows开发者提供了一个强大的开源开发环境,使他们能够在熟悉的...

Global site tag (gtag.js) - Google Analytics