cmakelist基本语法

一、几个基本概念:

1、GCC

a、由GUN开发的编译器,支持C/C++,Java等语言.

b、项目简单时,可以使用gcc/g++来进行编译.

c、项目复杂时,只使用gcc来进行编译会变得非常复杂.

2、make

a、主要负责一个软件工程中多个源代码的自动编译工作

b、注意每个平台的make不一样,makefile的语法也不一样

c、make工具可以识别出工程中哪些文件已经被修改,并且在再次编译的时候只编译这些文件,从而提高编译的效率;

d、make的主要任务是根据 makefile 文件(一个脚本文件)中定义的规则和步骤,根据各个模块的更新情况,自动完成整个软件项目的维护和目标程序生成工作。

3、Makefile

a、Makefile是有条理的gcc编译命令文件.

b、利用make工具执行Makefile文件,来达到编译的目的.

c、程序简单时,可以使用Makefile.

d、程序复杂时,有局限性.

4、CMake

a、全称:Cross Platform CMake,是一个跨平台的安装(编译)工具.

b、利用cmake工具读取CMakeList.txt配置文件,并最终生成Makefile文件.

c、CMake开发简单,易于理解.

d、编程效率高.

5、CMakelist

a、CMakeList其实就是适配CMake语法的一个配置文件

b、不需要关注不同的Make工具需要的不同格式的MakeFile文件,而是直接使用Cmake 构建出适应当前平台的Makefile进而进行代码编译(因此cmake具有跨平台特点)。

6、Kconfig

kconfig用来做系统配置,生成menuconfig的配置文件:

a、供cmake使用:CMakeList会使用这些参数

b、用于编译源码

7、ninja

a、ninja根据.ninja文件将源码生成目标程序

b、类似make,但是处理速度更快

8、.ninja

a、包含一系列编译规则和命令的文件

b、类似Makefile,但是语法更简单

9、GN

a、大规模工程的跨平台构建工具,类似cmake,但是构建速度更快。

b、GN(generate ninja)是一种元构建系统,生成Ninja构建文件(Ninja build files),即利用GN工具把.gn文件转换成.ninja文件

c、gn和ninja的关系就与cmake和make的关系差不多

10、build.gn

a、项目构建文件,不直接构建项目,而是产生构建项目的ninja文件,然后再用ninja去构建项目

b、类似cmakelist,但是语法更简单

原始跨平台:

编写makefile文件,使用各平台上的make(微软的MS nmake、GNU的make)来编译makefile文件,这种做法的缺点是各平台的make实现不同,导致这种原始的做法其实复用度并不高,需要针对各平台单独编写差异巨大的makefile文件,那为什么要介绍它呢,因为这是跨平台的根,所有跨平台工具,最终都是要依赖各平台应用的集成开发环境的编译器来执行编译,这是固定不变的,也就是说各平台的编译,最终还是需要各平台的makefile,这一点是无法逃避的,而怎么由人工转为自动化,才是跨平台编译的进阶之路。

进阶跨平台:

使用cmake,编写统一的makefile文件,最后由cmake自动生成各平台相关的makefile文件执行编译,这一点上,cmake已经是比较好的跨平台工具了,一般的跨平台工程基本已经满足需求了。

现代跨平台:

当工程规模增大到难以想象的量级时,编译速度和工程模块的划分变得尤为重要,其中chromium工程就遇到这两个问题,于是最初诞生了gyp,最后演化升级为gn,其旨在追求工程更加清晰的模块和结构呈现,以及更快的编译速度。前者通过语法层面实现,后者则依靠ninja来提升编译速度,因为大型工程的编译,很大一部分时间都花在了源文件编译依赖树的分析这块,而ninja更像是一个编译器的预处理,其主要目的是舍弃gcc、msvc、clang等编译器在编译过程中递归查找依赖的方式,因为这里存在很多重复的依赖查找,而ninja改进了这一过程,提前生成编译依赖树,编译期间按照编译依赖树的顺序依次编译,这样就大大减少了编译期间杂乱的编译顺序造成的重复依赖关系查找。

二、CMakelist编写(CMake基本指令)

1、configure_file

功能

cmake 中的 configure_file 指令通过读取输入文件中的内容,将 CMakeLists.txt 文件中的变量转变为 C/C++ 中可识别的宏定义,然后存入另一个文件中。其语法格式如下。其中,input 为输入的文件,output 为输出的文件。通常,输入文件为 http://xxx-config.h.in,输出文件为 xxx-config.h

语法

configure_file(<input> <output>

               [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |

                FILE_PERMISSIONS <permissions>...]

               [COPYONLY] [ESCAPE_QUOTES] [@ONLY]

               [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

主要参数说明

input:输入的文件名,通常为 xxx-config.h.in;

output:输出的文件名,通常为 xxx-config.h;

@ONLY:在 <input> 文件中只使用 @VAR@ 的方式获取变量值,不适用 ${VAR} 的方式;

示例

a、判断变量是否定义

输入文件xxx-config.h.in语法:

#cmakedefine VAR

用途:

源码中不关心变量值,只关心变量是否被定义。如果 CMakeLists.txt 文件中,定义了变量 VAR,那么在转化出来的输出文件中就会存在 #define VAR 的语句。否则,在输出文件中就会显示 /*undef VAR*/。然后,在源码中使用 #ifdef 语句进行使用——#ifdef VAR。

b、判断选项是否开启

输入文件xxx-config.h.in语法:

#cmakedefine01 VAR

用途:

CMakelists.txt 中的 option(VAR ...) 用于开关操作,并且可以使用 cmake -DVAR=ON/OFF .. 修改其变量值。上述指令根据 CMakeLists.txt 中 VAR 的值为 ON 或 OFF,将其转换为输出文件中的 #define VAR 1 或 #define VAR 0。然后在源码中使用 #if 进行引用——#if VAR。当然,该语句也可用于使用 set(VAR xxx) 定义的变量,但是用于 option(VAR ...) 更合适。

c、获取变量值

输入文件xxx-config.h.in语法(其中的 @VAR@ 可以替换为 ${VAR}):

#cmakedefine VAR @VAR@

#define SELF_DEFINE_MACRO_NAME @VAR@

用途:

CMakeLists.txt 文件中,变量 VAR 多用于定义某些信息,比如版本号,作者,项目描述,调试等级等。然后在源码中输出这些值到固定位置,起到提示的作用。

总结:

使用configure_file()可以省去很多的类似add_compile_options()指令。只需在 CMakeLists.txt 文件中定义变量,然后再在xxx-config.h.in 文件中使用 #cmakedefine 进行引用即可,即通过cmakelist控制宏变量的使用。

2、set

功能

用来显式定义变量。

语法

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

主要参数说明

VAR:要设置的变量名

VALUE:变量的值

示例:

SET (SRC_LST STRING)

说明: 用变量代替值,例子中定义SRC_LST代替后面的字符串。

3、if

功能

对项目进行有条件编译。

语法

if(<condition>)

  <commands>

elseif(<condition>) # optional block, can be repeated

  <commands>

else()              # optional block

  <commands>

endif()

主要参数说明

condition:如果为1、ON、TRUE等值,则条件为真,否则为变量(则判断变量是否已经定义)

commands:为真时执行的命令

4、add_library

功能

使用指定的源文件向工程中添加一个目标库。

语法

add_library(<name> [STATIC | SHARED | MODULE]

            [EXCLUDE_FROM_ALL]

            [<source>...])

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值