菜单

kaoqi
kaoqi
发布于 2026-08-31 / 8 阅读
0
0

EDK2的build工具

EDK2在完成source本地的edksetup.sh脚本后,使用build工具进行dsc到inf文件的解析,最终由autogen生成中间件与c文件后,生成最终的efi文件。

build命令本身可以用来生成c文件与makefile文件,其命令本身格式为:

build -p <PLatformDscPath> -a <Architecture> -t <Toolchain> -b <Target>

1、dsc文件的指引

如果什么都不敲的话,会调用/Conf/target.txt文件,读取其中的默认dsc文件。

默认为/EmulatorPkg/EmulatorPkg.dsc文件,可以通过读上面那个文件知道这是怎么一回事。

正常情况下,需要使用-p指令指定dsc文件:

2、Architecture

-a指定指令集是必需的,这直接关系到之后生成的makefile内的宏展开。

目前来看,指定AARCH64即可。

3、toolchain

这里是选择具体的GCC等的编译命令,可以在/Conf/tools_def.txt中找到“Supported Tool Chains”的描述,里面有很多具体的选项:

这里可以直接选择GCC5,这将会跳转到aarch64-linux-gnu的编译套件,参考如下:

这里是一份命令的解释,可以说,填写GCC5就可以了。

4、target

target的描述为:

从描述中可以看出,目标版本可以分为多个级别:

DEBUG:调试模式,包含调试符号,关闭或降低优化,启用断言,适合开发阶段

RELEASE:发布模式,开启最高优化,移除调试符号和断言,体积最小,速度最快

NOOPT:无优化模式,完全关闭优化,保留所有调试信息,用于排查因编译器优化导致的bug

UserDefined:需要用户在工具链配置中预先自定义

这里可以指定为RELEASE模式或DEBUG模式都可以,默认是DEBUG模式。

除了上述四个比较直接会影响到编译结果的内容外,还有下面几个东西也比较常用:

-m/module直接指定inf文件,这个命令可以跳过其他未编译的模块(dsc文件会描述各个模块的inf路径,在使用build执行dsc命令时自动就会去执行各个inf的makefile生成)

-n/--threadnumber用于指定线程数目

-D/Database可以指定一些平台中的公共protocol,使其使能并加入到EFI文件中

-v/verbose提供构建过程中的日志输出级别

最终,在你使用合适的build命令生成对应的makefile后,会在对应文件夹下看到它们的,下面是一个针对ShellPkg的makefile生成过程:

build -p ShellPkg/ShellPkg.dsc -a AARCH64 -t GCC5 -b RELEASE -v

相应的生成为:

文件:

然后就可以成功进入shell了。

路径在这里:

/Build/ShellPkg/RELEASE_GCC5/AARCH64/ShellPkg/Application/Shell/Shell/OUTPUT/

额外的描述:

如果EDK2本身项目缺子模块的话,使用如下命令让EDK2自己去安装对应子摸块(需要使用git去拉一些子模块的工具):

git submodule update --init --recursive

如果遇到很多东西获取不到的话,要挂梯子什么的。

注意,还需要首先编译Basetools工具箱,需要使用合适的本地gcc进行编译,同时需要具备uuid-dev的开发环境


评论