cmake构建语言梳理总结

一、make&cmake背景

1、make是什么?

在大型的linux开发项目中,通常有几十到上百个源文件,如果每次通过手工键入gcc命令进行编译不切实际,为此,提供了一个make工具来自动编译和维护项目源码,make执行的对象是使用make语法写成的即makefile文件;

2、make工具的种类:

GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等;

3、cmake是什么,解决什么问题?

先来看问题,make工具固然好用,但存在以下两个问题:
问题1:
不同的 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作;

问题2:
makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。

好了,介绍cmake工具,跟make工具形式一样,需要使用cmake语法写出脚本,然后执行,cmake可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。

类似cmake工具作用的还有scon等。

总结:
gcc命令难以管理大型工程->make难以编写以及移植性差->cmake编写简单且可轻松移植;

二、cmake的使用以及语法书写规范

1、cmake的使用

a、需要安装cmake工具;

b、执行cmake脚本:cmake <cmake脚本的路径>

c、cmake执行完后会在当前文件夹生成大量的源码副本、makefile等,一般会建立一个tmp临时目录,在临时目录中执行cmake命令,有个好处可以保持源代码的整洁;

2、一般的书写顺序,以下是个最简单的例子:
#a、开头部分 - 版本控制信息,项目名
cmake_minimum_required (VERSION 2.6)
project (Tutorial)

#b、中间部分 - 添加头文件、库
include_directories  ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_library(MathFunctions mysqrt.cxx)

#c、结尾部分 - 生成的目标可执行文件
add_executable(Tutorial tutorial.cxx)

cmake的命令是不区分大小写的;

cmake脚本:使用cmake自带的变量和cmake命令搭建整体架构,如果需要,自行定义变量或者实施操作(也由cmake命令实现);

cmake命令格式:command(arg1 arg2 arg3 … argn)

三、cmake常用变量

1、预定义变量:CMAKE_C_FLAGS、CMAKE_CXX_FLAGS
2、系统信息变量:CMAKE_MAJOR_VERSION、CMAKE_PATCH_VERSION
3、编译选项变量:BUILD_SHARED_LIBS、BUILD_STATIC_LIBS
4、自定义变量:定义使用SET(OBJ_NAME xxxx),引用时${OBJ_NAME}

四、常用命令

1、
aux_source_directory(

)
用于将 dir 目录下的所有源文件的名字保存在变量 variable 中;

2、
add_executable( [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL] source1 source2 … sourceN)
用于指定从一组源文件 source1 source2 … sourceN 编译出一个可执行文件且命名为 name

3、
命令语法:add_library([STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1source2 … sourceN)命令简述:用于指定从一组源文件 source1 source2 … sourceN 编译出一个库文件且命名为 name

4、
命令语法:add_dependencies(target-name depend-target1 depend-target2 …)命令简述:用于指定某个目标(可执行文件或者库文件)依赖于其他的目标。这里的目标必须是 add_executable、add_library、add_custom_target 命令创建的目标

5、
命令语法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])命令简述:用于添加一个需要进行构建的子目录

6、
命令语法:set( [[CACHE [FORCE]] | PARENT_SCOPE])命令简述:用于设定变量 variable 的值为 value。如果指定了 CACHE 变量将被放入 Cache(缓存)中

五、控制指令

1、IF 指令,基本语法为:
IF(expression)
    COMMAND(ARGS ...)
ELSE(expression)
    COMMAND1(ARGS ...)
ENDIF(expression)
2、WHILE 指令的语法是:
WHILE(condition)
    COMMAND1(ARGS ...)
ENDWHILE(condition)
3、FOREACH 指令:

该指令使用方法有三种形式:
a、列表

FOREACH(loop_var arg1 arg2 ...)
    COMMAND1(ARGS ...)
ENDFOREACH(loop_var)
#即会遍历arg1 arg2...

#像我们前面使用的 AUX_SOURCE_DIRECTORY 的例子
AUX_SOURCE_DIRECTORY(. SRC_LIST)
FOREACH(F ${SRC_LIST})
    MESSAGE(${F})
ENDFOREACH(F)

b、范围

FOREACH(loop_var RANGE total)
ENDFOREACH(loop_var)
#从 0 到 total 以1为步进,举例如下:

FOREACH(VAR RANGE 10)
MESSAGE(${VAR})
ENDFOREACH(VAR)

c、范围和步进

FOREACH(loop_var RANGE start stop [step])
ENDFOREACH(loop_var)

#从 start 开始到 stop 结束,以 step 为步进,举例如下

FOREACH(A RANGE 5 15 3)
    MESSAGE(${A})
ENDFOREACH(A)

六、打印信息控制 - MESSAGE

MESSAGE 指令的语法是:
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display”…)
这个指令用于向终端输出用户定义的信息,包含了三种类型:
SEND_ERROR,产生错误,生成过程被跳过。
SATUS,输出前缀为—的信息。
FATAL_ERROR,立即终止所有 cmake 过程.
我们在这里使用的是 STATUS 信息输出,演示了由 PROJECT 指令定义的两个隐式变量
HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR。

七、其它

1、包含其它cmake文件:使用include( 其它cmakelist位置 )

八、导学:

cmake语言相对简单,熟悉常用的内置变量与命令即可写出大部分功能的cmakelist脚本,至于大型工程中必然嵌套大量的cmakelist,整体的编译架构会稍微复杂些,注意梳理其中的包含关系即可;

九、cmake文档:

https://download.csdn.net/download/STCNXPARM/13068583

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值