Skip to content

XFusion 构建流程

作者

kirto

本文简要说明 XFusion 的构建流程。

export 阶段

构建之初会使用export脚本激活xfuison

windows cmd:

cmd
.\export.bat <target>

windows powershell:

powershell
.\export.ps1 <target>

linux:

shell
. ./export.sh <target>

其目的首先是导出XF_ROOTXF_TARGETXF_VERSIONXF_TARGET_PATH 四个临时环境变量。 当关闭当前终端则环境变量消失。

其次,创建python虚拟环境(如果当前出于python虚拟环境中,则不创建)。 最后,通过pip安装xf_build构建工具

前期判断

当我们执行xf build命令的时候。 会自动调用 tools/xf_build/xf_build/xf_build/cmd/cmd.py中的build()函数。 build()函数操作:

  1. 检查是否是工程目录。 此检查是通过当前目录下有无xf_project.py实现的。 后续会创建临时环境变量XF_PROJECT_PATH保存工程路径。

  2. 检查当前目标有无改变。 这里利用了XF_ROOT下的build/project_info.json保存的XF_TARGET_PATH对比当前环境变量中的XF_TARGET_PATH是否一致。如果不一致,则调用xf clean命令进行清除

  3. 检查当前工程有无改变。 这里利用了XF_ROOT下的build/project_info.json保存的XF_PROJECT_PATH对比当前环境变量中的XF_PROJECT_PATH是否一致。如果不一致,则调用xf clean命令进行清除

  4. 执行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()主要的作用是:

  1. XF_ROOT下的components文件夹下的所有文件夹视为一个个组件。
  2. XF_PROJECT_PATH下的components文件夹下的所有文件夹视为一个个组件。
  3. XF_PROJECT_PATH下的main视为一个组件。
  4. 执行所有组件的xf_collect.py文件
  5. 最终将所有的构建信息收集到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组件里面的函数则在Axf_collect.py文件中的collect()改为collect(requires=[B])组件名为文件夹名。

cflag则是涉及到的编译标志位参数收集。


插件编译部分

上个阶段的末期会调用XF_ROOT下的plugins下的XF_TARGET插件。 这部分需要移植者针对不同的target进行对应的编译插件开发。

插件开发需要完成以下几个功能:

  1. 创建你所需要的target文件夹

  2. target文件夹下创建__init__.py文件。该文件内容如下:

    python
    from .build import *

    只有该文件存在,才会被识别为一个python

  3. target文件夹下创建build.py文件。该文件内容如下:

    python
    import 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命令。
         """