이번에는 앞서 만들었던 애플리케이션을 다른 패키지에 포함하여 빌드하자.
먼저 OvmfPkg/OvmfPkgX64.dsc
에서 SimplestApp.inf
를 제외시킨다.
$ vi OvmfPkg/OvmfPkgX64.dsc
-----
[Components]
- SimplestApp/SimplestApp.inf
OvmfPkg/ResetVector/ResetVector.inf
이후 임의의 패키지를 생성하기 위해 폴더 및 구성 파일을 생성한다.
$ mkdir UefiLessonsPkg
$ mv SimplestApp UefiLessonsPkg/SimplestApp
$ vi UefiLessonsPkg/UefiLessonsPkg.dsc
-----
[Defines]
DSC_SPECIFICATION = 0x0001001C
PLATFORM_GUID = 3db7270f-ffac-4139-90a4-0ae68f3f8167
PLATFORM_VERSION = 0.01
PLATFORM_NAME = UefiLessonsPkg
SKUID_IDENTIFIER = DEFAULT
SUPPORTED_ARCHITECTURES = X64
BUILD_TARGETS = RELEASE
[Components]
UefiLessonsPkg/SimplestApp/SimplestApp.inf
위 패키지 구성 파일의 세부 정보는 아래 UEFI 스펙 링크를 참조하자.
https://edk2-docs.gitbook.io/edk-ii-dsc-specification/
파일 생성 이후 플랫폼 정보를 다음과 같이 변경하고 빌드를 진행하자.
$ . edksetup.sh
$ build --platform=UefiLessonsPkg/UefiLessonsPkg.dsc \
--module=UefiLessonsPkg/SimplestApp/SimplestApp.inf \
--arch=X64 \
--buildtarget=RELEASE \
--tagname=GCC5
그럼 다음과 같은 오류가 발생하는 것이 일반적이다.
error 4000: Instance of library class [UefiBootServicesTableLib] is not found
LibraryClass는 여러 인스턴스 및 라이브러리를 가질 수 있기 때문에 모두 지정해줄 필요가 있다.
따라서 다음과 같은 명령어를 이용하여 포함되어야 할 구성 정보들을 포함해주어야 한다.
$ grep UefiApplicationEntryPoint -r ./ --include=*.inf | grep LIBRARY_CLASS
필요 라이브러리를 모두 포함한 *.dsc
파일 정보는 아래와 같다.
$ vi UefiLessonsPkg/UefiLessonsPkg.dsc\
-----
[Defines]
PLATFORM_NAME = UefiLessonsPkg
PLATFORM_GUID = 3db7270f-ffac-4139-90a4-0ae68f3f8167
PLATFORM_VERSION = 0.01
DSC_SPECIFICATION = 0x00010006
OUTPUT_DIRECTORY = Build/UefiLessonsPkg
SUPPORTED_ARCHITECTURES = X64
BUILD_TARGETS = RELEASE
SKUID_IDENTIFIER = DEFAULT
[LibraryClasses]
UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
DebugLib|MdePkg/Library/UefiDebugLibConOut/UefiDebugLibConOut.inf
BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
RegisterFilterLib|MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.inf
PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf
[Components]
UefiLessonsPkg/SimplestApp/SimplestApp.inf
이후 빌드 과정을 통하여 다른 패키지에 포함시킨 애플리케이션이 정상 동작하는지 확인한다.
$ cp Build/UefiLessonsPkg/RELEASE_GCC5/X64/SimplestApp.efi ~/UEFI_disk/
$ qemu-system-x86_64 -drive if=pflash,format=raw,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF.fd \
-drive format=raw,file=fat:rw:~/UEFI_disk \
-nographic \
-net none