《EDKII Build Process:EDKII项目源码的配置、编译流程[3]》博文目录:

3. EDKII Build Process(EDKII项目源码的配置、编译流程)

->3.1 The General Process Of EDKII Build(EDKII项目源码的配置、编译一般流程)

->3.1.1 Tool chain:BaseTools

->3.1.2 Setup build shell environment

->3.1.3 Modify Conf Files

->3.1.4 Build

->3.2 The Process Of EDKII Build on Windows(Windows环境下EDKII项目源码的配置、编译流程)

->3.1.1 Tool chain:BaseTools

->3.2.2 Setup build shell environment

->3.2.3 Modify Conf Files

->3.2.4 Build Hello World! (and the rest of MdeModulePkg)

->3.2.4 Build Hello World! (and the rest of MdeModulePkg)

->3.3 The Process Of EDKII Build on Linux(Linux环境下EDKII项目源码的配置、编译流程)

->3.3.1 Tool chain: Build the EDK II BaseTools

->3.3.2 Setup build shell environment

->3.3.3 Modify Conf Files

->3.3.4 Build Hello World! (and the rest of MdeModulePkg)

3.1 The General Process Of EDKII Build(EDKII项目源码的配置、编译一般流程)

3.1.1 Tool chain:BaseTools

《EDKII_UserManual_0_7》手册第一章《EDKII Introduction》overview中在列举EDKII优势(The features introduced by EDKII include:)最后一条:

更为强大的编译系统(Enhanced build system.):

编译系统是基于跨操作系统平台的python语言。它是用户可以通过修改几个配置文件来选择不同的工具链、编译规则、编译目标对象。(Its infrastructure is based on Python that is independent of the operating system. It exposes several configuration files that a user can utilize to choose the various tool-chains, even the build rule or generated target. )

EDKII工具链包括build、GenFV、GenFW等,工具链位于BaseTools目录下,Windows平台下可执行工具位于\edk2\BaseTools\Bin\Win32目录下,Linux平台下可执行工具位于edk2/BaseTools/BinWrappers/PosixLike目录下。如果相应目录下没有这些工具就需要编译BaseTools来获得这些工具。

3.1.2 Setup build shell environment

在工作目录下在命令行下运行环境设置脚本(Run edksetup script from the command line prompt at the Work Space directory):

Windows Comand Prompt:

  1. D:\edk2> edksetup.bat

Linux like: 

  1. bash$ . edksetup.sh BaseTools

3.1.3 Modify Conf Files 修改配置文件

我们可以通过配置Conf/target.txt和tools_def.txt文件来指定工具链将指定的包或模块编译成目标平台代码。

3.1.3.1 配置Conf/target.txt文件:

  1. ACTIVE_PLATFORM = MdeModulePkg/MdeModulePkg.dsc
  2. TOOL_CHAIN_TAG = GCC46
  3. TARGET_ARCH = IA32

这样我们可以只在命令行中运行“build”命令即可,会读取Conf/target.txt文件下这些变量的作为默认编译参数。[这种方式一定程度上简化了编译过程,不必每次都指定当前要编译的模块和目标平台代码,但可能也会缺少下面第二种方式的灵活性]

3.1.3.2 检查/修改tools_def.txt确保编译器路径正确Check/Modify tools_def Information:

检查相应工具链VS/Gcc、iasl路径是否正确。

3.1.4 Build

我们可以通过两种方式来指定工具链将指定的包或模块编译成目标平台代码。

一种方式是配置Conf/target.txt文件,运行“build”命令会解析target.txt读取默认配置参数。

另一种方式是通过“build”命令行指定:

Build命令是编译UEFI工程常用的命令。Build命令有三个常用参数:-a、-p、-m。

  1. *-a(Architecture):用来选择目标平台架构。可供选择的平台架构:IA32(32X86 CPU)、X64(64X86_64 CPU)、IPF(Itanium Processor Family)、ARMEBC(EFI Byte Code);默认的参数在Conf/target.txt中设置。
  2. *-p(Package/Platform):用来指定要编译的packageplatform。-p的参数是这个packageplatform的.dsc文件;默认的参数在Conf/target.txt中设置。
  3. *-m(Module):用来指定要编译模块。如果不指定-m选项,build将编译.dsc文件指定的所有模块。

