一、构建东西
构建体系也称为组件主动化,主动化构建等。一般需求经过脚本声明构建行为。
构建:源代码–>方针代码(库、可履行文件等)
常见的构建东西:
1. Make(GNU Make、Microsoft NMake、BSD Make): 是最早的构建体系,在类Unix体系上比较常用,但杂乱且难以阅览,维护困难。语法类似shell。
2. GNU Autotool(GNU构建体系): GNU构建体系主要是指经过autoconf,automake,libtool构建软件的体系,一般与GNU Make,GCC一起配套运用,这个架构也是一切GNU项目的打包方法
- 运用./config && make && make install完结装备编译和装置
- 问题:根据Make,并没有解决Make自身的问题,杂乱阅览困难
3. CMake: 归于元构建体系,用于生成如makefile其他构建体系的构建体系,因此可以跨渠道,但自身并不履行构建工作 缺点是自己的一套言语
4. Ninja: 谷歌程序员推出的注重速度的构建东西 特色:简单,文件主动生成,增量构建特别快
二、 Rtthread构建装备体系
2.1 组成
- kconfig–kernel config装备文件(供给体系的装备剪裁功能)
- SCons–构建东西
- env东西–主要供给构建体系所需的各种环境变量以及软件包的管理
2.2 目录结构
-- rtconfig.py ---- 操控SCons构建的装备文件,寄存了如东西链,构建参数等装备。
-- SConscript
-- SConstruct ---- SCons的进口脚本,初始化了SCons构建rt-thread所需的必要环境
-- Kconfig ---- 顶层Kconfig文件,menuconfig的进口Kconfig文件
-- rt-thread/
--- src/
---- SConscript ---- 各级源码的scons子脚本,操控当时级别下的源码构建行为
---- Kconfig ---- 各级源码的Kconfig子脚本,寄存当时级别下的装备项
---- **.c
三、kconfig:内核装备裁剪
工作机制:
menuconfig—–(遍历解析各级kconfig文件,并保存装备)—–.config—–rtconfig.h
.config文件途径以及内容暗示:
rtconfig.h文件途径以及内容暗示:
Kconfig文件在源码中呈现树形结构,需求在工程的根目录下存在一份顶层Kconfig文件,顶层Kconfig文件在文件中经过source句子显现地调用各子目录下的Kconfig文件。Env在根目录下履行menuconfig指令后会递归解析各级Kconfig文件,然后供给如下装备界面,完结相应的装备后并保存,根目录下会存在一份.config文件保存当时挑选的装备项,并将.config文件转为RT-Thread的体系装备文件rtconfig.h。
脚本语法:
menuconfig GRAVITYXR_MEMORY_BLOCK
select RT_USING_SLAB
bool "Memory Block"
default n
help
Add Memory block support for current system if selected
if GRAVITYXR_MEMORY_BLOCK
config GRAVITYXR_MEMORY_BLOCK_TEST
bool "test"
default n
endif
config句子
- config 表明一个装备选项的开端,紧跟着的 BSP_USING_GPIO 是装备选项的称号,config 下面几行界说了该装备选项的属性。属性可所以该装备选项的
-
- 类型
- 输入提示
- 依靠联系
- 默认值
- 协助信息
- bool 表明装备选项的类型,每个 config 菜单项都要有类型界说,变量有5种类型
-
- bool 布尔类型
- tristate 三态类型
- string 字符串
- hex 十六进制
- int 整型
- select 是反向依靠联系的意思,即当时装备选项被选中,则 RT_USING_PIN 就会被选中。
- default 表明装备选项的默认值,bool 类型的默认值可所以 y/n。
- help 协助信息。
menuconfig 句子:
表明带菜单的装备项
- menuconfig 这个句子和 config 句子很类似,但它在 config 的基础上要求一切的子选项作为独立的行显现。
- depends on 表明依靠某个装备选项,
depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
表明只有当 BSP_USING_UART1 和 RT_SERIAL_USING_DMA 装备选项一起被选中时,当时装备选项的提示信息才会呈现,才能设置当时装备选项
menu 句子用于生成菜单。
/gxr/board/Kconfig
config VEXPRESS_A9
select ARM_A9
default y
bool
menu "Board Support Package"
rsource "drivers/Kconfig"
endmenu #Legacy BSP
躲藏config,避免修改:bool后面空着,这个时分在 menuconfig 中就不会呈现该宏界说,但是宏界说还是会有。
menu /endmenu 句子用于生成菜单(类似于生成一个文件夹)
rsourece:读取另一个文件中的 Kconfig 文件
咱们找到drivers/kconfig
menu "Hardware Drivers Config"
config SOC_VEXPRESS_A9
bool
select ARCH_ARM_CORTEX_A9
select RT_USING_CACHE
select ARCH_ARM_MMU
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
select RT_USING_GIC_V2
default y
menu "Onboard Peripheral Drivers"
config RT_USING_UART0
bool "Enable UART0"
default y
config RT_USING_UART1
bool "Enable UART1"
default y
endmenu
endmenu
Scons
software construction tool
SCons 是一套由 Python 言语编写的开源构建体系,类似于 GNU Make。它选用不同于一般 Makefile 文件的方法,而是运用 SConstruct 和 SConscript 文件来替代。这些文件也是 Python 脚本,可以运用规范的 Python 语法来编写。所以在 SConstruct、SConscript 文件中可以调用 Python 规范库进行各类杂乱的处理,而不局限于 Makefile 设定的规矩。
- SConstruct是scons构建的主脚本
- SConscript寄存在源代码的子目录下,一般放在项目的子目录,以到达分层构建的目的。一般情况下,每个寄存有源代码的子目录下都会放置一个 SConscript。
- tools/building.py:自界说构建接口
特色:
- 主动扫描文件的依靠联系(隐式依靠)
- 运用MD5签名替代传统的文件时间戳
- 运用python脚本,方便运用
- 拓展性强
编译指令:
scons
翻开 Env 东西,假如是 ARM 渠道的芯片,输入 scons 指令直接编译 BSP,这时分默认运用的是 ARM GCC 编译器,因为 Env 东西带有 ARM GCC 编译器。 如下图所示运用 scons
指令编译 BSP。
非ARM,要自己装置编译器,而且拟定途径,例如DSP,可以输入:
set RTT_CC=keil
set RTT_EXEC_PATH=C:/Keilv5
scons -c #清除编译方针。这个指令会清除履行 scons 时生成的临时文件和方针文件。
scons -s #此指令不会打印详细的内部指令。
scons --target=xxx
scons --target=project/evm/qemu-vexpress-a9 -j4 #运用方针途径的qemu编译,-jN表明4个线程一起运转
scons --target=project/evm/qemu-vexpress-a9 --run #运转
SCons官方文档: Current Documentation – SCons
SCons函数
import os
from building import * #只有导入了building模块,才可以运用的RT-Thread自界说Scons函数
cwd = GetCurrentDir() # 获取当时脚本的途径
CPPPATH = [cwd]
src = Glob('*.c') #返回参加构建的目标,目标满足 pattern 形式匹配的列表。(获取当时 Sconscript 所在途径下的一切 .c 文件:)
if GetDepend('GRAVITYXR_MEMORY_BLOCK_TEST'): # 判断是否界说了宏依靠
src = Glob('test/*.c')#把utest也加进去
mb = DefineGroup('mb', src, depend = ['GRAVITYXR_MEMORY_BLOCK'], LOCAL_CPPPATH = CPPPATH)
Return('mb')
DefineGroup(name, src, depend, ** parameters)
界说一个参加构建的 Group ,并作为参加 Scons 构建的目标返回。Group 可所以一个目录(下的文件或子目录),也是后续一些 IDE 工程文件中的一个 Group 或文件夹。
参数 | 描述 |
---|---|
name | Group 的姓名 |
src | Group 中包括的文件,一般指的是 C/C 源文件。方便起见,也可以经过 Glob 函数选用通配符的方法列出 SConscript 文件所在目录中匹配的文件 |
depend | Group 编译时所依靠的选项(例如 FinSH 组件依靠于 RT_USING_FINSH 宏界说)。编译选项一般指 rtconfig.h 中界说的 RT_USING_xxx 宏。当在 rtconfig.h 装备文件中界说了相应宏时,那么这个 Group 才会被加入到编译环境中进行编译。假如依靠的宏并没在 rtconfig.h 中被界说,那么这个 Group 将不会被加入编译。相类似的,在运用 scons 生成为 IDE 工程文件时,假如依靠的宏未被界说,相应的 Group 也不会在工程文件中呈现 |
parameters | 装备其他参数,可取值见下表,实际运用时不需求装备一切参数 |
parameters 可加入的参数:
构建参数 | 意义 |
---|---|
CCFLAGS | C/CPP 源文件公共编译参数 |
CFLAGS | C 源文件独有编译参数 |
CXXFLAGS | CPP 源文件独有编译参数 |
CPPPATH | 头文件途径 |
CPPDEFINES | 编译时增加宏界说,即全局宏界说 |
LIBRARY | 是否将Group构建为静态库 |
env:软件包管理和构建环境
windows:
- ConEmu终端
- Cmeder,DOS体系仿真器,兼容dos原有指令
- pkgs,RT-Thread软件包的指令行东西
- python环境
- MinGW和GCC for ARM东西链等
运转成功: