SCons 是一套由 Python 语言编写的开源构建系统,类似于 GNU Make。它采用不同于通常 Makefile 文件的方式,而是使用 SConstruct 和 SConscript 文件来替代。这些文件也是 Python 脚本,能够使用标准的 Python 语法来编写。所以在 SConstruct、SConscript 文件中可以调用 Python 标准库进行各类复杂的处理,而不局限于 Makefile 设定的规则。
遗传自RT-Thread,NextPilot飞行系统也是采用SCons + Kconfig 进行项目的配置和构建。如何在NextPilot中使用scons,请参考NextPilot开发指南。
rt-thread/tools文件夹中,有很多被SConstruct或SConscript文件调用的python函数和脚本,比如rt-thread/tools/building.py,有些时候python脚本太复杂,遇到问题靠print调试会比较低效,那么如何在命令行运行scons时候调试这些python文件呢。
其实原理很简单:
用户在终端运行scons命令,本质执行 SCons.Script.main(),那么创建了一个scons-debug.py脚本,在脚本中调用SCons.Script.main(),然后让vscode使用debugpy工具调试scons-debug.py文件,这样就实现了调试scons的目的。
准备开发环境
首先安装env-windows或者nextpilot-windows-toolchain,它们提供了rt-thread所需开发环境(比如python、qemu、gcc等)。
然后克隆最新版的rt-thread或者nextpilot-flight-control源代码到本地。
# nextpilot-flight-control
gt clone https://gitee.com/nextpilot/nextpilot-flight-control
安装VS Code,用于调试
调试scons命令
双击nextpilot-flight-control.code-workspace打开VS Code工作空间
创建scons-debug.py
在nextpilot-flight-control/tools/building文件夹添加scons-debug.py文件,内容如下
import SCons.Script
SCons.Script.main()
创建scons-debug.py文件,然后让vscode使用debugpy工具调试scons-debug.py文件。
创建launch.json
在nextpilot-flight-control/bsps/sitl/qemu/.vscode文件夹下launch.json文件,内容如下:
{
"version": "0.2.0",
"configurations": [
{
"name": "NextPilot Scons-Debug",
// 使用debugpy工具
"type": "debugpy",
// 启动
"request": "launch",
// 需要scons-debug.py文件
"program": "D:/nextpilot-flight-control-public/tools/building/scons-debug.py",
"args": "${command:pickArgs}" // 从输入框获取命令行参数
}
]
}
launch.json相当于给VScode配置了一个启动器,当运行F5的时候,会调用debugpy执行scons-debug.py文件,scons命令行参数由${command:pickArgs}输入。
启动scons调试
在rtos/rt-thread/tools/building.py文件(任何被SConstruct或SConscript调用的python脚本都可以)的PrepareBuilding()函数下面打个断点:
def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = []):
global BuildOptions
global Projects
global Env
global Rtt_Root
AddOptions()
Env = env
Rtt_Root = os.path.abspath(root_directory)
在左侧工具栏点击“运行和调试”标签,然后“运行...”下拉框中选择“NextPilot Scons-Debug”,再点击“三角形”运行“Scons-Debug”配置。
点击运行之后,会弹出一个输入框,在里面可以输入需要传递给scons的命令行参数,可以根据需要输入,比如--target=mdk5,当然也可以直接回车
回车之后,debugpy会停止在您刚刚打断点的位置了:
接下来就可以使用VScode的单步调试,愉快的排查问题了。
扩展功能
如果您正在开发nextpilot项目,launch.json和scons-debug.py文件都不需要您手动创建,当您在终端运行scons命令的时候,会当前目录的.vscode文件夹自动生成launch.json文件(参考tools/building/vscode_helper.py),选择NextPilot Scons-Debug”配置之后,直接按F5即可调试scons命令了。