Build命令的其他参数:(build -h  查看)

  1. --version show program's version number and exit
  2. -h, --help show this help message and exit显示帮助信息。
  3. -a TARGETARCH,--arch=TARGETARCH
  4. 选择目标平台架构,该选项被指定会取代Conf/target.txt中的TARGET_ARCH。
  5. -p PLATFORMFILE,--platform=PLATFORMFILE
  6. 通过指定.dsc文件指定要编译的package,该选项将会Conf/target.txt文件ACTIVE_PLATFORM。
  7. -m MODULEFILE, --module=MODULEFILE
  8. Build the module specified by the INF file name argument.
  9. -b BUILDTARGET, --buildtarget=BUILDTARGET
  10. 选择编译成DEBUG还是RELEASE。指定该选项后会取代target.txt文件中TARGET。
  11. -t TOOLCHAIN, --tagname=TOOLCHAIN
  12. 选择tools_def.txt中定义的编译工具,例如VS2012:-t vs2012
  13. -n THREADNUMBER 编译器使用的线程数量,指定后取代target.txt文件中MAX_CONCURRENT_THREAD_NUMBER指定的线程数量.
  14. Less than 2 will disable multi-thread builds.小于2就禁止多线程编译。
  15. -u, --skip-autogen Skip AutoGen step.跳过AutoGen这一步。
  16. -c, --case-insensitive Don't check case of file name.文件名不区分大小写。
  17. -w, --warning-as-error Treat warning in tools as error.将警告做错误处理。
  18. -j LOGFILE, --log=LOGFILE
  19. Put log in specified file as well as on console.将编译信息输出到文件。
  20. -s, --silent Make use of silent mode of (n)make.使用沉默模式执行makenmake
  21. -q, --quiet Disable all messages except FATAL ERRORS.编译过程中只显示严重错误信息。
  22. -d DEBUG, --debug=DEBUG Enable debug messages at specified level.在指定的级别启用调试消息。
  23. -D MACROS, --define=MACROS Macro: "Name [= Value]".定义宏。

3.2 The Process Of EDKII Build on Windows(Windows环境下EDKII项目源码的配置、编译流程)

3.2.1 Tool chain:BaseTools

配置Windows开发环境时,我们没有编译EDKII工具链,因为EDKII源码包中包含了Windows下的EDKII工具链可执行文件。

3.2.2 Setup build shell environment

  1. D:\> cd edk2
  2. D:\edk2> edksetup.bat

3.2.3 Modify Conf files

3.2.3.1 Set Build Target Information:配置target.txt文件

通过记事本修改配置目录Conf/下的target.txt files和tools_def.txt文件,来配置我们当前要编译的包和使用的相应工具链VS2013。(You will need to edit the Conf/tools_def.txt and Conf/target.txt files. These changes will enable the MdeModulePkg to be built using the VS2013.)

You will need to edit the Conf\target.txt file. First, change the ACTIVE_PLATFORM to the MdeModulePkg:

  1. D:\edk2> notepad Conf\target.txt

ACTIVE_PLATFORM should look like this in Conf\target.txt:

  1. ACTIVE_PLATFORM = MdeModulePkg/MdeModulePkg.dsc

Modify TOOL_CHAIN_TAG in target.txt for the toolchain installed on your system. There are many options, so review the tools_def.txt to find the appropriate toolchain for your system. Search for 'Supported Tool Chains' in tools_def.txt to see the valid options for TOOL_CHAIN_TAG.

  1. TOOL_CHAIN_TAG = VS2013x86

3.2.3.2 Check/Modify tools_def Information:检查tools_def.txt确保编译器路径正确

检查相应工具链VS2013和iasl路径是否正确。

  1. DEFINE VS2013x86_BIN = C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
  2. DEFINE VS2013x86_DLL = C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7 \IDE;DEF(VS2013x86_BIN)
  3. DEFINE VS2013x86_BINX64 = DEF(VS2013x86_BIN)\x86_amd64
  4. ......
  5. DEFINE WIN_ASL_BIN_DIR = C:\ASL
  6. DEFINE WIN_IASL_BIN = DEF(WIN_ASL_BIN_DIR)\iasl.exe
  7. DEFINE WIN_ASL_BIN = DEF(WIN_ASL_BIN_DIR)\asl.exe

3.2.4 Build Hello World! (and the rest of MdeModulePkg)

Now you should be able to simply run the build command to compile the MdeModulePkg.

  1. D:\edk2> build

As a tangible result of the build, you should have the HelloWorld UEFI application. If you have a UEFI system available to you which matches the processor architecture that you built, then this application should be able to run successfully under the shell.

  1. D:\edk2> dir /s Build\MdeModule\HelloWorld.efi

[注:dir /s   specified directory显示指定目录和所有子目录中的文件]

3.3 The Process Of EDKII Build on Linux(Linux环境下EDKII项目源码的配置、编译流程)

