Kostr/UEFI-Lessons

In lesson2 why since there is UefiLessonsPkg why we have include MdePkg/MdePkg.dec in SimplestApp.inf?

joyoseller20100802 opened this issue · 4 comments

In lesson2 why since there is UefiLessonsPkg why we have include MdePkg/MdePkg.dec in SimplestApp.inf?
Kostr commented

Generally if we use a library or PCD from another package, we would need to include declaration (DEC) file for that package.

Why is that? Let's comment the Packages section in our UefiLessonsPkg/SimplestApp/SimplestApp.inf file:

#[Packages]
#  MdePkg/MdePkg.dec

In this case the build would fail with this error:

edk2/Build/UefiLessonsPkg/RELEASE_GCC5/X64/UefiLessonsPkg/SimplestApp/SimplestApp/DEBUG/AutoGen.h:16:10: fatal error: Uefi.h: No such file or directory
   16 | #include <Uefi.h>
      |          ^~~~~~~~

Here the build system complains that it can't find the header file Uefi.h. If you'll search for this file in the edk2 repo, you will find it in the MdePkg/Include folder (https://github.com/tianocore/edk2/blob/master/MdePkg/Include/Uefi.h)

But as you see the build system couldn't find it in our case.

How does including MdePkg/MdePkg.dec fixes the issue? If you'll look at the https://github.com/tianocore/edk2/blob/master/MdePkg/MdePkg.dec you'll see that it has these statements:

...
[Includes]
  Include
...

This adds another folder (MdePkg/Include) folder to search for include files. And this is what we need to make our build system happy.

Just in case here is a documentation for the INF file [Packages] section:
https://edk2-docs.gitbook.io/edk-ii-inf-specification/3_edk_ii_inf_file_format/37_-packages-_sections

My thought about it is that the uefi add package(dsc dec) and class(inf) Based on c (.c file and .h file) ,a class (a inf) have many c file and their reference information of c file of other package and corresponding class can get from its dsc file.but it has it own MdePkg/MdePkg.dec to reflect the reference information,I think it's more intuitive.

In lesson 20 i thought it again ,inf can not use the information in dsc because dsc `s component include inf w if inf w use the information in its dsc can lead to cycle use ,so inf can not use the information in dsc in theory.

Of cause this is only on case ,other cases such as lesson 2 inf can use the information of its dsc .