XFusion 构建流程
作者
kirto
本文简要说明 XFusion
的构建流程。
export 阶段
构建之初会使用export
脚本激活xfuison
windows cmd:
cmd
.\export.bat <target>
windows powershell:
powershell
.\export.ps1 <target>
linux:
shell
. ./export.sh <target>
其目的首先是导出XF_ROOT
、XF_TARGET
、XF_VERSION
、XF_TARGET_PATH
四个临时环境变量。 当关闭当前终端则环境变量消失。
其次,创建python
虚拟环境(如果当前出于python
虚拟环境中,则不创建)。 最后,通过pip
安装xf_build
构建工具
前期判断
当我们执行xf build
命令的时候。 会自动调用 tools/xf_build/xf_build/xf_build/cmd/cmd.py
中的build()
函数。 build()
函数操作:
检查是否是工程目录。 此检查是通过当前目录下有无
xf_project.py
实现的。 后续会创建临时环境变量XF_PROJECT_PATH
保存工程路径。检查当前目标有无改变。 这里利用了
XF_ROOT
下的build/project_info.json
保存的XF_TARGET_PATH
对比当前环境变量中的XF_TARGET_PATH
是否一致。如果不一致,则调用xf clean
命令进行清除检查当前工程有无改变。 这里利用了
XF_ROOT
下的build/project_info.json
保存的XF_PROJECT_PATH
对比当前环境变量中的XF_PROJECT_PATH
是否一致。如果不一致,则调用xf clean
命令进行清除执行
xf_project.py
脚本, 完成收集编译信息任务
收集阶段
xf_project.py
被执行后,其内容大致如下:
python
import xf_build
xf_build.project_init()
xf_build.program()
project_init()
方法位于tools/xf_build/xf_build/xf_build/__init__.py
文件中。 主要完成默认project
对象的创建,以及简化其方法的调用
program()
方法位于tools/xf_build/xf_build/xf_build/build.py
文件中。 program()
主要的作用是:
- 将
XF_ROOT
下的components
文件夹下的所有文件夹视为一个个组件。 - 将
XF_PROJECT_PATH
下的components
文件夹下的所有文件夹视为一个个组件。 - 将
XF_PROJECT_PATH
下的main
视为一个组件。 - 执行所有组件的
xf_collect.py
文件 - 最终将所有的构建信息收集到
XF_PROJECT_PATH
下的build/build_environ.json
中
其中xf_collect.py
文件大致为:
python
import xf_build
xf_build.collect()
collect()
方法的srcs
默认为["*.c"]
、inc_dirs
默认为["."]
。如果不设置具体内容,则默认收集该文件夹内的所有.c
文件。可以自定义,直接采取默认参数。
requires
参数主要涉及到组件之间的依赖关系。如果A
需要B
组件里面的函数则在A
的xf_collect.py
文件中的collect()
改为collect(requires=[B])
组件名为文件夹名。
cflag
则是涉及到的编译标志位参数收集。
插件编译部分
上个阶段的末期会调用XF_ROOT
下的plugins
下的XF_TARGET
插件。 这部分需要移植者针对不同的target
进行对应的编译插件开发。
插件开发需要完成以下几个功能:
创建你所需要的
target
文件夹在
target
文件夹下创建__init__.py
文件。该文件内容如下:pythonfrom .build import *
只有该文件存在,才会被识别为一个
python
包在
target
文件夹下创建build.py
文件。该文件内容如下:pythonimport xf_build hookimpl = xf_build.get_hookimpl() class esp32(): @hookimpl def build(self, args): """ 这里对接编译的内容。 通过 XF_PROJECT_PATH 下的 build/build_environ.json 文件 生成对应的sdk构建脚本 启动sdk的编译命令 """ @hookimpl def clean(self, args): """ 这里对接清除编译命令 """ @hookimpl def flash(self, args): """ 这里对接烧录命令 """ @hookimpl def export(self, args): """ 这里对接导出命令 """ @hookimpl def update(self, args): """ 这里对接导出更新命令 """ @hookimpl def menuconfig(self, args): """ 这里sdk的menuconfig命令。 """