3.3.1 Build the EDK II BaseTools

在配置Windows开发环境时,我们没有编译EDKII工具链,因为EDKII源码包中包含了Windows下的EDKII工具链可执行文件。但是由于Linux发行版本众多,EDKII源码包中没有包含EDKII工具链可执行文件,需要我们用make、gcc等编译工具编译BaseTools生成Linux环境下可执行文件。

  1. linux@ubuntu:~/src/edk2$ make -C BaseTools

[注:-C:Change directory ;]

编译后,edk2/BaseTools/BinWrappers/PosixLike/目录下文件:

3.3.2 Setup build shell environment

  1. linux@ubuntu:~$ cd ~/src/edk2
  2. linux@ubuntu:~/src/edk2$ export EDK_TOOLS_PATH=$HOME/src/edk2/BaseTools
  3. linux@ubuntu:~/src/edk2$ . edksetup.sh BaseTools

注意这里环境变量加载命令“. edksetup.sh BaseTools”而非“./edksetup.sh BaseTools”

“. edksetup.sh BaseTools”等同于“source edksetup.sh BaseTools”。“source edksetup.sh BaseTools”会将脚本“edksetup.sh BaseTools”中的命令读入当前shell环境变量中,并在当前环境变量中执行,而“./edksetup.sh BaseTools”仅仅是在当前shell下执行脚本。

所以要是执行“./edksetup.sh BaseTools”命令会出现“No command 'build' found”错误提示。

正确加载shell环境变量:

运行脚本“./edksetup.sh BaseTools”,未加载环境变量情况:

3.3.3 Modify Conf Files

通过vi修改配置目录Conf/下的target.txt files和tools_def.txt文件,来配置我们当前要编译的包和使用的相应工具链Gcc4.6。(You will need to edit the Conf/tools_def.txt and Conf/target.txt files. These changes will enable the MdeModulePkg to be built using the GCC 4.6 compiler.)

3.3.3.1 Set Build Target Information:配置target.txt文件

For the Conf/target.txt file, find the following lines:(将Conf/target.txt文件中要编译的当前包、工具链变量)

  1. ACTIVE_PLATFORM = Nt32Pkg/Nt32Pkg.dsc
  2. TOOL_CHAIN_TAG = MYTOOLS

And change the corresponding lines to match these:(修改为如下:要编译的当前包MdeModulePkg,工具链是本博文Ubuntu12.0VMware中已安装的Gcc4.6)

  1. ACTIVE_PLATFORM = MdeModulePkg/MdeModulePkg.dsc
  2. TOOL_CHAIN_TAG = GCC46

注意:通过“gcc --version”命令可以查看当前环境下Gcc版本,gcc4.5.*这里工具链配置为GCC45,同理gcc4.6.*这里工具链配置为GCC46。(Note: The 'gcc --version' command can be used to find out your GCC version. Use theGCC45 toolchain for gcc 4.5.* and the GCC46 toolchain for gcc 4.6.*.)

Optionally, you may consider finding:(修改源码要生成的目标平台架构)

  1. TARGET_ARCH = IA32

...and changing it if your GCC 4.6 installation supports 64-bit builds. You can change it to either 'X64', or even 'IA32 X64' which will build both architectures.

3.3.3.2 Check/Modify  tools_def Information:检查/修改tools_def.txt确保编译器路径正确

检查相应工具链Gcc4.6和iasl路径是否正确。

  1. DEFINE GCC46_IA32_PREFIX = /usr/bin/
  2. DEFINE GCC46_X64_PREFIX = /usr/bin/

3.3.4 Build Hello World! (and the rest of MdeModulePkg)

现在可以运行简单的编译命令“build”来编译MdeModulePkg包。(Now you should be able to simply run the build command to compile the MdeModulePkg.)

  1. linux@ubuntu:~/src/edk2$ build

