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

cmake预定义变量和执行流程控制

阅读更多
《你所不知的OSG》第一章:CMake初步(2) - OpenSceneGraph教程专区 - OpenSceneGraph中国讨论区-有您OSG在中国才更好 - Powered by Discuz!
也许您并不一定完全明白这里所说的每一句话,这也是我们之所以把词法和语法的介绍放在“Hello World”例子之后的一个原因——没错,仅仅是这些单词的罗列未免太枯燥了。那么,为什么不马上拾起我们刚刚才完成的简单脚本工程,在上面添砖加瓦一番呢?说不定这才是您充分理解和深入学习CMake的关键呢。

是的,实践才是最好的老师。要充分理解CMake的强大之处,以及确保自己具备足够的力量去阅读OSG的CMake脚本源代码,势必还要再多做一些更为复杂的练习才行。不过在此之前,我们还是再多了解一些CMake的常用内置变量和脚本命令,以及CMake中条件语句,循环语句和宏函数的概念用法。

包括前文介绍的PROJECT_SOURCE_DIR在内,以下内置全局变量都可以在CMake脚本中以“${…}”的形式直接加以应用,以方便脚本代码的定位和功能实现:


* CMAKE_BUILD_TYPE:工程的编译生成的版本类型,可选项包括Debug,Release,RelWithDebInfo和MinSizeRel。
* CMAKE_COMMAND:也就是CMake可执行文件本身的全路径,例如/usr/local/bin/cmake或者C:\Program Files\CMake 2.6\bin\cmake.exe。
* CMAKE_DEBUG_POSTFIX:Debug版本生成目标的后缀,通常可以设置为“d”字符,例如Debug版本的OSG核心库为osgd.dll,而Release版为osg.dll。
* CMAKE_GENERATOR:编译器名称,例如“Unix Makefiles”,“Visual Studio 7”等。
* CMAKE_INSTALL_PREFIX:工程安装目录,所有生成和调用所需的可执行程序,库文件,头文件都会安装到该路径下,Unix/Linux下默认为/usr/local,Windows下默认为C:\Program Files。
* CMAKE_MODULE_PATH:设置搜索CMakeModules模块(.cmake)的额外路径。
* PROJECT_BINARY_DIR:工程生成工作所在的目录,即前文所述的“out-of-source”的目录;对于“in-source”形式的编译工作,该变量与PROJECT_SOURCE_DIR所指向的目录相同。
* PROJECT_NAME:工程名称,即使用PROJECT命令设置的名称。
* PROJECT_SOURCE_DIR:工程源代码文件所在的目录。
* CYGWIN:标识当前系统是否为Cygwin。
* MSVC:标识当前系统是否使用Microsoft Visual C。
* UNIX:标识当前系统是否为Unix系列(包括Linux,Cygwin和Apple)。
* WIN32:标识当前系统是否为Windows及Win64。



不必担心这里介绍的命令和变量太多,也不必担心它们会很快消失在您的脑海深处。下一节我们将尝试创建一个稍微复杂一些的工程VersionMe,并争取将上文涉及到的大部分命令和内置变量派上用场,以求在实战中让您领略到CMake的强大魅力。

不过在结束枯燥的本章之前,我们还需要介绍一下CMake中重要的条件语句语法,循环语句语法和宏函数。它们分别相当于C程序中的if…else,while/for以及函数的作用,并且条件和循环语句都可以嵌套工作。毫无疑问,它们在脚本语言的流程控制过程中必然不可或缺。

CMake中的条件语句基本格式为:

1. IF( expression )
2. …
3. ELSE( expression )
4. …
5. ENDIF( expression )

复制代码
或者,

1. IF( expression1 )
2. …
3. ELSEIF( expression2 )
4. …
5. ELSE()
6. …
7. ENDIF()

复制代码
这里的expression是判断条件,和C/C++类似,CMake的条件也存在“与/或/非”以及“等于/大于/小于”等几种操作符,分别用AND/OR/NOT以及EQUAL/LESS/GREATER来表示。当判断条件为真,执行IF后的命令段,否则继续判断并执行相应条件对应的命令段,或者不执行任何操作。例如:

1. IF ( ${number} GREATER 4 )
2. …
3. ENDIF( ${number}GREATER 4 )

复制代码
表示判断变量number是否大于4,进而执行对应的语句段。此时用户定义的字符串变量会被自动转换为整型变量以便进行判断。
此外形同这样的判断语句也是十分常见的:

