(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365)
开发UEFI代码的时候,起码有近三分之一的时间,在研究各种编译环境的搭建。从Windows到Linux,x86架构到Arm架构,甚至各种不同版本的EDK2,有时候着实让人无语。
之前的代码都在github上下载,速度慢得出奇,搭建好的环境一般也不想乱动。今年3月份,疫情期间,在家鼓捣着把github上与uefi相关的库,全部都导到了gitee上了。解决了下载速度的问题,总算可以不受限制地搭建开发环境了。
最近刚好遇到一个奇怪的问题,我怀疑与最新的EDK2不成熟有关,搭建了几个稳定版本进行实验,证实了自己的猜想。
现在搭建一个环境,大概只需要十几分钟。考虑到其他技术同好也可能遇到我这种需求,本篇博客就完整地探讨下如何安装各种EDK2的版本。
如图1,EDK2实际上准备了很多的分支和tags,可以根据自己的需求去下载。需要注意的是,我是把github上的EDK2和edk2-libc导入到了gitee上,作为私有仓库使用的。如果想对照博客进行实验,请首先完整这个导入步骤,操作方法可以参考我的这篇:https://blog.csdn.net/luobing4365/article/details/105658274。
图1 edk2的各种分支
总体来说,搭建环境大致可以分为以下几个步骤:
1) 安装必要的开发工具,包括VS2015(或者其他VS编译器)、python、asl和nasm;
2) 使用git下载edk2和edk2-libc(使用C标准库开发时必需);
3) 更新edk2中的submodules;
4) 重新编译BaseTools;
这些步骤完成后,就可以编写各类UEFI应用和驱动了。下面详细介绍操作过程。
1 开发工具的安装
在以前的博客中也介绍过安装过程,具体安装步骤可以参考以前的博客。各工具的下载地址如下:
Python: https://www.python.org/
IASL: https://acpica.org/downloads/binary-tools
Nasm: https://www.nasm.us/
我使用的Python2.7,其他工具都是使用最新的版本。所有工具,都安装在C盘根目录下,方便后续写批处理,设置编译路径。以下是设置路径的批处理(setpath.bat)的内容:
PATH=%PATH%c:\NASM;c:\iasl;
set PYTHON_HOME=C:\Python27\
set NASM_PREFIX=c:\NASM\
2 下载edk2和edk2-libc
Git工具非常好用,建议在windows上也安装一个。我经常使用WSL,所以是直接使用WSL(ubuntu 18)中的git工具的。
在C盘根目录下新建文件夹UefiWorkspace,将需要的edk2分支下载到此文件夹中:
/mnt/c/UefiWorkspace$ git clone --branch edk2-stable202005 [email protected]:luobing4365/edk2.git
下载后,进入edk2文件夹中,可以用如下命令查看branch和tag,实际上就是图1中显示的:
/mnt/c/UefiWorkspace/edk2$ git branch -a
/mnt/c/UefiWorkspace/edk2$ git tag
下载edk2-libc
/mnt/c/UefiWorkspace$ git clone [email protected]:luobing4365/edk2-libc.git
如果为了保持文件夹的独立性,是可以写个批处理来设置各种环境变量的。不过,我是简单处理的,把edk2-libc下的文件,全部拷贝到edk2中了。也即AppPkg、StdLib、StdLibPrivateInternalFiles三个文件夹,直接都拷贝到c:\UefiWorkspace\edk2\下了。
再次提醒,上述的git地址,全部是我自己的私有地址,没有账号和密码是无法使用的。建议先自己把edk2和edk2-libc的库,以及后面要用到的库,全部都导到gitee上,方便自己未来的开发。
3 更新edk2的submodules
在edk2的目录下,有个名为.gitmodules的文件,这是用来更新子模块的git文件。从edk2的开发更新日志来看,后续很多与开发工具相关的,比如OpenSSL、brotli等,都是通过这种方式来进行配置的。
相比而言,以前是需要下载openssl,再拷贝到相应目录,这种方式简单得多。
首先修改.gitmodules文件中的内容,它指定了各种库在github上的下载地址,把这些地址改为自己的仓库地址(再提醒:先把github上相应的库导入到gitee上,否则等待下载的时间会让你怀疑人生的)
[submodule “CryptoPkg/Library/OpensslLib/openssl”]
path = CryptoPkg/Library/OpensslLib/openssl
url = [email protected]:luobing4365/openssl.git
[submodule “SoftFloat”]
path = ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3
url = [email protected]:luobing4365/berkeley-softfloat-3.git
[submodule “UnitTestFrameworkPkg/Library/CmockaLib/cmocka”]
path = UnitTestFrameworkPkg/Library/CmockaLib/cmocka
url = [email protected]:luobing4365/cmocka.git
[submodule “MdeModulePkg/Universal/RegularExpressionDxe/oniguruma”]
path = MdeModulePkg/Universal/RegularExpressionDxe/oniguruma
url = [email protected]:luobing4365/oniguruma.git
[submodule “MdeModulePkg/Library/BrotliCustomDecompressLib/brotli”]
path = MdeModulePkg/Library/BrotliCustomDecompressLib/brotli
url = [email protected]:luobing4365/brotli.git
[submodule “BaseTools/Source/C/BrotliCompress/brotli”]
path = BaseTools/Source/C/BrotliCompress/brotli
url = [email protected]:luobing4365/brotli.git
ignore = untracked
然后在edk2的目录下,使用git命令更新:
/mnt/c/UefiWorkspace/edk2$ git submodule update --init
执行完这次之后,以后再更新时,就不用加“--init”参数了。
4 重新编译BaseTools
打开“VS2015 x86 Native Tools Command Prompt”,提醒下,这里是x86,不是x64,我曾经选错过一次,浪费了十几分钟,一直疑惑为什么编译会出问题。
进入edk2的目录,执行之前的编译工具设定的批处理,然后重编译BaseTools。
C:\UefiWorkspace\edk2>setpath.bat
C:\UefiWorkspace\edk2>edksetup.bat Rebuild
至此,完成所有的搭建工作了。
5 尾声
在搭建过程中,我也使用了最新的edk2编译程序(2020.7.6)。发现存在两个问题:
一是编译信息出现乱码。这个问题可以通过修改活动代码页解决,使用命令“chcp 437”,将活动代码页改为“OEM-美国”就可以了。原来的代码页是936,这是GB2312编码,导致了上述问题。
二是编译C++的UEFI程序。发现在生成的Makefile文件中,除了主程序所在的源文件外,其他源文件的obj生成规则,都没有指定。
第二个问题,我至今没有找到问题所在。从edk2提供的编译出来文件来看,有一个生成Makefile的py程序,所牵扯到的细节实在太多,还没仔细去研究。
嗯,总之,从结果来说,还是最好用稳定版本的软件,最新的稳定版本是edk2-stable202005(本文写于20200707)。
(本篇规划的时候,是准备续接第22篇写的。不过后来发现,第57篇也写了如何使用edk2搭建编译环境。这篇的重心在于,如何针对edk2不同的分支进行环境搭建,实际上是第57篇的后续了。)