【RT-Thread】独立开发BSP工程指南(从RT-Thread源码中分离,第三部分)
上一篇:【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,使用 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)
作者:gerald0057