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的开发环境