概述
前言
使用EDK进行UEFI开发,开始的时候很容易遇到的问题就是编译不过,并非代码的问题,而是编译环境存在异常。
本文主要介绍EDK是如何进行编译的,使用的平台是Windows。这里还想说一点,事实上Linux下的EDK编译相比Windows还更简单一些,但是在实际的开发中,会需要使用到Intel提供的各类工具,而这些工具只有Windows版本的,所以开发一般还是需要在Windows平台。
本文涉及到具体的EDK版本,一般说的是vUDK2017: https://github.com/tianocore/edk2.git Tag vUDK2017.,它(后面称为源码)其实是来自GitHub - tianocore/edk2: EDK II,只是有一些自己的修改。
编译工具
EDK编译需要使用到的工具有如下的一些:
Visual Studio:这是主要的编译工具,当然又备选的Intel自己的编译工具,但是VS是最常用的,从VS2010开始,各个版本的VS都支持,在【UEFI实战】OVMF基础已经说明了如何安装VS。需要说明的是,其实并不需要安装VS也能够使用到它的工具来进行编译,后续会说明这一点。
Python:EDK在编译的前期处理中使用了大量的Python脚本(也有可能是封装成exe的Python脚本),来生成编译必须的C文件,H文件和Makefile文件,另外,某些EDK二进制本身就是通过Python脚本来生成的,所以Python必不可少。目前Python2.7是一般的EDK都支持的。
NASM:EDK中一部分的代码是汇编语言,汇编语言在Windows下可以通过NASM或者MASM来编译,它们对应的汇编语言稍有不同,可能是为了兼容性的问题(Linux下也有NASM,但是MASM是微软的,没有Linux版本),在EDK中NASM更常用。
ASL:EDK中比较特殊的就是ACPI语言,它需要通过ASL工具来进行编译,所以它也是必不可少的。
还有,某些比较老的EDK版本,需要使用到WINDDK的工具,这个只要知道有这么一回事情即可。
最后,在EDK的源代码中,还有一个目录BaseTools,它包含了EDK自己要用的一些工具,这些工具包含了Windows版本,Python版本和Linux版本。以源码为例,它默认不包含Windows版本工具,只给了一个链接,需要自己去下载,但是也可以通过工具从Python版本转化而来(其实下载来的Windows版本也是通过Python转换过来的,使用的工具是cx_Freeze);Linux版本需要自己先编译出来才能使用。
另外,非常重要的一点,上述的工具最好是安装在默认目录(一般就是C盘的特定位置),如果不在默认的位置,就很可能出现异常。
配置
前面介绍了EDK编译需要使用的工具,但是我们如何来使用这些工具呢?“默认目录”到底是指哪个目录呢?本节将介绍这部分的内容。
我们在编译EDK之前,需要先运行一个脚本,它的名字是edksetup.bat,通过名字也可以看出来它的作用。
其中很重要的一部分就是调用BaseToolstoolsetup.bat,同样从它的名字也可以看出来这个脚本的作用。
在toolsetup中,有如下的操作:
1. 设置一些变量,其中就有EDK默认提供的工具的位置EDK_TOOLS_PATH,BASE_TOOLS_PATH,EDK_TOOLS_BIN等,这些变量就指定了我们应该去哪里获取EDK自己提供的工具;同时它还给PATH这个环境变量上增加了EDK工具的目录,这样Windows下就可以直接调用这些工具,而不需要使用绝对路径了。运行edksetup.bat的时候会有如下的打印,就是设置的变量:
PATH = E:CodesvUDK2017BaseToolsBinWin32;C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;C:WindowsSystem32OpenSSH;D:Program FilesGitcmd;C:Program Files (x86)Windows Kits8.1Windows Performance Toolkit;C:Program Files (x86)NVIDIA CorporationPhysXCommon;C:Program FilesNVIDIA CorporationNVIDIA NvDLISR;D:Program FilesTortoiseGitbin;D:Program Filesqemu;C:UsershomeAppDataLocalMicrosoftWindowsApps;D:Program Files (x86)Microsoft VS Codebin;D:Program Filesqemu;
WORKSPACE = E:CodesvUDK2017
EDK_TOOLS_PATH = E:CodesvUDK2017BaseTools
BASE_TOOLS_PATH = E:CodesvUDK2017BaseTools
EDK_TOOLS_BIN = E:CodesvUDK2017BaseToolsBinWin32
CONF_PATH = E:CodesvUDK2017Conf
2. 之后,在toolsetup.bat中会调用set_vsprefix_envs.bat这个脚本,看它的名字就可以看出来它是用来处理VS相关的内容的。前面已经提到,EDK支持不同版本的VS,在VS安装的过程中,会设置一个变量,比如这边安装的是VS2015,可以在系统变量中看到VS140COMNTOOLS这个变量:
通过这个变量,我们就可以知道目前的编译环境中装了哪个版本的VS,从而进一步指定VS下的工具目录,并初始化对应的变量。
除此之后,set_vsprefix_envs.bat中还会设置WINDDK和ASL的目录。
3. 下面回到toolsetup.bat,之后的操作非常重要,它创建一个Conf目录(这也是本节标题的来源),然后往这个目录中放入target.txt,tools_def.txt和build_rule.txt。这三个文件不是凭空生成的,而是在BaseTools目录下存在模板:
这样做的好处是,我们可以手动修改Conf目录下的这三个文件,来做出自定义。
下面来一一介绍这几个文件:
1)首先是build_rule文件,之所以要先讲是因为我也不知道它是干什么的,跳过。
2)然后是target,这个目录主要是配置如下的一些值:
ACTIVE_PLATFORM:指定编译的dsc文件;
TARGET:指定是Release版本还是DEBUG版本;
TARGET_ARCH:指定平台是32位还是64位还是两者皆有;
TOOL_CHAIN_CONF:指定使用的工具包,一般就是tools_def.txt;
TOOL_CHAIN_TAG:指定具体使用的工具及其版本,就是用VS还是其它编译器之类的,后面讲tools_def的时候还会说明;
MAX_CONCURRENT_THREAD_NUMBER:指定参与编译的核数;
BUILD_RULE_CONF:指定使用的规则,一般就是build_rule.txt;
以上的这些参数,在使用编译命令的时候大部分都可以Override,所以这里指定并不一定有效;
3)tools_def文件列出了所有支持的编译器和对应的变量,以及不同编译器需要使用的参数。以这边是用的VS2015x86为例,它设置了如下的变量(当然实际上还有很多):
DEFINE VS2015x86_BIN = ENV(VS2015_PREFIX)Vcbin
DEFINE VS2015x86_DLL = ENV(VS2015_PREFIX)Common7IDE;DEF(VS2015x86_BIN)
DEFINE VS2015x86_BINX64 = DEF(VS2015x86_BIN)x86_amd64
这里的VS2015_PREFIX就是在set_vsprefix_envs.bat设置的。
通过上述的变量,我们也可以确定EDK编译的时候到底去哪个目录获取工具了。
我们在target中定义的TOOL_CHAIN_TAG,或者在调用build时通过的-t传入的参数,必须在tools_def中定义,否则build就会报错。
build
工具已经安装,配置也已经有了,下面就是最重要的编译。
关于build工具的使用,我们先来看下面的操作:
我们在EDK目录下直接调用build,会提示不是可用的命令。
然后我们运行edksetup.bat,我们从前面的介绍里面已经知道,它会设置BaseTools下的工具目录到PATH系统变量中,所以之后的build就能够识别到了,所以操作能够执行。
实际的build在如下的目录:
我们可以进一步查看它的使用方法:
有一部分参数已经在前面提过,这里也不再赘述。
同时我们还可以找到它的Python版本:
它才是真正的EDK编译的重点。
关于build具体做了哪些操作,可以直接查看build.py以及相关的代码。
不过代码比较多且复杂。
这里只做简单的说明:
1. 文本转换。EDK里面除了c文件,h文件等常用的编程语言文件,还有inf文件,dec文件,dsc文件,fdf文件等等,这些本质上不是编译语言文件,而是为了方便EDK编程而使用的帮助文件,这些文件最终会通过build命令进行转化,生成新的文件(我们可以在Build目录下找到AutoGen.c,Makefile等),它们才是真正编译需要用到的;
2. 调用VS工具,并配置之前生成的Makefile文件来进行编译;
3. 通过fdf文件生成真正的二进制。
最后
以上就是高贵毛巾为你收集整理的【UEFI实战】EDK的编译流程说明前言编译工具配置build的全部内容,希望文章能够帮你解决【UEFI实战】EDK的编译流程说明前言编译工具配置build所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复