4. RT-Thread BSP支持dist功能

根据RT-Thread文档说明,可以在BSP目录下运行scons -—dist 命令。该命令会在BSP目录下生成dist目录,该目录下包含了RT-Thread在内的当前BSP的依赖文件,可以拷贝到任意地方进行开发。

但是目前有一些BSP是不支持该功能的,下面由本文介绍一下如何让BSP支持dist功能。

4.1. 一、代码分析

提供dist功能的是位于rt-thread/tools 目录的mkdist.py 脚本文件,在文件的MkDist 函数中调用了来自BSP的dist_handle 函数。然后会将rt-thread的components 等目录拷贝到BSP下的dist目录。

这个dist_handle 由板级支持包在rtconfig.py 中定义。在运行scons -—dist 命令时,building.py 内的EndBuilding 函数在rtconfig内寻找dist_handle 函数,并放入全局变量Env 中,点击查看

4.2. 二、方案说明

所以BSP需要定义dist_handle 函数将BSP所需要用到的libraries 拷贝到dist目录。而一般BSP根目录下会有多个BSP,如nrf5x/nrf52832nrf5x/nrf52840 ,这些BSP又需要引用同样的libraries ,所以很多开发板的支持包会在BSP根目录下创建一个tools/sdk_dist.py 脚本文件用来实现文件拷贝,再在rtconfig.py 内调用tools下面的脚本。

4.3. 三、操作示例

这里使用nrf5x/nrf52832 为例子介绍如何添加dist功能支持。

在nrf5x目录下创建toos/sdk_dist.py 文件:

import os
import sys
import shutil
cwd_path = os.getcwd()
sys.path.append(os.path.join(os.path.dirname(cwd_path), 'rt-thread', 'tools'))

# BSP dist function
def dist_do_building(BSP_ROOT, dist_dir):
    from mkdist import bsp_copy_files
    import rtconfig

    library_dir  = os.path.join(dist_dir, 'libraries')

    print("=> copy nrf52 bsp libraries")
    library_path = os.path.join(os.path.dirname(BSP_ROOT), 'libraries')

    bsp_copy_files(library_path, library_dir)

文件内dist_do_building 的方法内定义具体的libraries 复制操作,需要根据不同的开发板自己定义。

然后在nrf5x/nrf52832/rtconfig.py内添加前面提到的dist_handle方法:

def dist_handle(BSP_ROOT, dist_dir):
    import sys
    cwd_path = os.getcwd()
    sys.path.append(os.path.join(os.path.dirname(BSP_ROOT), 'tools'))
    from sdk_dist import dist_do_building
    dist_do_building(BSP_ROOT, dist_dir)

这个方法会动态导入刚刚创建的toos/sdk_dist.py 脚本,并调用dist_do_building 函数进行拷贝。

完成这两处修改之后在开发板目录下运行scons -—dist 即可创建dist目录,将dist目录拷贝到任何地方,然后尝试进行编译,如果可以正常编译就说明该BSP已经成功支持dist功能。