Edk2在设计是按照模块来进行的,其中模块包含有很多种类型,比如最常见的三种:应用程序模块,驱动模块,库模块。每个模块都包含了一个工程元数据文件(.inf)和源文件。.inf文件是用来辅助编译的,功能类似于Makefile;而源文件就是功能代码的实现了。本文主要用来介绍.inf的编写规则。
类似于前文介绍的.dsc和.dec文件,工程元数据文件(.inf)也是由一系列块组成,它们有一些是必需块: [Defines],[Sources], [Packages], [LibraryClasses],和一些可选块:[Protocols],[Guids],[BuildOptions], [Pcd], [FixedPcd], [PcdEx], [Protocols]。
下面将挑选一些常用的块进行详细讲解:
[Defines]
此块用来定义模块的属性和其他变量,块内定义的变量可被本文件中的其他块引用。[Defines] INF_VERSION = 0x00010006 BASE_NAME = Hello FILE_GUID = a912f198-7f0e-4803-b908-b757b806ec83 MODULE_TYPE = UEFI_APPLICATION VERSION_STRING = 0.1 ENTRY_POINT = ShellCEntryLib
INF_VERSION,INF标准的版本号,build会根据此版本号来解析本文件,通常将此版本好设置为 0x00010006即可;BASE_NAME是模块名字; FILE_GUID每个工程必须要有一个8-4-4-4-12类型的Guid,用于生成固件;MODULE_TYPE为模块类型,UEFI_APPLICATION表示是APP类型。VERSION_STRING表示该模块的版本号; ENTRY_POINT定义的是模块入口函数,比如这里的ShellCEntryLib。
[Sources]
此块用于列出本模块所有的源文件和资源文件,可以通过后跟平台名称的方式来区分不同平台。
示例:[Sources] Hello.c [Sources.IA32] CpuIA32.c [Sources.X64] CpuX64.c
[Packages]
列出本模块所引用的所有包的声明文件(.dec)。[Packages] MdePkg/MdePkg.dec ShellPkg/ShellPkg.dec
[LibraryClasses]
累出本模块所引用的库,只需要库名称。[LibraryClasses] UefiLib ShellCEntryLib
[Protocols]
列出本模块所使用的Protocol,其实是Protocol对应的GUID。[Protocols] gEfiDhcp4ServiceBindingProtocolGuid # PROTOCOL ALWAYS_CONSUMED gEfiDhcp4ProtocolGuid # PROTOCOL ALWAYS_CONSUMED
[Guids]
列出本模块所使用的Guids。方法和上面[Protocols]一样。[BuildOptions]
定义该模块的编译选项,格式如下:[BuildOptions.$(Arch).$(CodeBase)] [编译器]:[$(Target)]_[Tool]_[$(Arch)]_[CC|DLINK]_FLAGS=