【RT-Thread】将BSP工程从RT-Thread源码中独立出来开发(3)

上一篇:【RT-Thread】将BSP工程从RT-Thread源码中独立出来开发(2)

接上回

在使用 menuconfig 配置项目时,如果使能了 SPI 的驱动,如下:

(Top) ->
	RT-Thread Components ->
		Device Drivers ->
			[*] Using SPI Bus/Device device drivers

在使用 scons --target=cmake 生成 CMake 工程时,就出现错误了:

$ scons --target=cmake
scons: Reading SConscript files ...
TypeError: can only concatenate deque (not "list") to deque:
  File "D:\00_Workspace\01_software_proj\embed_proj\stm32f103-fire-arbitrary\SConstruct", line 60:
    DoBuilding(TARGET, objs)
  File "D:\00_Workspace\01_software_proj\embed_proj\rt-thread\tools\building.py", line 808:
    local_group(group, objects)
  File "D:\00_Workspace\01_software_proj\embed_proj\rt-thread\tools\building.py", line 766:
    CPPDEFINES = Env.get('CPPDEFINES', ['']) + group.get('LOCAL_CPPDEFINES', [''])

错误 can only concatenate deque (not "list") to deque 表示两种类型的变量无法合并,该错误发生在 File "D:\00_Workspace\01_software_proj\embed_proj\rt-thread\tools\building.py", line 766:

分析 Env.get('CPPDEFINES', [''])group.get('LOCAL_CPPDEFINES', ['']) ,使用 type() 打印变量类型,发现前者是 collections.deque 类型,而后者是 list 类型,因此错误发生在这两个不同类型的变量无法简单的相加。

但是在之前的RTT源码中,我也使用过 SPI 驱动,并没有发现这个问题,因此,可能有以下原因:

  • bsp 独立出来导致某些问题
  • RTT 源码出现的变化,和 bsp 不匹配
  • 构建系统出现了问题
  • 其他原因

分析原因

首先我想,如何排除 bsp 独立出来导致的这个现象,最简单的办法,测试 RTT 目录结构中的 bsp,打开 bsp,使用 menuconfig 选中 SPI 驱动,使用 scons 生成 cmake 工程,错误依旧。

这基本上确定了,RTT 官方源码采用的构建方式也有这个问题,分析这个现象,基本可以认为是某个更新,导致构建脚本中 Env 和 group 的 get 函数的返回值发生了变化导致,get 函数有在这里有两个参数,一个代表键值 Key,另一个代表找不到 Key 返回的默认值,这个默认值为空的列表,list 类型。

因此合理推测,Env 和 group 中的一个获取到了 Key,另一个没有获取到,返回了默认的空列表,因此导致两个变量无法简单相加,这里应该是一个语法不严谨加上某个更新导致的构建问题。

为什么不使能 SPI 的默认 bsp 工程没有问题呢,一定是 SPI 驱动增加了某些配置,分析 SPI 驱动下的 Sconscript 文件:

group = DefineGroup('DeviceDrivers', src, depend = ['RT_USING_SPI'], CPPPATH = CPPPATH, LOCAL_CCFLAGS = LOCAL_CCFLAGS)

该文件在加入构建系统的时候,会为整个系统添加一个变量 LOCAL_CCFLAGS ,而在构建脚本中:

# handle local group
    def local_group(group, objects):
        if 'LOCAL_CCFLAGS' in group or 'LOCAL_CPPPATH' in group or 'LOCAL_CPPDEFINES' in group or 'LOCAL_ASFLAGS' in group:
            CCFLAGS = Env.get('CCFLAGS', '') + group.get('LOCAL_CCFLAGS', '')
            CPPPATH = Env.get('CPPPATH', ['']) + group.get('LOCAL_CPPPATH', [''])
            CPPDEFINES = Env.get('CPPDEFINES', ['']) + group.get('LOCAL_CPPDEFINES', [''])
            ASFLAGS = Env.get('ASFLAGS', '') + group.get('LOCAL_ASFLAGS', '')

            for source in group['src']:
                objects.append(Env.Object(source, CCFLAGS = CCFLAGS, ASFLAGS = ASFLAGS,
                    CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES))

            return True

        return False

如果group中存在LOCAL_CCFLAGS则会出现一堆相加的调用,如果不选中 SPI 错误只是隐藏了,而不是消失了。

如何修改

原因找到了,问题是如何修改,这应该是某个更新导致,搜索后,找到如下回答:

This is a SCons 4.5.0 regression. Run `pip uninstall scons` then `pip install scons==4.4.0` to fix this.

查看我目前使用的 env 工具中的 scons 版本:

$ pip show scons
Name: SCons
Version: 4.8.0
Summary: Open Source next-generation build tool.
Home-page:
Author:
Author-email: William Deegan <bill@baddogconsulting.com>
License: MIT
Location: D:\03_Tools\env-windows\.venv\Lib\site-packages
Requires:
Required-by: env

尝试修改为 4.4.0 ,先卸载,再安装

$ pip uninstall scons
Found existing installation: SCons 4.8.0
Uninstalling SCons-4.8.0:
  Would remove:
    d:\03_tools\env-windows\.venv\lib\site-packages\scons-4.8.0.dist-info\*
    d:\03_tools\env-windows\.venv\lib\site-packages\scons\*
    d:\03_tools\env-windows\.venv\scripts\scons-configure-cache.exe
    d:\03_tools\env-windows\.venv\scripts\scons.exe
    d:\03_tools\env-windows\.venv\scripts\sconsign.exe
Proceed (Y/n)?
  Successfully uninstalled SCons-4.8.0

$ pip install scons==4.4.0
Collecting scons==4.4.0
  Using cached SCons-4.4.0-py3-none-any.whl.metadata (8.8 kB)
Requirement already satisfied: setuptools in d:\03_tools\env-windows\.venv\lib\site-packages (from scons==4.4.0) (65.5.0)
Using cached SCons-4.4.0-py3-none-any.whl (4.2 MB)
Installing collected packages: scons
Successfully installed scons-4.4.0

尝试生成 CMake 工程:

$ scons --target=cmake
scons: Reading SConscript files ...
Update setting files for CMakeLists.txt...
Done!

再切换为独立的bsp,也可以成功生成 CMake 工程。

总结

此次问题应该是较新的 env 工具使用的 scons 版本与目前 RTT 使用的 local_group 函数在语法上不兼容导致的,因为修改构建系统可能改动较大,并且我不是官方,可能后面不好维护,因此采用的方式为将 scons 改回之前的版本,测试ok。

这估计也是我之前使用 SPI 驱动却没有出现问题的原因。

下一篇:【RT-Thread】将BSP工程从RT-Thread源码中独立出来开发(4)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值