1. IF ( NOT ${variable} )
2. …
3. ENDIF( NOT ${variable} )

复制代码
如果变量variable的值为空,0,N,NO,OFF,FALSE,NOTFOUND这几种之一的话,则认为此变量表示“假”,即此处的“NOT ${variable}”为真。

CMake中的循环语句基本格式为:

1. FOREACH( var arg1 arg2 … )
2. …
3. ENDFOREACH( var )

复制代码
这里设置一个循环的局部变量var,每次将其赋为arg1,arg2等变量(或者变量数组)中的一个值,并执行循环中的命令段。例如:

FOREACH( var ${OPENGL_LIBRARIES} ),它表示将局部变量var每次设置为变量OPENGL_LIBRARIES中的一个值。后者的内容可能为“opengl32.lib;glu32.lib”的形式。

CMake自动将分号分隔的字符串认为是数组,因此会自动从该变量中择取var的取值。

另一种表达循环语句的语法格式为:

1. WHILE ( expression )
2. …
3. ENDWHILE( expression )

复制代码
这里的expression和IF语句判断字段中的含义相同。

CMake中的宏函数可以理解为C语言的函数,它改变代码执行跳转的流程并简化了脚本程序的开发,其基本格式为:

1. MACRO( funcname [arg1 [arg2 …]] )
2. …
3. ENDMACRO( funcname )

复制代码
和函数的编写要求一样,CMake的宏函数必须指定一个函数名funcname,以及零个或多个输入参数arg1,arg2等。需要调用宏函数的时候,只要直接使用funcname(arg1 arg2)的形式就可以了,例如:

1. MACRO( MY_FUNC arg1 arg2 )
2. …
3. ENDMACRO( MY_FUNC )

复制代码
在主程序中,需要调用此宏函数时,只需执行形同下面的语句:

1. MYFUNC( param1 param2 )

复制代码
就可以将实际参数param1和param2传入宏函数体。

此外,宏函数体内可以使用内置变量${ARGC},${ARGV}和${ARGN}来表达传入参数的属性:${ARGC}保存了传入参数的个数;${ARGV}保存一个传入参数组成的数组,可以供FOREACH语句使用;${ARGN}则比较特殊,它保存了“显式参数”之外的所有“隐式参数”所组成的数组。对于上面的例句来说,arg1,arg2就是显式参数,而如果用户在调用MY_FUNC时采用下面的形式:

1. MYFUNC( param1 param2 other1 other2 … )

复制代码
那么other1,other2等就是隐式参数,可以用${ARGN}来获取它们的数组。这对于CMake而言是完全合法的,并且可以因此定义不定参数项的宏函数,从而大大增强了脚本程序的灵活性。


分享到:
评论

