图片版

https://static.someones.cn/images/ece20e1660d989b294be8c79255ec8a2d2bf77cd120d68da6a86231bbd2d2480.png

前言

本文针对Ubuntu系统,使用其他系统开发或不使用apt进行包管理,需要自行修改命令。
笔者使用bash作为默认shell环境。
在Ubuntu 18.04、Ubuntu 20.04、Ubuntu 22.04下测试通过。

配置开发环境

1
2
3
4
5
# 安装必要依赖
sudo apt-get -y install wget gcc python3 python3-distutils build-essential uuid-dev iasl nasm

# 设置默认python3为默认python命令
sudo ln -s /usr/bin/python3 /usr/bin/python

(可选)配置交叉编译器

如果需要编译与本机CPU架构不同的UEFI,需要配置对应的交叉编译工具。
以下示例是:X86平台编译AARCH64平台的UEFI

1
2
3
4
5
6
7
8
9
10
11
# 下载交叉编译器并解压
wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
tar axvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

# 解压得到一个文件夹:gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
# 将文件夹里的bin目录加入环境变量
export PATH=$PATH:$PWD/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/

# 设置交叉编辑工具前缀:
export GCC5_AARCH64_PREFIX=aarch64-linux-gnu-
export GCC49_AARCH64_PREFIX=aarch64-linux-gnu-

获取Edk2最新源代码

1
2
3
4
5
6
# 克隆主仓库代码
git clone https://github.com/tianocore/edk2.git
cd edk2

# 更新子模块代码
git submodule update --init --recursive

(可选)获取C语言标准库代码

以上代码不包含C语言标准库,如果需要使用C语言标准库,可以按照下面方法下载。
克隆edk2-libc仓库,复制AppPkg、StdLib、StdLibPrivateInternalFiles这3个文件夹到Edk2源代码目录。

1
2
3
4
5
6
git clone https://github.com/tianocore/edk2-libc.git

cd edk2-libc

# 变量EDK2_SRC_DIR为代码目录
cp -a AppPkg StdLib StdLibPrivateInternalFiles $(EDK2_SRC_DIR)/

编译 & 运行

准备工作

  1. 编译基本工具,一般情况下只需要编译一次。
1
2
# 代码根目录执行
make -C BaseTools
  1. 加载开发环境,每个Shell环境都需要执行一次
1
2
# 代码根目录执行
source edksetup.sh

(可选)编译并运行模拟器

执行以下命令编译模拟器,下附编译成功图片。

1
2
3
4
5
# 编译模拟器
EmulatorPkg/build.sh

# 运行模拟器
EmulatorPkg/build.sh run

编译成功

执行以下命令,输入“run”运行

输入"run"运行

成功运行

(故障排除)基本工具编译失败

可能是gcc版本过高,或者python版本不正确引起的。编译基本工具使用的是本机的gcc和python,与安装的交叉编译工具无关。

gcc错误

可以尝试降级gcc,或者修改配置文件,下面提供修改配置文件的方法。

Python错误

如果在“test_xxx”出错,一般是python脚本出错,这种情况推荐直接更换python版本。
不同的代码要求的pyhton版本不一样,暂时没有研究出版本对照表。

常见问题

  • 推荐使用bash作为默认shell,使用其他的(如:zsh)可能出现一些奇怪的问题。
  • 缺少X11 Lib或xext执行以下命令。sudo apt-get install x11proto-xext-dev libxext-dev