ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

edk2 UefiPayloadPkg 平台 CI 与 Pytools 本地构建完整指南

2026/10/4 15:02:11 拓冰建站 浏览量
edk2 UefiPayloadPkg 平台 CI 与 Pytools 本地构建完整指南 固件操作系统驱动开发嵌入式【免费下载链接】edk2EDK II项目地址https://gitcode.com/gh_mirrors/ed/edk2点击查看免费下载本文面向需要在本地复现 UefiPayloadPkg 固件构建流程的开发者系统讲解 edk2 仓库中 UefiPayloadPkg/PlatformCI 目录下的 Azure DevOps Platform CI 方案以及如何用同一套基于 Pytoolsedk2-pytool-extensions的构建基础设施在本地完成从环境准备、依赖拉取到固件编译的全过程。读完本文你将掌握stuart_setup/stuart_update/stuart_build的完整用法、-a架构参数的语义、BLD_*_前缀传递构建宏的机制并能依据 PlatformBuild.py 源码理解每条命令背后实际发生的动作。一、Platform CI 是什么一份配置云端与本地通用UefiPayloadPkg 的 Platform CI 是一套基于 Azure DevOps 的持续集成方案其核心并非云端的流水线 YAML 本身而是仓库内一个与工具链无关的 Python 构建脚本 UefiPayloadPkg/PlatformCI/PlatformBuild.py。该脚本实现了 edk2-pytool-extensions 的SetupSettingsManager、UpdateSettingsManager、PrEvalSettingsManager、BuildSettingsManager与UefiBuilder接口因此同一份脚本既可以驱动 Azure DevOps 云端流水线也可以直接在本地命令行中以stuart_*系列命令执行——这正是Platform CI 与本地构建共用同一套基础设施的含义。已验证的构建配置当前方案只在以下环境组合中完成过验证其他环境如 Linux GCC可自行尝试但不保证开箱即用操作系统Windows 11工具链VS2019 CLANG/LLVM支持的两类固件构建配置如下配置名称架构DSC 文件附加标志IA32IA32UefiPayloadPkg.dsc无X64X64UefiPayloadPkg.dsc无需要说明的是-a IA32表示 PEI 与 DXE 阶段均使用 IA3232 位代码-a X64表示 PEI 与 DXE 阶段均使用 X6464 位代码这一点在 PlatformBuild.py 的--arch参数帮助文本中有明确描述。更多关于 Universal PayloadUPL本身的格式、构建与二进制的细节请参阅仓库内的 UefiPayloadPkg/Readme.md。二、PlatformBuild.py 源码拆解构建脚本如何工作在动手执行命令前理解脚本内部结构能帮助你明白每条stuart_*命令究竟做了什么。脚本主要包含两个类1.CommonPlatform平台静态配置PlatformBuild.py#L29-L36PackagesSupported (UefiPayloadPkg,)本构建只针对 UefiPayloadPkg 一个包ArchSupported (X64, IA32)脚本层支持 X64 与 IA32 两种架构TargetsSupported (DEBUG, RELEASE, NOOPT)三种标准构建目标Scopes (uefipayloadpkg, edk2-build)激活的 stuart 作用域用于限定 ext_dep 与工具链解析范围WorkspaceRoot通过脚本自身路径上溯两级得到 edk2 仓库根目录因此脚本可以放在任何位置被调用。2.SettingsManager负责 setup / update / pr_eval 阶段PlatformBuild.py#L45-L132GetRequiredSubmodules()显式声明必须初始化的子模块CryptoPkg/Library/OpensslLib/openssl随后解析仓库根目录.gitmodules文件通过git config --file .gitmodules --get-regexp path读取把其余所有子模块动态加入必需列表避免每次新增子模块都要手工维护脚本SetArchitectures()校验命令行传入的架构集合若包含GetArchitecturesSupported()之外的值则抛出异常并记录 critical 日志FilterPackagesToTest()用于 PR 评估pr_eval当变更文件命中BaseTools目录下的非文档文件或命中platform-build-run-steps.yml时强制触发完整包构建GetPlatformDscAndConfig()返回UefiPayloadPkg/UefiPayloadPkg.dsc及空的 PCD 覆盖字典。3.PlatformBuilder负责实际编译PlatformBuild.py#L139-L224AddCommandLineOptions()/RetrieveCommandLineOptions()注册-a/--arch参数默认X64并把解析结果写入构建变量——TARGET_ARCH与ACTIVE_PLATFORMUefiPayloadPkg/UefiPayloadPkg.dsc。这正是后文无需手工配置 target.txt的直接原因SetPlatformEnv()硬编码PRODUCT_NAMEUefiPayloadPkg默认TOOL_CHAIN_TAGVS2022当工具链为VS系列时根据目标架构设置TOOL_CHAIN_TAG_HOST环境变量为x86IA32或x64X64保证 Windows 上使用正确的 Platform Headers 与库在 Windows 上设置CLANG_HOST_BINn注入两个构建宏BLD_*_BUILD_ARCH与BLD_*_UNIVERSAL_PAYLOADTRUE即 CI 构建默认产出 Universal PayloadPlatformPostBuild()编译完成后调用UniversalPayloadFullBuild()来自 UefiPayloadPkg/UniversalPayloadBuild.py生成 ELF/FIT 格式的 UPL 入口并与常规构建 FD 合并且依据FIT_BUILD构建变量决定是否产出 FIT 格式GetName()当MAKE_STARTUP_NSHTRUE时日志文件命名为UefiPayloadPkg_With_Run避免 CI 中覆盖运行步骤的构建日志。三、EDK2 开发者环境准备3.1 基础依赖Python满足 pip-requirements 中requires-python声明的版本要求建议使用较新的 Python 3 稳定版本Gitedk2 源码即当前仓库工作区。一个值得强调的差异点是传统 edk2 构建流程中的edksetup、子模块初始化、NASM、iASL 及交叉编译器的手工安装在这里都不需要——这些均由 Pytools 构建系统自动处理。stuart_setup负责初始化子模块stuart_update负责按 ext_dep 声明自动拉取 NASM、iASL 等外部依赖工具从而大幅降低本地环境搭建成本。3.2 安装 Pytoolsedk2 根目录下的 pip-requirements.txt 声明了全部 Python 依赖核心组件为edk2-pytool-library~0.23.16底层工具库edk2-pytool-extensions~0.31.1提供stuart_setup/stuart_update/stuart_build/stuart_pr_eval等命令以及antlr4-python3-runtime、lcov-cobertura、regex、pefile等辅助包。pefile无版本锁定FIT 格式构建需要其余包均按约束版本安装。四、本地构建完整七步流程以下步骤与 CI 流水线执行的动作一致全部在 edk2 仓库根目录下执行。步骤 1可选创建 Python 虚拟环境一般每个工作区只需创建一次python -m venv name of virtual environment步骤 2可选激活虚拟环境每次新开 shell 都需要激活Linuxsource name of virtual environment/bin/activateWindowsname of virtual environment/Scripts/activate.bat步骤 3安装 Pytools一般在每个虚拟环境创建时执行一次或在pip-requirements.txt发生变更后重新执行pip install --upgrade -r pip-requirements.txt步骤 4初始化与更新子模块仅当子模块更新时才需要执行stuart_setup -c UefiPayloadPkg/PlatformCI/PlatformBuild.py TOOL_CHAIN_TAGTOOL_CHAIN_TAG -a TARGET_ARCH该命令依据SettingsManager.GetRequiredSubmodules()初始化所有必需子模块含 Openssl 子模块与.gitmodules中动态解析出的其余子模块。步骤 5初始化与更新依赖仅在 ext_deps 变化时按需执行stuart_update -c UefiPayloadPkg/PlatformCI/PlatformBuild.py TOOL_CHAIN_TAGTOOL_CHAIN_TAG -a TARGET_ARCH该命令负责下载并安装 NASM、iASL 等外部依赖工具。步骤 6编译 basetools必要时仅在 BaseTools 的 C 源码发生变更时执行python BaseTools/Edk2ToolsBuild.py -t ToolChainTag步骤 7编译固件stuart_build -c UefiPayloadPkg/PlatformCI/PlatformBuild.py TOOL_CHAIN_TAGTOOL_CHAIN_TAG -a TARGET_ARCH其中TOOL_CHAIN_TAG按你的环境替换为实际工具链标签例如VS2019、VS2022或CLANGPDB等TARGET_ARCH取IA32或X64运行stuart_build -c UefiPayloadPkg/PlatformCI/PlatformBuild.py -h可查看全部附加选项例如--clean清理构建产物后重新编译、--SKIP系列跳过选项等。注意事项无需配置 Conf/target.txtACTIVE_PLATFORM与TARGET_ARCH由 PlatformBuild.py 根据[-a TARGET_ARCH]参数自动设置见 PlatformBuild.py#L150-L157手工编辑 target.txt 反而可能造成冲突执行日志会同时输出到 stuart 标准日志文件与控制台。五、传递自定义构建宏BLD_*_前缀机制构建脚本支持通过命令行向 DSC 传递构建宏build define规则是在宏名前加上BLD_*_前缀。由于stuart_build要求参数必须被赋值对于布尔性质的裸宏需要补上1。以启用 IP6 网络协议栈为例UefiPayloadPkg.dsc中定义了NETWORK_DRIVER_ENABLE FALSE见 UefiPayloadPkg/UefiPayloadPkg.dsc#L146并在[Components]与 FDF 中通过!if $(NETWORK_DRIVER_ENABLE) TRUE条件决定是否编译网络驱动。在命令行开启它stuart_build -c UefiPayloadPkg/PlatformCI/PlatformBuild.py BLD_*_NETWORK_DRIVER_ENABLE1PlatformBuild.py内部的SetPlatformEnv()也展示了同样的注入方式BLD_*_BUILD_ARCH把命令行架构透传给 UPL 构建与BLD_*_UNIVERSAL_PAYLOADTRUE强制以 Universal Payload 模式构建。UefiPayloadPkg 的 DSC 中还预置了大量可开关的宏例如UNIVERSAL_PAYLOAD/UNIVERSAL_PAYLOAD_FORMATELF/FIT 格式选择见 UefiPayloadPkg/UefiPayloadPkg.dsc#L72-L73SECURE_BOOT_ENABLE、SMM_SUPPORT、NVME_ENABLE、ATA_ENABLE、SD_ENABLE、TIMER_SUPPORTHPET/LAPIC、VARIABLE_SUPPORTEMU/SPI/SMMSTORE/NONE等均可通过BLD_*_宏名值在命令行覆盖。六、构建产物与验证默认输出目录由 DSC 的OUTPUT_DIRECTORY Build/UefiPayloadPkg$(BUILD_ARCH)决定UefiPayloadPkg/UefiPayloadPkg.dsc#L29其中BUILD_ARCH默认取Legacy。由于 CI 构建在PlatformPostBuild阶段额外执行了UniversalPayloadFullBuild产物还包括Build/UefiPayloadPkgX64/UniversalPayload.elfELF 格式默认或Build/UefiPayloadPkgX64/UniversalPayload.fitFIT 格式需设置FIT_BUILD可使用llvm-objdump -h查看 ELF 的段布局upld_info、upld.uefi_fv、upld.bds_fv、upld.afpx_fv等FIT 格式则可用fdtdump解析。更详细的二进制格式与 bootloaderEdk2boot 等集成方式见 UefiPayloadPkg/Readme.md。七、参考路径速查平台 CI 说明文档UefiPayloadPkg/PlatformCI/ReadMe.md构建脚本CI 与本地共用UefiPayloadPkg/PlatformCI/PlatformBuild.py平台 DSC宏定义与组件清单UefiPayloadPkg/UefiPayloadPkg.dscUPL 格式与构建说明UefiPayloadPkg/Readme.mdUPL 构建工具UefiPayloadPkg/UniversalPayloadBuild.pyPython 依赖清单pip-requirements.txtbasetools 编译脚本BaseTools/Edk2ToolsBuild.py赞分享固件操作系统驱动开发嵌入式【免费下载链接】edk2EDK II项目地址https://gitcode.com/gh_mirrors/ed/edk2点击查看免费下载相关推荐OvmfPkg 平台 CI 指南使用 edk2 Pytools 本地构建与验证 OVMF 固件OvmfPkg 平台 CI 指南使用 edk2 Pytools 本地构建与验证 OVMF 固件 OvmfPkg 是 EDK II 中面向 QEMU/KVM 虚固件操作系统驱动开发嵌入式EDK II EmulatorPkg 平台 CI 构建指南基于 Pytools 的本地构建与模拟器自动化运行EDK II EmulatorPkg 平台 CI 构建指南基于 Pytools 的本地构建与模拟器自动化运行 本篇技术指南以 EDK II 仓库中 Emula固件操作系统驱动开发嵌入式minikube 二进制源码编译构建指南从本地 make 到跨平台产物与 CI 构建minikube 二进制源码编译构建指南从本地 make 到跨平台产物与 CI 构建 minikube 是一个在本地运行 Kubernetes 的开源项目其云原生容器编排CLI开发工具上一篇显存测试工具 memtest_vulkan5 分钟跑完一轮显存健康检测让显卡隐疾无处遁形下一篇VidBee1000 网站视频下载 本地 AI 字幕5 分钟把视频变成能搜索的资料库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考