可以通过ls命令One result of the build is that you should have the HelloWorld UEFI application:

  1. linux@ubuntu: ls Build/MdeModule/DEBUG_*/*/HelloWorld.efi

EDKII Build Process:EDKII项目源码的配置、编译流程[三]的更多相关文章

  1. 安装ubuntu16虚拟机,下载android源码,配置编译环境

    Android 源码编译步骤: 我考虑了一下,目前电脑装了SSD,8G内存,使用虚拟机编译源码应该够用. 首先下载虚拟机软件,由于最近一直在使用virtualbox,感觉蛮不错了,下载地址: http ...

  2. Android 开源项目源码解析(第二期)

    Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...

  3. Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/ 项目结构 结构分析: Spring-boot-pr ...

  4. 对于学习apache软件基金会顶级项目源码的一点思路(转)

    ASF的开源项目,为软件行业贡献了太多好的产品和软件思维.学习ASF的项目源码能很大的提升自身的能力.程序运行在服务器上的流程:执行启动脚本(start.sh) -> 指向程序的主方法 -> ...

  5. MyBatis项目配置案例详解与Web下的增删改查实现[附项目源码]

    MyBatis项目案例 项目图示: 项目源码地址:https://github.com/JluTiger/mybatispro 1.项目功能 项目案例:后台管理系统用户数据维护平台 所有用户数据查询 ...

  6. 如何调试 Java 开源项目源码,记一种源码导入开发工具并调试的通用方法

    楔子 说起读开源项目源码,很多朋友觉得高大上.大佬牛逼,云云~ 挡在很多人面前的不是源码怎么读,而是不知道如何导入源码到开发工具以及如何调试源码. 本文将以 spring-cloud-gateway ...

  7. 安卓DJ113舞曲网应用客户端 项目源码(服务器+客户端)

    Android DJ113舞曲网app客户端 播放器源码  项目源码(服务器+客户端),这个项目整体有点类似天天动听的效果,非常漂亮的,支持第三方登录等功能,非常完整的一个音乐项目. 源码下载:htt ...

  8. JAVAWEB贵美网上商城完整项目源码(SSH2)

    JAVAWEB贵美网上商城完整项目源码(SSH2) 贵美网上商城原是北大青鸟的一个内部项目,项目采用 struts2+spring4+hibernate4+MySQL等技术实现,数据库连接池采用c3p ...

  9. Atitit. 查找linux 项目源码位置

    Atitit. 查找linux 项目源码位置 1. netstat   -anp |grep 801 1.1. 1.3 启动关闭nginx3 1.2. 找到nginx配置文件4 1.3. ./etc/ ...

随机推荐

  1. WebService学习------小实例开发(号码归属地查询)

    1.WebService简介: WebService是一种跨平台,跨语言的,可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.通过SOAP在Web上提 ...

  2. jquery实现上传图片本地预览效果

    html: <img id="pic" src="" ><input id="upload" name="fil ...

  3. 将Session放入Redis

    默认情况下,我们的PHP是以文件的形式保存Session数据,所以,每次读写会话信息,就需要去访问硬盘. 为了解决会话信息夸域名问题,即为了实现同一时刻只能一个地方登录,同时也解决读写会话信息必须访问 ...

  4. require和require_once的区别

    require 的使用方法如 require("./inc.php"); .通常放在 PHP 程式的最前面,PHP 程式在执行前,就会先读入 require 所指定引入的档案,使它 ...

  5. CDlinux制作U盘启动盘,打造自己的口袋系统

    工具: 1.8G或以上U盘一枚: 2.CDlinux0.9.7.1镜像文件,注意其他版本不一定能成功(传送门http://pan.baidu.com/s/1o7P6Gu2): 3.UltraISO或U ...

  6. RHEL7.2安装

    先在系统启动的时候按下Del键(有些系统是F2键)进入BIOS,设置从光盘启动. 系统只有2个USB口时,1个要接光驱,另外1个口不能同时接键盘和鼠标,可以接1个USB集线器,键盘和鼠标同时接入到集线 ...

  7. CAS基础和原子类

    基于CAS实现的AtomicInteger. AtomicLong. AtomicReference. AtomicBoolean也被称为乐观锁. CAS的语义是“我认为V的值应该为A,如果是,那么将 ...

  8. Jenkins持续集成-自动化部署脚本的实现

    要实现Jenkins端的持续集成,其实在CI服务配置端很容易,难点呢?就是如何实现自动化的部署.我的脚本设计就是为了解决以下难题: 难点一.如何使得自动化部署脚本更通用 我用的脚本,依赖依赖一个配置文 ...

  9. CocosCreator游戏开发---菜鸟学习之路(一)

    PS(废话): 辞职后在家好久好久了,久到经济不允许了,接着就准备再次出去找工作了,然而工作哪有那么好找,特别是像我这种菜鸟.而且我还准备转行,准备去做游戏,技能等级接近于0,那工作就更难找了.既然如 ...

  10. 备忘录之 —— .bashrc(IC工具篇)

    好久没有使用这些IC工具了,装在自己的虚拟机中的Linux系统里面,现在想要卸载掉,想起之前自己辛辛苦苦的折腾这些工具配置,如果直接删除,感觉未免有点对不起自己的劳动成果,或许以后再也用不到了,就当是 ...