一、构建东西

构建体系也称为组件主动化,主动化构建等。一般需求经过脚本声明构建行为。

构建:源代码–>方针代码(库、可履行文件等)

常见的构建东西

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文件途径以及内容暗示:

RT-Thread构建装备及脚本详解

rtconfig.h文件途径以及内容暗示:

RT-Thread构建装备及脚本详解

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 句子用于生成菜单。

Kconfig (rt-thread.org)

RT-Thread构建装备及脚本详解

/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 句子用于生成菜单(类似于生成一个文件夹)

RT-Thread构建装备及脚本详解

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

RT-Thread构建装备及脚本详解

RT-Thread构建装备及脚本详解

RT-Thread构建装备及脚本详解

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函数

RT-Thread构建装备及脚本详解

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东西链等

运转成功:

RT-Thread构建装备及脚本详解