相关推荐

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

    1. **CMake基础知识**:理解CMake的基本语法,包括设置变量、条件语句、循环结构,以及如何创建、配置和链接目标。 2. **CMakeLists.txt**:这是CMake项目的入口文件,用于定义项目结构和构建规则。学习如何编写和...

    CMake 手册详细讲解.pdf

    CMake 是一种跨平台的构建系统,用于管理项目的构建过程,尤其适合多平台的软件开发。CMake 使用 CMakeLists.txt 文件,这是...在实际项目中,结合源码管理和版本控制工具,如Git,可以构建高效稳定的自动化构建流程。

    cmake实践&中文手册.rar

    3. **CMake变量**:介绍了一系列预定义的CMake变量,如CMAKE_BUILD_TYPE(构建类型,如Debug或Release)、CMAKE_CXX_FLAGS(C++编译器标志)等,以及如何自定义和使用这些变量。 4. **CMake模块**:CMake包含了一些...

    CMake实践教程和Ubuntu脚本demo

    3. **CMake变量**:如CMAKE_SOURCE_DIR,CMAKE_BINARY_DIR等,这些内置变量帮助管理项目源代码和构建目录。 4. **条件语句和循环**:CMake支持if(),foreach()等控制流结构,便于根据不同条件执行不同的构建步骤。 ...

    cmake搭建vs和qt环境实例

    5. **安装和配置Qt**:在使用CMake与Qt结合之前,确保已经正确安装了Qt开发环境,并且将其路径添加到系统的环境变量中,这样CMake才能找到它。 6. **构建流程**:在完成CMakeLists.txt配置后,首先在项目根目录下...

    CMake Practice

    3. **变量和函数**:CMake支持变量和函数,用于灵活地控制构建过程。例如,`PROJECT()`函数定义项目名称,`ADD_EXECUTABLE()`和`ADD_LIBRARY()`用于添加可执行文件和库,`INCLUDE_DIRECTORIES()`指定头文件路径。 ...

    cmake-3.22.2 Linux 安装包

    使用CMake的一个关键优势是它可以处理多个项目依赖关系,自动检测库和头文件的位置,简化了构建流程。CMake支持多种构建系统,如 Ninja、Make、Xcode 等,因此无论你在哪个平台工作,都能保持一致性。此外,CMake还...

    Mastering_CMake.pdf

    2. **变量与函数**:掌握CMake中的变量类型和使用方法,以及内置函数的功能和用法,例如`find_package`用于查找外部库,`add_executable`和`add_library`用于添加可执行文件和库,`include_directories`用于指定...

    CMake+Practice.pdf

    - **预定义变量**: - `CMAKE_CURRENT_SOURCE_DIR`:当前源代码目录。 - `CMAKE_CURRENT_BINARY_DIR`:当前二进制文件目录。 - `CMAKE_SOURCE_DIR`:顶层源码目录。 - `CMAKE_BINARY_DIR`:顶层二进制文件目录...

    cmake实践_cmake_

    ### CMake变量与宏 CMake提供了一系列内置变量,如`CMAKE_BUILD_TYPE`(定义构建类型:Debug、Release等)和`CMAKE_CXX_FLAGS`(设置编译器选项)。此外,还有宏和函数来处理复杂逻辑,例如`IF`条件语句、`FOREACH`...

    cmake最新版本cmake-3.24.0

    通常,一个CMake的发行包会包含可执行文件、库、文档和可能的示例项目。 总的来说,CMake作为一个强大的构建工具,可以帮助开发者简化跨平台的项目构建流程。通过使用CMake,你可以定义构建规则,而不用关心底层的...

    cmake中文翻译手册

    4. **模块和宏**: CMake模块提供了预定义的功能集,可以包含在`CMakeLists.txt`中导入。宏则是一组命令的集合,方便重复使用的任务。 **CMake的主要功能** 1. **跨平台支持**: CMake可以生成适用于Windows、Linux...

    CMake3.18.0安装版和免安装包.rar

    - **免安装包**:`cmake-3.18.0-rc2-win64-x64.zip` 是一个ZIP压缩文件,解压后可以直接将CMake的可执行文件复制到任何位置,然后将该路径添加到系统环境变量PATH中。这样,无论在何处打开命令行,都可以调用CMake。...

    Cmake3.18.5版本免安装工具下载

    CMake是一款跨平台的...总的来说,CMake3.18.5是一个强大的工具,能够简化跨平台项目的构建流程,尤其适合大型项目和有多个库依赖的工程。通过理解并熟练使用CMake,开发者可以更高效地管理代码构建,提高开发效率。

    cmake学习手册集合包括《cmake教程》《cmake开发手册详解》《cmake中文手册》

    3. **条件语句和循环**:CMake支持if()、elseif()、else()和foreach()等控制流语句,用于根据不同的条件或循环执行不同的构建步骤。 4. **查找库和依赖**:CMake提供find_package()命令,帮助找到项目依赖的外部库...

    cmake-3.10.0-rc3-win64-x64.rar_Cmake3.10.0_Cmake3.10.0下载_cmake 3

    CMake支持多种构建工具和编译器,包括Ninja、Visual Studio、Xcode等,使得开发者能够在各种平台上保持一致的构建流程。它还支持模块化开发,通过`find_package`指令可以轻松地查找和链接依赖的库。 在CMake 3.10.0...

    cmake基础学习资料

    CMake的设计目标是简化构建流程,通过一套简单的语法,使得开发者可以为不同操作系统(如Windows、Linux、macOS)和编译器(如GCC、Clang、Visual Studio)生成构建文件。 《CMake基础学习资料》包含两份PDF文档:...

    cmake_demo.zip

    3. **CMake变量**:CMake有许多预定义的变量,如`CMAKE_BUILD_TYPE`用于指定构建类型(Debug或Release),用户也可以自定义变量来适应项目需求。 4. **CMake缓存**:CMake缓存(CMakeCache.txt)存储了用户在配置...

Global site tag (gtag.js) - Google Analytics