1. 概述
上篇文章提到,在汽车电子软件行业中makefile的标准用法,以及在复杂的构建流程和高度自定义化目标文件的实际情况下,针对工程级的构建方案,大部分情况下无法使用IDE自带的构建系统满足需求。
本篇文章继续讲解,行业内另外一种主流的构建工具链,modern cmake 系统。
2. cmake 简介
这部分资料可以在网上轻松查到,这里需要重点说明的是,关于使用cmake作为构建系统的思想,需要遵循modern camke的思想,可以简单理解为从面向过程到OOP,传统cmake是通过大量可配置的变量,编写复杂判断逻辑进行目标文件的构建。而modern cmake 需要把构建目标封装对象,构建的目标设定可以理解为该对象的构造函数,相关的变量及设定都为成员变量,当构建不同的内容时仅实例化不同的对象即可。
还有一点需要说明,cmake 不同于 makefile 系统,makefile在编写好之后,可以通过make直接调用并进行目标编译,而cmake对应的控制文件为cmakelist,在编写好cmakelist之后还要设定所用的生成器才能开始构建,而在cmake系统当中,所谓的生成器是指代makefile这类能够直接控制编译器进行构建的系统。 常见的生成器有 makefile ,visual studio code,ninja等,可以通过如下图示进行理解。
最后,有关cmake的使用和学习建议大家阅读 cmake cookbook这本书。
3. 示例工程构建讲解
本文提供的示例工程为,基于S32K芯片,集成FreeRTOS架构软件,硬件为 NXP S32K144 EVB开发板,具备基础led灯亮灭功能。
示例工程地址为: freertos_s32k144evb_cmake
3.1. 环境准备
3.1.1. linux
这里以deepin系统(linux)为例,使用cmake+ninja作为构建系统,windows 或 mac需要自行安装如下提到软件。
- 首先安装cmake,
sudo apt-get install cmake
- 安装ninja,
sudo apt-get install ninja-build
- 安装gcc-arm-none-eabi 编译器,编译arm芯片代码,
sudo apt-get install gcc-arm-none-eabi
3.1.2. windows
同样需要安装 cmake ,ninja 两个工具 ,ninja 安装方法为解压得到exe文件,然后将exe文件所在路径放入系统路径即可,保证命令行工具可以调用 ninja 命令。
安装编译器有所不同,此项目采用开源编译器,Linaro 组织开发的 arm-none-eabi-gcc V6.3.1 。当前汽车电子行业内多用 iar greenhill 等商业编译器,最早是因为汽车电子芯片大多为异构mcu,例如英飞凌家的TriCore架构以及瑞萨家的G3M内核架构等,与主流的ARM, PowerPC 不符,此类内核的芯片并无开源稳定的编译器可用,但是随着arm架构的普及,车上的arm芯片也逐渐多了起来,但是即便是使用arm,仍旧采用商业编译器。
这部分原因是使用 AutoSAR架构后,工具厂商开始携手垄断,例如各家芯片厂商虽然写基础的MCAL驱动,但是默认把 MCAL 交给 EB 工具链进行配置,然后Vector ,Mentor 等厂商配置生成的代码根本不支持开源编译器,链接脚本命令以及很多汇编代码甚至与语法糖仅支持圈内工具厂商的编译器,真可谓肥水不流外人田。
Windows上安装 arm gcc 编译器,建议直接安装NXP 家的免费IDE - S32DS ,安装此ide会同时安装 arm gcc V6.3.1
3.2. Cmake + Ninja 构建系统详细说明
此套构建系统采用 Cmake进行源码及 编译器设定管理, 共计三个文件:
- CMakeLists.txt : 主文件,设定参与构建的 源码/静态链接库/链接脚本 路径
- gcc_arm_eabi_toolchain.cmake : 设定编译器相关信息
- PreLoad.cmake : 预加载文件,设定Cmake 生成器为Ninja, 当前cmake支持如下几种生成器
The following generators are available on this platform (* marks default):
Visual Studio 16 2019 = Generates Visual Studio 2019 project files.
Use -A option to specify architecture.
Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 10 2010 [arch] = Generates Visual Studio 2010 project files.
Optional [arch] can be "Win64" or "IA64".
Visual Studio 9 2008 [arch] = Generates Visual Studio 2008 project files.
Optional [arch] can be "Win64" or "IA64".
Borland Makefiles = Generates Borland makefiles.
* NMake Makefiles = Generates NMake makefiles.
NMake Makefiles JOM = Generates JOM makefiles.
MSYS Makefiles = Generates MSYS makefiles.
MinGW Makefiles = Generates a make file for use with
mingw32-make.
Green Hills MULTI = Generates Green Hills MULTI files
(experimental, work-in-progress).
Unix Makefiles = Generates standard UNIX makefiles.
Ninja = Generates build.ninja files.
Ninja Multi-Config = Generates build-<Config>.ninja files.
Watcom WMake = Generates Watcom WMake makefiles.
CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files.
CodeBlocks - NMake Makefiles = Generates CodeBlocks project files.
CodeBlocks - NMake Makefiles JOM
= Generates CodeBlocks project files.
CodeBlocks - Ninja = Generates CodeBlocks project files.
CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
CodeLite - MinGW Makefiles = Generates CodeLite project files.
CodeLite - NMake Makefiles = Generates CodeLite project files.
CodeLite - Ninja = Generates CodeLite project files.
CodeLite - Unix Makefiles = Generates CodeLite project files.
Eclipse CDT4 - NMake Makefiles
= Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - MinGW Makefiles
= Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.
Kate - MinGW Makefiles = Generates