public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH V2] BaseTools:Add [packages] section in dsc file
@ 2019-11-14  1:27 Fan, ZhijuX
  2019-11-14  2:59 ` Bob Feng
  2019-11-15  1:55 ` Liming Gao
  0 siblings, 2 replies; 5+ messages in thread
From: Fan, ZhijuX @ 2019-11-14  1:27 UTC (permalink / raw)
  To: devel@edk2.groups.io; +Cc: Gao, Liming, Feng, Bob C

[-- Attachment #1: Type: text/plain, Size: 13472 bytes --]

BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=2270

Currently a PCD (e.g. FeaturePCD) cannot be used in a conditional
statement in a DSC/FDF file without a module in the build referencing
the PCD package DEC file.

An example implementation that to support this is to allow a [Packages]
section in the DSC file to list additional package dependencies for PCD
references in the package DSC/FDF files.

this patch is going to  add the ability to have the [packages] section
defined in the DSC file

Cc: Liming Gao <liming.gao@intel.com>
Cc: Bob Feng <bob.c.feng@intel.com>
Signed-off-by: Zhiju.Fan <zhijux.fan@intel.com>
---
 BaseTools/Source/Python/AutoGen/ModuleAutoGen.py   | 29 +++++++++++++++++-----
 BaseTools/Source/Python/AutoGen/PlatformAutoGen.py |  1 +
 .../Source/Python/AutoGen/WorkspaceAutoGen.py      |  1 +
 BaseTools/Source/Python/Common/DataType.py         |  1 +
 BaseTools/Source/Python/Workspace/DscBuildData.py  | 23 ++++++++++++++++-
 .../Source/Python/Workspace/MetaFileParser.py      | 14 +++++++++++
 .../Source/Python/Workspace/WorkspaceCommon.py     |  2 ++
 .../Source/Python/Workspace/WorkspaceDatabase.py   |  4 +++
 8 files changed, 68 insertions(+), 7 deletions(-)

diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
index f0812b6887..e6d6c43810 100755
--- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
+++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
@@ -462,14 +462,31 @@ class ModuleAutoGen(AutoGen):
     def BuildCommand(self):
         return self.PlatformInfo.BuildCommand
 
-    ## Get object list of all packages the module and its dependent libraries belong to
+    ## Get Module package and Platform package
+    #
+    #   @retval list The list of package object
+    #
+    @cached_property
+    def PackageList(self):
+        PkagList = []
+        if self.Module.Packages:
+            PkagList.extend(self.Module.Packages)
+        Platform = self.BuildDatabase[self.PlatformInfo.MetaFile, self.Arch, self.BuildTarget, self.ToolChain]
+        for Package in Platform.Packages:
+            if Package in PkagList:
+                continue
+            PkagList.append(Package)
+        return PkagList
+
+    ## Get object list of all packages the module and its dependent libraries belong to and the Platform depends on
     #
     #   @retval     list    The list of package object
     #
     @cached_property
     def DerivedPackageList(self):
         PackageList = []
-        for M in [self.Module] + self.DependentLibraryList:
+        PackageList.extend(self.PackageList)
+        for M in self.DependentLibraryList:
             for Package in M.Packages:
                 if Package in PackageList:
                     continue
@@ -938,13 +955,13 @@ class ModuleAutoGen(AutoGen):
         self.Targets
         return self._FileTypes
 
-    ## Get the list of package object the module depends on
+    ## Get the list of package object the module depends on and the Platform depends on
     #
     #   @retval     list    The package object list
     #
     @cached_property
     def DependentPackageList(self):
-        return self.Module.Packages
+        return self.PackageList
 
     ## Return the list of auto-generated code file
     #
@@ -1101,7 +1118,7 @@ class ModuleAutoGen(AutoGen):
         RetVal.append(self.MetaFile.Dir)
         RetVal.append(self.DebugDir)
 
-        for Package in self.Module.Packages:
+        for Package in self.PackageList:
             PackageDir = mws.join(self.WorkspaceDir, Package.MetaFile.Dir)
             if PackageDir not in RetVal:
                 RetVal.append(PackageDir)
@@ -1125,7 +1142,7 @@ class ModuleAutoGen(AutoGen):
     @cached_property
     def PackageIncludePathList(self):
         IncludesList = []
-        for Package in self.Module.Packages:
+        for Package in self.PackageList:
             PackageDir = mws.join(self.WorkspaceDir, Package.MetaFile.Dir)
             IncludesList = Package.Includes
             if Package._PrivateIncludes:
diff --git a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
index debeb46f58..4c3cdf82d5 100644
--- a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
+++ b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
@@ -975,6 +975,7 @@ class PlatformAutoGen(AutoGen):
                 continue
             ModuleData = self.BuildDatabase[ModuleFile, self.Arch, self.BuildTarget, self.ToolChain]
             RetVal.update(ModuleData.Packages)
+        RetVal.update(self.Platform.Packages)
         return list(RetVal)
 
     @cached_property
diff --git a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py b/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
index 9d8040905e..fde48b4b27 100644
--- a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
+++ b/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
@@ -420,6 +420,7 @@ class WorkspaceAutoGen(AutoGen):
                     continue
                 ModuleData = self.BuildDatabase[ModuleFile, Arch, self.BuildTarget, self.ToolChain]
                 PkgSet.update(ModuleData.Packages)
+            PkgSet.update(Platform.Packages)
             Pkgs[Arch] = list(PkgSet)
         return Pkgs
 
diff --git a/BaseTools/Source/Python/Common/DataType.py b/BaseTools/Source/Python/Common/DataType.py
index 5d49afb0a9..8d80b41089 100644
--- a/BaseTools/Source/Python/Common/DataType.py
+++ b/BaseTools/Source/Python/Common/DataType.py
@@ -519,6 +519,7 @@ SECTIONS_HAVE_ITEM_AFTER_ARCH_SET = {TAB_LIBRARY_CLASSES.upper(), TAB_DEPEX.uppe
                                  PCDS_DYNAMICEX_VPD.upper(),
                                  PCDS_DYNAMICEX_HII.upper(),
                                  TAB_BUILD_OPTIONS.upper(),
+                                 TAB_PACKAGES.upper(),
                                  TAB_INCLUDES.upper()}
 
 #
diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py
index 9192077f90..03a15bbf3e 100644
--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
@@ -719,6 +719,24 @@ class DscBuildData(PlatformBuildClassObject):
                 self._RawData.DisableOverrideComponent(Components[(file_guid_str,str(ModuleFile))])
             Components[(file_guid_str,str(ModuleFile))] = ModuleId
         self._RawData._PostProcessed = False
+
+    ## Retrieve packages this Platform depends on
+    @cached_property
+    def Packages(self):
+        RetVal = set()
+        RecordList = self._RawData[MODEL_META_DATA_PACKAGE, self._Arch]
+        Macros = self._Macros
+        for Record in RecordList:
+            File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)
+            # check the file validation
+            ErrorCode, ErrorInfo = File.Validate('.dec')
+            if ErrorCode != 0:
+                LineNo = Record[-1]
+                EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)
+            # parse this package now. we need it to get protocol/ppi/guid value
+            RetVal.add(self._Bdb[File, self._Arch, self._Target, self._Toolchain])
+        return RetVal
+
     ## Retrieve [Components] section information
     @property
     def Modules(self):
@@ -896,7 +914,8 @@ class DscBuildData(PlatformBuildClassObject):
                     continue
                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]
                 PkgSet.update(ModuleData.Packages)
-
+            if self.Packages:
+                PkgSet.update(self.Packages)
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)
             self._GuidDict.update(GlobalData.gPlatformPcds)
 
@@ -3320,6 +3339,8 @@ class DscBuildData(PlatformBuildClassObject):
                     continue
                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]
                 PkgSet.update(ModuleData.Packages)
+            if self.Packages:
+                PkgSet.update(self.Packages)
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)
             self._GuidDict.update(GlobalData.gPlatformPcds)
         return self._DecPcds
diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTools/Source/Python/Workspace/MetaFileParser.py
index 806fc322c5..3f96ce0564 100644
--- a/BaseTools/Source/Python/Workspace/MetaFileParser.py
+++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py
@@ -160,6 +160,7 @@ class MetaFileParser(object):
         self.MetaFile = FilePath
         self._FileDir = self.MetaFile.Dir
         self._Defines = {}
+        self._Packages = []
         self._FileLocalMacros = {}
         self._SectionsMacroDict = defaultdict(dict)
 
@@ -351,6 +352,13 @@ class MetaFileParser(object):
         # If the section information is needed later, it should be stored in database
         self._ValueList[0] = self._SectionName
 
+    ## [packages] section parser
+    @ParseMacro
+    def _PackageParser(self):
+        self._CurrentLine = CleanString(self._CurrentLine)
+        self._Packages.append(self._CurrentLine)
+        self._ValueList[0] = self._CurrentLine
+
     ## [defines] section parser
     @ParseMacro
     def _DefineParser(self):
@@ -848,6 +856,7 @@ class DscParser(MetaFileParser):
         TAB_LIBRARIES.upper()                       :   MODEL_EFI_LIBRARY_INSTANCE,
         TAB_LIBRARY_CLASSES.upper()                 :   MODEL_EFI_LIBRARY_CLASS,
         TAB_BUILD_OPTIONS.upper()                   :   MODEL_META_DATA_BUILD_OPTION,
+        TAB_PACKAGES.upper()                        :   MODEL_META_DATA_PACKAGE,
         TAB_PCDS_FIXED_AT_BUILD_NULL.upper()        :   MODEL_PCD_FIXED_AT_BUILD,
         TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper()   :   MODEL_PCD_PATCHABLE_IN_MODULE,
         TAB_PCDS_FEATURE_FLAG_NULL.upper()          :   MODEL_PCD_FEATURE_FLAG,
@@ -1339,6 +1348,7 @@ class DscParser(MetaFileParser):
             MODEL_META_DATA_DEFINE                          :   self.__ProcessDefine,
             MODEL_META_DATA_GLOBAL_DEFINE                   :   self.__ProcessDefine,
             MODEL_META_DATA_INCLUDE                         :   self.__ProcessDirective,
+            MODEL_META_DATA_PACKAGE                         :   self.__ProcessPackages,
             MODEL_META_DATA_CONDITIONAL_STATEMENT_IF        :   self.__ProcessDirective,
             MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE      :   self.__ProcessDirective,
             MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF     :   self.__ProcessDirective,
@@ -1642,6 +1652,9 @@ class DscParser(MetaFileParser):
                 self._ValueList = None
                 self._ContentIndex -= 1
 
+    def __ProcessPackages(self):
+        self._ValueList[0] = ReplaceMacro(self._ValueList[0], self._Macros)
+
     def __ProcessSkuId(self):
         self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True)
                            for Value in self._ValueList]
@@ -1720,6 +1733,7 @@ class DscParser(MetaFileParser):
         MODEL_META_DATA_COMPONENT                       :   _ComponentParser,
         MODEL_META_DATA_BUILD_OPTION                    :   _BuildOptionParser,
         MODEL_UNKNOWN                                   :   MetaFileParser._Skip,
+        MODEL_META_DATA_PACKAGE                         :   MetaFileParser._PackageParser,
         MODEL_META_DATA_USER_EXTENSION                  :   MetaFileParser._SkipUserExtension,
         MODEL_META_DATA_SECTION_HEADER                  :   MetaFileParser._SectionHeaderParser,
         MODEL_META_DATA_SUBSECTION_HEADER               :   _SubsectionHeaderParser,
diff --git a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
index 0b11ec2d59..913e710fd9 100644
--- a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
+++ b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
@@ -37,6 +37,8 @@ class OrderedListDict(OrderedDict):
 #
 def GetPackageList(Platform, BuildDatabase, Arch, Target, Toolchain):
     PkgSet = set()
+    if Platform.Packages:
+        PkgSet.update(Platform.Packages)
     for ModuleFile in Platform.Modules:
         Data = BuildDatabase[ModuleFile, Arch, Target, Toolchain]
         PkgSet.update(Data.Packages)
diff --git a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
index ab7b4506c1..9420eaa608 100644
--- a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
+++ b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
@@ -186,6 +186,10 @@ class WorkspaceDatabase(object):
             for Package in LibObj.Packages:
                 if Package not in PackageList:
                     PackageList.append(Package)
+        for Package in Pa.Packages:
+            if Package in PackageList:
+                continue
+            PackageList.append(Package)
 
         return PackageList
 
-- 
2.14.1.windows.1


[-- Attachment #2: winmail.dat --]
[-- Type: application/ms-tnef, Size: 9232 bytes --]

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH V2] BaseTools:Add [packages] section in dsc file
  2019-11-14  1:27 [PATCH V2] BaseTools:Add [packages] section in dsc file Fan, ZhijuX
@ 2019-11-14  2:59 ` Bob Feng
  2019-11-15  1:55 ` Liming Gao
  1 sibling, 0 replies; 5+ messages in thread
From: Bob Feng @ 2019-11-14  2:59 UTC (permalink / raw)
  To: Fan, ZhijuX, devel@edk2.groups.io; +Cc: Gao, Liming

This patch looks good.

Reviewed-by: Bob Feng <bob.c.feng@intel.com>

-----Original Message-----
From: Fan, ZhijuX 
Sent: Thursday, November 14, 2019 9:28 AM
To: devel@edk2.groups.io
Cc: Gao, Liming <liming.gao@intel.com>; Feng, Bob C <bob.c.feng@intel.com>
Subject: [PATCH V2] BaseTools:Add [packages] section in dsc file

BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=2270

Currently a PCD (e.g. FeaturePCD) cannot be used in a conditional statement in a DSC/FDF file without a module in the build referencing the PCD package DEC file.

An example implementation that to support this is to allow a [Packages] section in the DSC file to list additional package dependencies for PCD references in the package DSC/FDF files.

this patch is going to  add the ability to have the [packages] section defined in the DSC file

Cc: Liming Gao <liming.gao@intel.com>
Cc: Bob Feng <bob.c.feng@intel.com>
Signed-off-by: Zhiju.Fan <zhijux.fan@intel.com>
---
 BaseTools/Source/Python/AutoGen/ModuleAutoGen.py   | 29 +++++++++++++++++-----
 BaseTools/Source/Python/AutoGen/PlatformAutoGen.py |  1 +
 .../Source/Python/AutoGen/WorkspaceAutoGen.py      |  1 +
 BaseTools/Source/Python/Common/DataType.py         |  1 +
 BaseTools/Source/Python/Workspace/DscBuildData.py  | 23 ++++++++++++++++-
 .../Source/Python/Workspace/MetaFileParser.py      | 14 +++++++++++
 .../Source/Python/Workspace/WorkspaceCommon.py     |  2 ++
 .../Source/Python/Workspace/WorkspaceDatabase.py   |  4 +++
 8 files changed, 68 insertions(+), 7 deletions(-)

diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
index f0812b6887..e6d6c43810 100755
--- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
+++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
@@ -462,14 +462,31 @@ class ModuleAutoGen(AutoGen):
     def BuildCommand(self):
         return self.PlatformInfo.BuildCommand
 
-    ## Get object list of all packages the module and its dependent libraries belong to
+    ## Get Module package and Platform package
+    #
+    #   @retval list The list of package object
+    #
+    @cached_property
+    def PackageList(self):
+        PkagList = []
+        if self.Module.Packages:
+            PkagList.extend(self.Module.Packages)
+        Platform = self.BuildDatabase[self.PlatformInfo.MetaFile, self.Arch, self.BuildTarget, self.ToolChain]
+        for Package in Platform.Packages:
+            if Package in PkagList:
+                continue
+            PkagList.append(Package)
+        return PkagList
+
+    ## Get object list of all packages the module and its dependent 
+ libraries belong to and the Platform depends on
     #
     #   @retval     list    The list of package object
     #
     @cached_property
     def DerivedPackageList(self):
         PackageList = []
-        for M in [self.Module] + self.DependentLibraryList:
+        PackageList.extend(self.PackageList)
+        for M in self.DependentLibraryList:
             for Package in M.Packages:
                 if Package in PackageList:
                     continue
@@ -938,13 +955,13 @@ class ModuleAutoGen(AutoGen):
         self.Targets
         return self._FileTypes
 
-    ## Get the list of package object the module depends on
+    ## Get the list of package object the module depends on and the 
+ Platform depends on
     #
     #   @retval     list    The package object list
     #
     @cached_property
     def DependentPackageList(self):
-        return self.Module.Packages
+        return self.PackageList
 
     ## Return the list of auto-generated code file
     #
@@ -1101,7 +1118,7 @@ class ModuleAutoGen(AutoGen):
         RetVal.append(self.MetaFile.Dir)
         RetVal.append(self.DebugDir)
 
-        for Package in self.Module.Packages:
+        for Package in self.PackageList:
             PackageDir = mws.join(self.WorkspaceDir, Package.MetaFile.Dir)
             if PackageDir not in RetVal:
                 RetVal.append(PackageDir) @@ -1125,7 +1142,7 @@ class ModuleAutoGen(AutoGen):
     @cached_property
     def PackageIncludePathList(self):
         IncludesList = []
-        for Package in self.Module.Packages:
+        for Package in self.PackageList:
             PackageDir = mws.join(self.WorkspaceDir, Package.MetaFile.Dir)
             IncludesList = Package.Includes
             if Package._PrivateIncludes:
diff --git a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
index debeb46f58..4c3cdf82d5 100644
--- a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
+++ b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
@@ -975,6 +975,7 @@ class PlatformAutoGen(AutoGen):
                 continue
             ModuleData = self.BuildDatabase[ModuleFile, self.Arch, self.BuildTarget, self.ToolChain]
             RetVal.update(ModuleData.Packages)
+        RetVal.update(self.Platform.Packages)
         return list(RetVal)
 
     @cached_property
diff --git a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py b/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
index 9d8040905e..fde48b4b27 100644
--- a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
+++ b/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
@@ -420,6 +420,7 @@ class WorkspaceAutoGen(AutoGen):
                     continue
                 ModuleData = self.BuildDatabase[ModuleFile, Arch, self.BuildTarget, self.ToolChain]
                 PkgSet.update(ModuleData.Packages)
+            PkgSet.update(Platform.Packages)
             Pkgs[Arch] = list(PkgSet)
         return Pkgs
 
diff --git a/BaseTools/Source/Python/Common/DataType.py b/BaseTools/Source/Python/Common/DataType.py
index 5d49afb0a9..8d80b41089 100644
--- a/BaseTools/Source/Python/Common/DataType.py
+++ b/BaseTools/Source/Python/Common/DataType.py
@@ -519,6 +519,7 @@ SECTIONS_HAVE_ITEM_AFTER_ARCH_SET = {TAB_LIBRARY_CLASSES.upper(), TAB_DEPEX.uppe
                                  PCDS_DYNAMICEX_VPD.upper(),
                                  PCDS_DYNAMICEX_HII.upper(),
                                  TAB_BUILD_OPTIONS.upper(),
+                                 TAB_PACKAGES.upper(),
                                  TAB_INCLUDES.upper()}
 
 #
diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py
index 9192077f90..03a15bbf3e 100644
--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
@@ -719,6 +719,24 @@ class DscBuildData(PlatformBuildClassObject):
                 self._RawData.DisableOverrideComponent(Components[(file_guid_str,str(ModuleFile))])
             Components[(file_guid_str,str(ModuleFile))] = ModuleId
         self._RawData._PostProcessed = False
+
+    ## Retrieve packages this Platform depends on
+    @cached_property
+    def Packages(self):
+        RetVal = set()
+        RecordList = self._RawData[MODEL_META_DATA_PACKAGE, self._Arch]
+        Macros = self._Macros
+        for Record in RecordList:
+            File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)
+            # check the file validation
+            ErrorCode, ErrorInfo = File.Validate('.dec')
+            if ErrorCode != 0:
+                LineNo = Record[-1]
+                EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)
+            # parse this package now. we need it to get protocol/ppi/guid value
+            RetVal.add(self._Bdb[File, self._Arch, self._Target, self._Toolchain])
+        return RetVal
+
     ## Retrieve [Components] section information
     @property
     def Modules(self):
@@ -896,7 +914,8 @@ class DscBuildData(PlatformBuildClassObject):
                     continue
                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]
                 PkgSet.update(ModuleData.Packages)
-
+            if self.Packages:
+                PkgSet.update(self.Packages)
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)
             self._GuidDict.update(GlobalData.gPlatformPcds)
 
@@ -3320,6 +3339,8 @@ class DscBuildData(PlatformBuildClassObject):
                     continue
                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]
                 PkgSet.update(ModuleData.Packages)
+            if self.Packages:
+                PkgSet.update(self.Packages)
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)
             self._GuidDict.update(GlobalData.gPlatformPcds)
         return self._DecPcds
diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTools/Source/Python/Workspace/MetaFileParser.py
index 806fc322c5..3f96ce0564 100644
--- a/BaseTools/Source/Python/Workspace/MetaFileParser.py
+++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py
@@ -160,6 +160,7 @@ class MetaFileParser(object):
         self.MetaFile = FilePath
         self._FileDir = self.MetaFile.Dir
         self._Defines = {}
+        self._Packages = []
         self._FileLocalMacros = {}
         self._SectionsMacroDict = defaultdict(dict)
 
@@ -351,6 +352,13 @@ class MetaFileParser(object):
         # If the section information is needed later, it should be stored in database
         self._ValueList[0] = self._SectionName
 
+    ## [packages] section parser
+    @ParseMacro
+    def _PackageParser(self):
+        self._CurrentLine = CleanString(self._CurrentLine)
+        self._Packages.append(self._CurrentLine)
+        self._ValueList[0] = self._CurrentLine
+
     ## [defines] section parser
     @ParseMacro
     def _DefineParser(self):
@@ -848,6 +856,7 @@ class DscParser(MetaFileParser):
         TAB_LIBRARIES.upper()                       :   MODEL_EFI_LIBRARY_INSTANCE,
         TAB_LIBRARY_CLASSES.upper()                 :   MODEL_EFI_LIBRARY_CLASS,
         TAB_BUILD_OPTIONS.upper()                   :   MODEL_META_DATA_BUILD_OPTION,
+        TAB_PACKAGES.upper()                        :   MODEL_META_DATA_PACKAGE,
         TAB_PCDS_FIXED_AT_BUILD_NULL.upper()        :   MODEL_PCD_FIXED_AT_BUILD,
         TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper()   :   MODEL_PCD_PATCHABLE_IN_MODULE,
         TAB_PCDS_FEATURE_FLAG_NULL.upper()          :   MODEL_PCD_FEATURE_FLAG,
@@ -1339,6 +1348,7 @@ class DscParser(MetaFileParser):
             MODEL_META_DATA_DEFINE                          :   self.__ProcessDefine,
             MODEL_META_DATA_GLOBAL_DEFINE                   :   self.__ProcessDefine,
             MODEL_META_DATA_INCLUDE                         :   self.__ProcessDirective,
+            MODEL_META_DATA_PACKAGE                         :   self.__ProcessPackages,
             MODEL_META_DATA_CONDITIONAL_STATEMENT_IF        :   self.__ProcessDirective,
             MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE      :   self.__ProcessDirective,
             MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF     :   self.__ProcessDirective,
@@ -1642,6 +1652,9 @@ class DscParser(MetaFileParser):
                 self._ValueList = None
                 self._ContentIndex -= 1
 
+    def __ProcessPackages(self):
+        self._ValueList[0] = ReplaceMacro(self._ValueList[0], 
+ self._Macros)
+
     def __ProcessSkuId(self):
         self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True)
                            for Value in self._ValueList] @@ -1720,6 +1733,7 @@ class DscParser(MetaFileParser):
         MODEL_META_DATA_COMPONENT                       :   _ComponentParser,
         MODEL_META_DATA_BUILD_OPTION                    :   _BuildOptionParser,
         MODEL_UNKNOWN                                   :   MetaFileParser._Skip,
+        MODEL_META_DATA_PACKAGE                         :   MetaFileParser._PackageParser,
         MODEL_META_DATA_USER_EXTENSION                  :   MetaFileParser._SkipUserExtension,
         MODEL_META_DATA_SECTION_HEADER                  :   MetaFileParser._SectionHeaderParser,
         MODEL_META_DATA_SUBSECTION_HEADER               :   _SubsectionHeaderParser,
diff --git a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
index 0b11ec2d59..913e710fd9 100644
--- a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
+++ b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
@@ -37,6 +37,8 @@ class OrderedListDict(OrderedDict):
 #
 def GetPackageList(Platform, BuildDatabase, Arch, Target, Toolchain):
     PkgSet = set()
+    if Platform.Packages:
+        PkgSet.update(Platform.Packages)
     for ModuleFile in Platform.Modules:
         Data = BuildDatabase[ModuleFile, Arch, Target, Toolchain]
         PkgSet.update(Data.Packages)
diff --git a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
index ab7b4506c1..9420eaa608 100644
--- a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
+++ b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
@@ -186,6 +186,10 @@ class WorkspaceDatabase(object):
             for Package in LibObj.Packages:
                 if Package not in PackageList:
                     PackageList.append(Package)
+        for Package in Pa.Packages:
+            if Package in PackageList:
+                continue
+            PackageList.append(Package)
 
         return PackageList
 
--
2.14.1.windows.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH V2] BaseTools:Add [packages] section in dsc file
  2019-11-14  1:27 [PATCH V2] BaseTools:Add [packages] section in dsc file Fan, ZhijuX
  2019-11-14  2:59 ` Bob Feng
@ 2019-11-15  1:55 ` Liming Gao
  2019-11-20  2:45   ` Fan, ZhijuX
  1 sibling, 1 reply; 5+ messages in thread
From: Liming Gao @ 2019-11-15  1:55 UTC (permalink / raw)
  To: Fan, ZhijuX, devel@edk2.groups.io; +Cc: Feng, Bob C

Zhiju:
  Can you show what test are done for this new support?

Thanks
Liming
>-----Original Message-----
>From: Fan, ZhijuX
>Sent: Thursday, November 14, 2019 9:28 AM
>To: devel@edk2.groups.io
>Cc: Gao, Liming <liming.gao@intel.com>; Feng, Bob C <bob.c.feng@intel.com>
>Subject: [PATCH V2] BaseTools:Add [packages] section in dsc file
>
>BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=2270
>
>Currently a PCD (e.g. FeaturePCD) cannot be used in a conditional
>statement in a DSC/FDF file without a module in the build referencing
>the PCD package DEC file.
>
>An example implementation that to support this is to allow a [Packages]
>section in the DSC file to list additional package dependencies for PCD
>references in the package DSC/FDF files.
>
>this patch is going to  add the ability to have the [packages] section
>defined in the DSC file
>
>Cc: Liming Gao <liming.gao@intel.com>
>Cc: Bob Feng <bob.c.feng@intel.com>
>Signed-off-by: Zhiju.Fan <zhijux.fan@intel.com>
>---
> BaseTools/Source/Python/AutoGen/ModuleAutoGen.py   | 29
>+++++++++++++++++-----
> BaseTools/Source/Python/AutoGen/PlatformAutoGen.py |  1 +
> .../Source/Python/AutoGen/WorkspaceAutoGen.py      |  1 +
> BaseTools/Source/Python/Common/DataType.py         |  1 +
> BaseTools/Source/Python/Workspace/DscBuildData.py  | 23
>++++++++++++++++-
> .../Source/Python/Workspace/MetaFileParser.py      | 14 +++++++++++
> .../Source/Python/Workspace/WorkspaceCommon.py     |  2 ++
> .../Source/Python/Workspace/WorkspaceDatabase.py   |  4 +++
> 8 files changed, 68 insertions(+), 7 deletions(-)
>
>diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
>b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
>index f0812b6887..e6d6c43810 100755
>--- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
>+++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
>@@ -462,14 +462,31 @@ class ModuleAutoGen(AutoGen):
>     def BuildCommand(self):
>         return self.PlatformInfo.BuildCommand
>
>-    ## Get object list of all packages the module and its dependent libraries
>belong to
>+    ## Get Module package and Platform package
>+    #
>+    #   @retval list The list of package object
>+    #
>+    @cached_property
>+    def PackageList(self):
>+        PkagList = []
>+        if self.Module.Packages:
>+            PkagList.extend(self.Module.Packages)
>+        Platform = self.BuildDatabase[self.PlatformInfo.MetaFile, self.Arch,
>self.BuildTarget, self.ToolChain]
>+        for Package in Platform.Packages:
>+            if Package in PkagList:
>+                continue
>+            PkagList.append(Package)
>+        return PkagList
>+
>+    ## Get object list of all packages the module and its dependent libraries
>belong to and the Platform depends on
>     #
>     #   @retval     list    The list of package object
>     #
>     @cached_property
>     def DerivedPackageList(self):
>         PackageList = []
>-        for M in [self.Module] + self.DependentLibraryList:
>+        PackageList.extend(self.PackageList)
>+        for M in self.DependentLibraryList:
>             for Package in M.Packages:
>                 if Package in PackageList:
>                     continue
>@@ -938,13 +955,13 @@ class ModuleAutoGen(AutoGen):
>         self.Targets
>         return self._FileTypes
>
>-    ## Get the list of package object the module depends on
>+    ## Get the list of package object the module depends on and the Platform
>depends on
>     #
>     #   @retval     list    The package object list
>     #
>     @cached_property
>     def DependentPackageList(self):
>-        return self.Module.Packages
>+        return self.PackageList
>
>     ## Return the list of auto-generated code file
>     #
>@@ -1101,7 +1118,7 @@ class ModuleAutoGen(AutoGen):
>         RetVal.append(self.MetaFile.Dir)
>         RetVal.append(self.DebugDir)
>
>-        for Package in self.Module.Packages:
>+        for Package in self.PackageList:
>             PackageDir = mws.join(self.WorkspaceDir, Package.MetaFile.Dir)
>             if PackageDir not in RetVal:
>                 RetVal.append(PackageDir)
>@@ -1125,7 +1142,7 @@ class ModuleAutoGen(AutoGen):
>     @cached_property
>     def PackageIncludePathList(self):
>         IncludesList = []
>-        for Package in self.Module.Packages:
>+        for Package in self.PackageList:
>             PackageDir = mws.join(self.WorkspaceDir, Package.MetaFile.Dir)
>             IncludesList = Package.Includes
>             if Package._PrivateIncludes:
>diff --git a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
>b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
>index debeb46f58..4c3cdf82d5 100644
>--- a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
>+++ b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
>@@ -975,6 +975,7 @@ class PlatformAutoGen(AutoGen):
>                 continue
>             ModuleData = self.BuildDatabase[ModuleFile, self.Arch,
>self.BuildTarget, self.ToolChain]
>             RetVal.update(ModuleData.Packages)
>+        RetVal.update(self.Platform.Packages)
>         return list(RetVal)
>
>     @cached_property
>diff --git a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
>b/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
>index 9d8040905e..fde48b4b27 100644
>--- a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
>+++ b/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
>@@ -420,6 +420,7 @@ class WorkspaceAutoGen(AutoGen):
>                     continue
>                 ModuleData = self.BuildDatabase[ModuleFile, Arch, self.BuildTarget,
>self.ToolChain]
>                 PkgSet.update(ModuleData.Packages)
>+            PkgSet.update(Platform.Packages)
>             Pkgs[Arch] = list(PkgSet)
>         return Pkgs
>
>diff --git a/BaseTools/Source/Python/Common/DataType.py
>b/BaseTools/Source/Python/Common/DataType.py
>index 5d49afb0a9..8d80b41089 100644
>--- a/BaseTools/Source/Python/Common/DataType.py
>+++ b/BaseTools/Source/Python/Common/DataType.py
>@@ -519,6 +519,7 @@ SECTIONS_HAVE_ITEM_AFTER_ARCH_SET =
>{TAB_LIBRARY_CLASSES.upper(), TAB_DEPEX.uppe
>                                  PCDS_DYNAMICEX_VPD.upper(),
>                                  PCDS_DYNAMICEX_HII.upper(),
>                                  TAB_BUILD_OPTIONS.upper(),
>+                                 TAB_PACKAGES.upper(),
>                                  TAB_INCLUDES.upper()}
>
> #
>diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py
>b/BaseTools/Source/Python/Workspace/DscBuildData.py
>index 9192077f90..03a15bbf3e 100644
>--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
>+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
>@@ -719,6 +719,24 @@ class DscBuildData(PlatformBuildClassObject):
>
>self._RawData.DisableOverrideComponent(Components[(file_guid_str,str(M
>oduleFile))])
>             Components[(file_guid_str,str(ModuleFile))] = ModuleId
>         self._RawData._PostProcessed = False
>+
>+    ## Retrieve packages this Platform depends on
>+    @cached_property
>+    def Packages(self):
>+        RetVal = set()
>+        RecordList = self._RawData[MODEL_META_DATA_PACKAGE, self._Arch]
>+        Macros = self._Macros
>+        for Record in RecordList:
>+            File = PathClass(NormPath(Record[0], Macros),
>GlobalData.gWorkspace, Arch=self._Arch)
>+            # check the file validation
>+            ErrorCode, ErrorInfo = File.Validate('.dec')
>+            if ErrorCode != 0:
>+                LineNo = Record[-1]
>+                EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo,
>File=self.MetaFile, Line=LineNo)
>+            # parse this package now. we need it to get protocol/ppi/guid value
>+            RetVal.add(self._Bdb[File, self._Arch, self._Target, self._Toolchain])
>+        return RetVal
>+
>     ## Retrieve [Components] section information
>     @property
>     def Modules(self):
>@@ -896,7 +914,8 @@ class DscBuildData(PlatformBuildClassObject):
>                     continue
>                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target,
>self._Toolchain]
>                 PkgSet.update(ModuleData.Packages)
>-
>+            if self.Packages:
>+                PkgSet.update(self.Packages)
>             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb,
>self._Arch, self._Target, self._Toolchain, PkgSet)
>             self._GuidDict.update(GlobalData.gPlatformPcds)
>
>@@ -3320,6 +3339,8 @@ class DscBuildData(PlatformBuildClassObject):
>                     continue
>                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target,
>self._Toolchain]
>                 PkgSet.update(ModuleData.Packages)
>+            if self.Packages:
>+                PkgSet.update(self.Packages)
>             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb,
>self._Arch, self._Target, self._Toolchain, PkgSet)
>             self._GuidDict.update(GlobalData.gPlatformPcds)
>         return self._DecPcds
>diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py
>b/BaseTools/Source/Python/Workspace/MetaFileParser.py
>index 806fc322c5..3f96ce0564 100644
>--- a/BaseTools/Source/Python/Workspace/MetaFileParser.py
>+++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py
>@@ -160,6 +160,7 @@ class MetaFileParser(object):
>         self.MetaFile = FilePath
>         self._FileDir = self.MetaFile.Dir
>         self._Defines = {}
>+        self._Packages = []
>         self._FileLocalMacros = {}
>         self._SectionsMacroDict = defaultdict(dict)
>
>@@ -351,6 +352,13 @@ class MetaFileParser(object):
>         # If the section information is needed later, it should be stored in
>database
>         self._ValueList[0] = self._SectionName
>
>+    ## [packages] section parser
>+    @ParseMacro
>+    def _PackageParser(self):
>+        self._CurrentLine = CleanString(self._CurrentLine)
>+        self._Packages.append(self._CurrentLine)
>+        self._ValueList[0] = self._CurrentLine
>+
>     ## [defines] section parser
>     @ParseMacro
>     def _DefineParser(self):
>@@ -848,6 +856,7 @@ class DscParser(MetaFileParser):
>         TAB_LIBRARIES.upper()                       :   MODEL_EFI_LIBRARY_INSTANCE,
>         TAB_LIBRARY_CLASSES.upper()                 :   MODEL_EFI_LIBRARY_CLASS,
>         TAB_BUILD_OPTIONS.upper()                   :
>MODEL_META_DATA_BUILD_OPTION,
>+        TAB_PACKAGES.upper()                        :   MODEL_META_DATA_PACKAGE,
>         TAB_PCDS_FIXED_AT_BUILD_NULL.upper()        :
>MODEL_PCD_FIXED_AT_BUILD,
>         TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper()   :
>MODEL_PCD_PATCHABLE_IN_MODULE,
>         TAB_PCDS_FEATURE_FLAG_NULL.upper()          :
>MODEL_PCD_FEATURE_FLAG,
>@@ -1339,6 +1348,7 @@ class DscParser(MetaFileParser):
>             MODEL_META_DATA_DEFINE                          :   self.__ProcessDefine,
>             MODEL_META_DATA_GLOBAL_DEFINE                   :
>self.__ProcessDefine,
>             MODEL_META_DATA_INCLUDE                         :   self.__ProcessDirective,
>+            MODEL_META_DATA_PACKAGE                         :   self.__ProcessPackages,
>             MODEL_META_DATA_CONDITIONAL_STATEMENT_IF        :
>self.__ProcessDirective,
>             MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE      :
>self.__ProcessDirective,
>             MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF     :
>self.__ProcessDirective,
>@@ -1642,6 +1652,9 @@ class DscParser(MetaFileParser):
>                 self._ValueList = None
>                 self._ContentIndex -= 1
>
>+    def __ProcessPackages(self):
>+        self._ValueList[0] = ReplaceMacro(self._ValueList[0], self._Macros)
>+
>     def __ProcessSkuId(self):
>         self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True)
>                            for Value in self._ValueList]
>@@ -1720,6 +1733,7 @@ class DscParser(MetaFileParser):
>         MODEL_META_DATA_COMPONENT                       :   _ComponentParser,
>         MODEL_META_DATA_BUILD_OPTION                    :   _BuildOptionParser,
>         MODEL_UNKNOWN                                   :   MetaFileParser._Skip,
>+        MODEL_META_DATA_PACKAGE                         :
>MetaFileParser._PackageParser,
>         MODEL_META_DATA_USER_EXTENSION                  :
>MetaFileParser._SkipUserExtension,
>         MODEL_META_DATA_SECTION_HEADER                  :
>MetaFileParser._SectionHeaderParser,
>         MODEL_META_DATA_SUBSECTION_HEADER               :
>_SubsectionHeaderParser,
>diff --git a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
>b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
>index 0b11ec2d59..913e710fd9 100644
>--- a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
>+++ b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
>@@ -37,6 +37,8 @@ class OrderedListDict(OrderedDict):
> #
> def GetPackageList(Platform, BuildDatabase, Arch, Target, Toolchain):
>     PkgSet = set()
>+    if Platform.Packages:
>+        PkgSet.update(Platform.Packages)
>     for ModuleFile in Platform.Modules:
>         Data = BuildDatabase[ModuleFile, Arch, Target, Toolchain]
>         PkgSet.update(Data.Packages)
>diff --git a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
>b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
>index ab7b4506c1..9420eaa608 100644
>--- a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
>+++ b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
>@@ -186,6 +186,10 @@ class WorkspaceDatabase(object):
>             for Package in LibObj.Packages:
>                 if Package not in PackageList:
>                     PackageList.append(Package)
>+        for Package in Pa.Packages:
>+            if Package in PackageList:
>+                continue
>+            PackageList.append(Package)
>
>         return PackageList
>
>--
>2.14.1.windows.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH V2] BaseTools:Add [packages] section in dsc file
  2019-11-15  1:55 ` Liming Gao
@ 2019-11-20  2:45   ` Fan, ZhijuX
  2019-11-20  5:13     ` Liming Gao
  0 siblings, 1 reply; 5+ messages in thread
From: Fan, ZhijuX @ 2019-11-20  2:45 UTC (permalink / raw)
  To: Gao, Liming, devel@edk2.groups.io; +Cc: Feng, Bob C

Hi:

regression test:
pass build for minplatforms, WhitleyRp, TigerLake

functional test:

Define a PCD in a dec file (e.g. StandaloneMmPkg.dec) that none of the modules depend on,
it is defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section
Create the [Packages] section in the DSC file and add " StandaloneMmPkg.dec" in [Packages] section

Test whether this PCD can be used in conditional statements in DSC/FDF files


Any question, please let me know. Thanks.

Best Regards
Fan Zhiju



> -----Original Message-----
> From: Gao, Liming <liming.gao@intel.com>
> Sent: Friday, November 15, 2019 9:55 AM
> To: Fan, ZhijuX <zhijux.fan@intel.com>; devel@edk2.groups.io
> Cc: Feng, Bob C <bob.c.feng@intel.com>
> Subject: RE: [PATCH V2] BaseTools:Add [packages] section in dsc file
> 
> Zhiju:
>   Can you show what test are done for this new support?
> 
> Thanks
> Liming
> >-----Original Message-----
> >From: Fan, ZhijuX
> >Sent: Thursday, November 14, 2019 9:28 AM
> >To: devel@edk2.groups.io
> >Cc: Gao, Liming <liming.gao@intel.com>; Feng, Bob C
> ><bob.c.feng@intel.com>
> >Subject: [PATCH V2] BaseTools:Add [packages] section in dsc file
> >
> >BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=2270
> >
> >Currently a PCD (e.g. FeaturePCD) cannot be used in a conditional
> >statement in a DSC/FDF file without a module in the build referencing
> >the PCD package DEC file.
> >
> >An example implementation that to support this is to allow a [Packages]
> >section in the DSC file to list additional package dependencies for PCD
> >references in the package DSC/FDF files.
> >
> >this patch is going to  add the ability to have the [packages] section
> >defined in the DSC file
> >
> >Cc: Liming Gao <liming.gao@intel.com>
> >Cc: Bob Feng <bob.c.feng@intel.com>
> >Signed-off-by: Zhiju.Fan <zhijux.fan@intel.com>
> >---
> > BaseTools/Source/Python/AutoGen/ModuleAutoGen.py   | 29
> >+++++++++++++++++-----
> > BaseTools/Source/Python/AutoGen/PlatformAutoGen.py |  1 +
> > .../Source/Python/AutoGen/WorkspaceAutoGen.py      |  1 +
> > BaseTools/Source/Python/Common/DataType.py         |  1 +
> > BaseTools/Source/Python/Workspace/DscBuildData.py  | 23
> >++++++++++++++++-
> > .../Source/Python/Workspace/MetaFileParser.py      | 14 +++++++++++
> > .../Source/Python/Workspace/WorkspaceCommon.py     |  2 ++
> > .../Source/Python/Workspace/WorkspaceDatabase.py   |  4 +++
> > 8 files changed, 68 insertions(+), 7 deletions(-)
> >
> >diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
> >b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
> >index f0812b6887..e6d6c43810 100755
> >--- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
> >+++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
> >@@ -462,14 +462,31 @@ class ModuleAutoGen(AutoGen):
> >     def BuildCommand(self):
> >         return self.PlatformInfo.BuildCommand
> >
> >-    ## Get object list of all packages the module and its dependent libraries
> >belong to
> >+    ## Get Module package and Platform package
> >+    #
> >+    #   @retval list The list of package object
> >+    #
> >+    @cached_property
> >+    def PackageList(self):
> >+        PkagList = []
> >+        if self.Module.Packages:
> >+            PkagList.extend(self.Module.Packages)
> >+        Platform = self.BuildDatabase[self.PlatformInfo.MetaFile,
> >+ self.Arch,
> >self.BuildTarget, self.ToolChain]
> >+        for Package in Platform.Packages:
> >+            if Package in PkagList:
> >+                continue
> >+            PkagList.append(Package)
> >+        return PkagList
> >+
> >+    ## Get object list of all packages the module and its dependent
> >+ libraries
> >belong to and the Platform depends on
> >     #
> >     #   @retval     list    The list of package object
> >     #
> >     @cached_property
> >     def DerivedPackageList(self):
> >         PackageList = []
> >-        for M in [self.Module] + self.DependentLibraryList:
> >+        PackageList.extend(self.PackageList)
> >+        for M in self.DependentLibraryList:
> >             for Package in M.Packages:
> >                 if Package in PackageList:
> >                     continue
> >@@ -938,13 +955,13 @@ class ModuleAutoGen(AutoGen):
> >         self.Targets
> >         return self._FileTypes
> >
> >-    ## Get the list of package object the module depends on
> >+    ## Get the list of package object the module depends on and the
> >+ Platform
> >depends on
> >     #
> >     #   @retval     list    The package object list
> >     #
> >     @cached_property
> >     def DependentPackageList(self):
> >-        return self.Module.Packages
> >+        return self.PackageList
> >
> >     ## Return the list of auto-generated code file
> >     #
> >@@ -1101,7 +1118,7 @@ class ModuleAutoGen(AutoGen):
> >         RetVal.append(self.MetaFile.Dir)
> >         RetVal.append(self.DebugDir)
> >
> >-        for Package in self.Module.Packages:
> >+        for Package in self.PackageList:
> >             PackageDir = mws.join(self.WorkspaceDir, Package.MetaFile.Dir)
> >             if PackageDir not in RetVal:
> >                 RetVal.append(PackageDir) @@ -1125,7 +1142,7 @@ class
> >ModuleAutoGen(AutoGen):
> >     @cached_property
> >     def PackageIncludePathList(self):
> >         IncludesList = []
> >-        for Package in self.Module.Packages:
> >+        for Package in self.PackageList:
> >             PackageDir = mws.join(self.WorkspaceDir, Package.MetaFile.Dir)
> >             IncludesList = Package.Includes
> >             if Package._PrivateIncludes:
> >diff --git a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
> >b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
> >index debeb46f58..4c3cdf82d5 100644
> >--- a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
> >+++ b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
> >@@ -975,6 +975,7 @@ class PlatformAutoGen(AutoGen):
> >                 continue
> >             ModuleData = self.BuildDatabase[ModuleFile, self.Arch,
> >self.BuildTarget, self.ToolChain]
> >             RetVal.update(ModuleData.Packages)
> >+        RetVal.update(self.Platform.Packages)
> >         return list(RetVal)
> >
> >     @cached_property
> >diff --git a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
> >b/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
> >index 9d8040905e..fde48b4b27 100644
> >--- a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
> >+++ b/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
> >@@ -420,6 +420,7 @@ class WorkspaceAutoGen(AutoGen):
> >                     continue
> >                 ModuleData = self.BuildDatabase[ModuleFile, Arch,
> >self.BuildTarget, self.ToolChain]
> >                 PkgSet.update(ModuleData.Packages)
> >+            PkgSet.update(Platform.Packages)
> >             Pkgs[Arch] = list(PkgSet)
> >         return Pkgs
> >
> >diff --git a/BaseTools/Source/Python/Common/DataType.py
> >b/BaseTools/Source/Python/Common/DataType.py
> >index 5d49afb0a9..8d80b41089 100644
> >--- a/BaseTools/Source/Python/Common/DataType.py
> >+++ b/BaseTools/Source/Python/Common/DataType.py
> >@@ -519,6 +519,7 @@ SECTIONS_HAVE_ITEM_AFTER_ARCH_SET =
> >{TAB_LIBRARY_CLASSES.upper(), TAB_DEPEX.uppe
> >                                  PCDS_DYNAMICEX_VPD.upper(),
> >                                  PCDS_DYNAMICEX_HII.upper(),
> >                                  TAB_BUILD_OPTIONS.upper(),
> >+                                 TAB_PACKAGES.upper(),
> >                                  TAB_INCLUDES.upper()}
> >
> > #
> >diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py
> >b/BaseTools/Source/Python/Workspace/DscBuildData.py
> >index 9192077f90..03a15bbf3e 100644
> >--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
> >+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
> >@@ -719,6 +719,24 @@ class DscBuildData(PlatformBuildClassObject):
> >
> >self._RawData.DisableOverrideComponent(Components[(file_guid_str,str(
> M
> >oduleFile))])
> >             Components[(file_guid_str,str(ModuleFile))] = ModuleId
> >         self._RawData._PostProcessed = False
> >+
> >+    ## Retrieve packages this Platform depends on
> >+    @cached_property
> >+    def Packages(self):
> >+        RetVal = set()
> >+        RecordList = self._RawData[MODEL_META_DATA_PACKAGE,
> self._Arch]
> >+        Macros = self._Macros
> >+        for Record in RecordList:
> >+            File = PathClass(NormPath(Record[0], Macros),
> >GlobalData.gWorkspace, Arch=self._Arch)
> >+            # check the file validation
> >+            ErrorCode, ErrorInfo = File.Validate('.dec')
> >+            if ErrorCode != 0:
> >+                LineNo = Record[-1]
> >+                EdkLogger.error('build', ErrorCode,
> >+ ExtraData=ErrorInfo,
> >File=self.MetaFile, Line=LineNo)
> >+            # parse this package now. we need it to get protocol/ppi/guid value
> >+            RetVal.add(self._Bdb[File, self._Arch, self._Target, self._Toolchain])
> >+        return RetVal
> >+
> >     ## Retrieve [Components] section information
> >     @property
> >     def Modules(self):
> >@@ -896,7 +914,8 @@ class DscBuildData(PlatformBuildClassObject):
> >                     continue
> >                 ModuleData = self._Bdb[ModuleFile, self._Arch,
> >self._Target, self._Toolchain]
> >                 PkgSet.update(ModuleData.Packages)
> >-
> >+            if self.Packages:
> >+                PkgSet.update(self.Packages)
> >             self._DecPcds, self._GuidDict = GetDeclaredPcd(self,
> >self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)
> >             self._GuidDict.update(GlobalData.gPlatformPcds)
> >
> >@@ -3320,6 +3339,8 @@ class DscBuildData(PlatformBuildClassObject):
> >                     continue
> >                 ModuleData = self._Bdb[ModuleFile, self._Arch,
> >self._Target, self._Toolchain]
> >                 PkgSet.update(ModuleData.Packages)
> >+            if self.Packages:
> >+                PkgSet.update(self.Packages)
> >             self._DecPcds, self._GuidDict = GetDeclaredPcd(self,
> >self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)
> >             self._GuidDict.update(GlobalData.gPlatformPcds)
> >         return self._DecPcds
> >diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py
> >b/BaseTools/Source/Python/Workspace/MetaFileParser.py
> >index 806fc322c5..3f96ce0564 100644
> >--- a/BaseTools/Source/Python/Workspace/MetaFileParser.py
> >+++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py
> >@@ -160,6 +160,7 @@ class MetaFileParser(object):
> >         self.MetaFile = FilePath
> >         self._FileDir = self.MetaFile.Dir
> >         self._Defines = {}
> >+        self._Packages = []
> >         self._FileLocalMacros = {}
> >         self._SectionsMacroDict = defaultdict(dict)
> >
> >@@ -351,6 +352,13 @@ class MetaFileParser(object):
> >         # If the section information is needed later, it should be
> >stored in database
> >         self._ValueList[0] = self._SectionName
> >
> >+    ## [packages] section parser
> >+    @ParseMacro
> >+    def _PackageParser(self):
> >+        self._CurrentLine = CleanString(self._CurrentLine)
> >+        self._Packages.append(self._CurrentLine)
> >+        self._ValueList[0] = self._CurrentLine
> >+
> >     ## [defines] section parser
> >     @ParseMacro
> >     def _DefineParser(self):
> >@@ -848,6 +856,7 @@ class DscParser(MetaFileParser):
> >         TAB_LIBRARIES.upper()                       :   MODEL_EFI_LIBRARY_INSTANCE,
> >         TAB_LIBRARY_CLASSES.upper()                 :   MODEL_EFI_LIBRARY_CLASS,
> >         TAB_BUILD_OPTIONS.upper()                   :
> >MODEL_META_DATA_BUILD_OPTION,
> >+        TAB_PACKAGES.upper()                        :
> MODEL_META_DATA_PACKAGE,
> >         TAB_PCDS_FIXED_AT_BUILD_NULL.upper()        :
> >MODEL_PCD_FIXED_AT_BUILD,
> >         TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper()   :
> >MODEL_PCD_PATCHABLE_IN_MODULE,
> >         TAB_PCDS_FEATURE_FLAG_NULL.upper()          :
> >MODEL_PCD_FEATURE_FLAG,
> >@@ -1339,6 +1348,7 @@ class DscParser(MetaFileParser):
> >             MODEL_META_DATA_DEFINE                          :   self.__ProcessDefine,
> >             MODEL_META_DATA_GLOBAL_DEFINE                   :
> >self.__ProcessDefine,
> >             MODEL_META_DATA_INCLUDE                         :
> self.__ProcessDirective,
> >+            MODEL_META_DATA_PACKAGE                         :
> self.__ProcessPackages,
> >             MODEL_META_DATA_CONDITIONAL_STATEMENT_IF        :
> >self.__ProcessDirective,
> >             MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE      :
> >self.__ProcessDirective,
> >             MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF     :
> >self.__ProcessDirective,
> >@@ -1642,6 +1652,9 @@ class DscParser(MetaFileParser):
> >                 self._ValueList = None
> >                 self._ContentIndex -= 1
> >
> >+    def __ProcessPackages(self):
> >+        self._ValueList[0] = ReplaceMacro(self._ValueList[0],
> >+ self._Macros)
> >+
> >     def __ProcessSkuId(self):
> >         self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True)
> >                            for Value in self._ValueList] @@ -1720,6
> >+1733,7 @@ class DscParser(MetaFileParser):
> >         MODEL_META_DATA_COMPONENT                       :   _ComponentParser,
> >         MODEL_META_DATA_BUILD_OPTION                    :   _BuildOptionParser,
> >         MODEL_UNKNOWN                                   :   MetaFileParser._Skip,
> >+        MODEL_META_DATA_PACKAGE                         :
> >MetaFileParser._PackageParser,
> >         MODEL_META_DATA_USER_EXTENSION                  :
> >MetaFileParser._SkipUserExtension,
> >         MODEL_META_DATA_SECTION_HEADER                  :
> >MetaFileParser._SectionHeaderParser,
> >         MODEL_META_DATA_SUBSECTION_HEADER               :
> >_SubsectionHeaderParser,
> >diff --git a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
> >b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
> >index 0b11ec2d59..913e710fd9 100644
> >--- a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
> >+++ b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
> >@@ -37,6 +37,8 @@ class OrderedListDict(OrderedDict):
> > #
> > def GetPackageList(Platform, BuildDatabase, Arch, Target, Toolchain):
> >     PkgSet = set()
> >+    if Platform.Packages:
> >+        PkgSet.update(Platform.Packages)
> >     for ModuleFile in Platform.Modules:
> >         Data = BuildDatabase[ModuleFile, Arch, Target, Toolchain]
> >         PkgSet.update(Data.Packages)
> >diff --git a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
> >b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
> >index ab7b4506c1..9420eaa608 100644
> >--- a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
> >+++ b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
> >@@ -186,6 +186,10 @@ class WorkspaceDatabase(object):
> >             for Package in LibObj.Packages:
> >                 if Package not in PackageList:
> >                     PackageList.append(Package)
> >+        for Package in Pa.Packages:
> >+            if Package in PackageList:
> >+                continue
> >+            PackageList.append(Package)
> >
> >         return PackageList
> >
> >--
> >2.14.1.windows.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH V2] BaseTools:Add [packages] section in dsc file
  2019-11-20  2:45   ` Fan, ZhijuX
@ 2019-11-20  5:13     ` Liming Gao
  0 siblings, 0 replies; 5+ messages in thread
From: Liming Gao @ 2019-11-20  5:13 UTC (permalink / raw)
  To: Fan, ZhijuX, devel@edk2.groups.io; +Cc: Feng, Bob C

The test case is ok to me. 

Acked-by: Liming Gao <liming.gao@intel.com>

Thanks
Liming
>-----Original Message-----
>From: Fan, ZhijuX
>Sent: Wednesday, November 20, 2019 10:46 AM
>To: Gao, Liming <liming.gao@intel.com>; devel@edk2.groups.io
>Cc: Feng, Bob C <bob.c.feng@intel.com>
>Subject: RE: [PATCH V2] BaseTools:Add [packages] section in dsc file
>
>Hi:
>
>regression test:
>pass build for minplatforms, WhitleyRp, TigerLake
>
>functional test:
>
>Define a PCD in a dec file (e.g. StandaloneMmPkg.dec) that none of the
>modules depend on,
>it is defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section
>Create the [Packages] section in the DSC file and add "
>StandaloneMmPkg.dec" in [Packages] section
>
>Test whether this PCD can be used in conditional statements in DSC/FDF files
>
>
>Any question, please let me know. Thanks.
>
>Best Regards
>Fan Zhiju
>
>
>
>> -----Original Message-----
>> From: Gao, Liming <liming.gao@intel.com>
>> Sent: Friday, November 15, 2019 9:55 AM
>> To: Fan, ZhijuX <zhijux.fan@intel.com>; devel@edk2.groups.io
>> Cc: Feng, Bob C <bob.c.feng@intel.com>
>> Subject: RE: [PATCH V2] BaseTools:Add [packages] section in dsc file
>>
>> Zhiju:
>>   Can you show what test are done for this new support?
>>
>> Thanks
>> Liming
>> >-----Original Message-----
>> >From: Fan, ZhijuX
>> >Sent: Thursday, November 14, 2019 9:28 AM
>> >To: devel@edk2.groups.io
>> >Cc: Gao, Liming <liming.gao@intel.com>; Feng, Bob C
>> ><bob.c.feng@intel.com>
>> >Subject: [PATCH V2] BaseTools:Add [packages] section in dsc file
>> >
>> >BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=2270
>> >
>> >Currently a PCD (e.g. FeaturePCD) cannot be used in a conditional
>> >statement in a DSC/FDF file without a module in the build referencing
>> >the PCD package DEC file.
>> >
>> >An example implementation that to support this is to allow a [Packages]
>> >section in the DSC file to list additional package dependencies for PCD
>> >references in the package DSC/FDF files.
>> >
>> >this patch is going to  add the ability to have the [packages] section
>> >defined in the DSC file
>> >
>> >Cc: Liming Gao <liming.gao@intel.com>
>> >Cc: Bob Feng <bob.c.feng@intel.com>
>> >Signed-off-by: Zhiju.Fan <zhijux.fan@intel.com>
>> >---
>> > BaseTools/Source/Python/AutoGen/ModuleAutoGen.py   | 29
>> >+++++++++++++++++-----
>> > BaseTools/Source/Python/AutoGen/PlatformAutoGen.py |  1 +
>> > .../Source/Python/AutoGen/WorkspaceAutoGen.py      |  1 +
>> > BaseTools/Source/Python/Common/DataType.py         |  1 +
>> > BaseTools/Source/Python/Workspace/DscBuildData.py  | 23
>> >++++++++++++++++-
>> > .../Source/Python/Workspace/MetaFileParser.py      | 14 +++++++++++
>> > .../Source/Python/Workspace/WorkspaceCommon.py     |  2 ++
>> > .../Source/Python/Workspace/WorkspaceDatabase.py   |  4 +++
>> > 8 files changed, 68 insertions(+), 7 deletions(-)
>> >
>> >diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
>> >b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
>> >index f0812b6887..e6d6c43810 100755
>> >--- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
>> >+++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
>> >@@ -462,14 +462,31 @@ class ModuleAutoGen(AutoGen):
>> >     def BuildCommand(self):
>> >         return self.PlatformInfo.BuildCommand
>> >
>> >-    ## Get object list of all packages the module and its dependent libraries
>> >belong to
>> >+    ## Get Module package and Platform package
>> >+    #
>> >+    #   @retval list The list of package object
>> >+    #
>> >+    @cached_property
>> >+    def PackageList(self):
>> >+        PkagList = []
>> >+        if self.Module.Packages:
>> >+            PkagList.extend(self.Module.Packages)
>> >+        Platform = self.BuildDatabase[self.PlatformInfo.MetaFile,
>> >+ self.Arch,
>> >self.BuildTarget, self.ToolChain]
>> >+        for Package in Platform.Packages:
>> >+            if Package in PkagList:
>> >+                continue
>> >+            PkagList.append(Package)
>> >+        return PkagList
>> >+
>> >+    ## Get object list of all packages the module and its dependent
>> >+ libraries
>> >belong to and the Platform depends on
>> >     #
>> >     #   @retval     list    The list of package object
>> >     #
>> >     @cached_property
>> >     def DerivedPackageList(self):
>> >         PackageList = []
>> >-        for M in [self.Module] + self.DependentLibraryList:
>> >+        PackageList.extend(self.PackageList)
>> >+        for M in self.DependentLibraryList:
>> >             for Package in M.Packages:
>> >                 if Package in PackageList:
>> >                     continue
>> >@@ -938,13 +955,13 @@ class ModuleAutoGen(AutoGen):
>> >         self.Targets
>> >         return self._FileTypes
>> >
>> >-    ## Get the list of package object the module depends on
>> >+    ## Get the list of package object the module depends on and the
>> >+ Platform
>> >depends on
>> >     #
>> >     #   @retval     list    The package object list
>> >     #
>> >     @cached_property
>> >     def DependentPackageList(self):
>> >-        return self.Module.Packages
>> >+        return self.PackageList
>> >
>> >     ## Return the list of auto-generated code file
>> >     #
>> >@@ -1101,7 +1118,7 @@ class ModuleAutoGen(AutoGen):
>> >         RetVal.append(self.MetaFile.Dir)
>> >         RetVal.append(self.DebugDir)
>> >
>> >-        for Package in self.Module.Packages:
>> >+        for Package in self.PackageList:
>> >             PackageDir = mws.join(self.WorkspaceDir, Package.MetaFile.Dir)
>> >             if PackageDir not in RetVal:
>> >                 RetVal.append(PackageDir) @@ -1125,7 +1142,7 @@ class
>> >ModuleAutoGen(AutoGen):
>> >     @cached_property
>> >     def PackageIncludePathList(self):
>> >         IncludesList = []
>> >-        for Package in self.Module.Packages:
>> >+        for Package in self.PackageList:
>> >             PackageDir = mws.join(self.WorkspaceDir, Package.MetaFile.Dir)
>> >             IncludesList = Package.Includes
>> >             if Package._PrivateIncludes:
>> >diff --git a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
>> >b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
>> >index debeb46f58..4c3cdf82d5 100644
>> >--- a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
>> >+++ b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
>> >@@ -975,6 +975,7 @@ class PlatformAutoGen(AutoGen):
>> >                 continue
>> >             ModuleData = self.BuildDatabase[ModuleFile, self.Arch,
>> >self.BuildTarget, self.ToolChain]
>> >             RetVal.update(ModuleData.Packages)
>> >+        RetVal.update(self.Platform.Packages)
>> >         return list(RetVal)
>> >
>> >     @cached_property
>> >diff --git a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
>> >b/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
>> >index 9d8040905e..fde48b4b27 100644
>> >--- a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
>> >+++ b/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
>> >@@ -420,6 +420,7 @@ class WorkspaceAutoGen(AutoGen):
>> >                     continue
>> >                 ModuleData = self.BuildDatabase[ModuleFile, Arch,
>> >self.BuildTarget, self.ToolChain]
>> >                 PkgSet.update(ModuleData.Packages)
>> >+            PkgSet.update(Platform.Packages)
>> >             Pkgs[Arch] = list(PkgSet)
>> >         return Pkgs
>> >
>> >diff --git a/BaseTools/Source/Python/Common/DataType.py
>> >b/BaseTools/Source/Python/Common/DataType.py
>> >index 5d49afb0a9..8d80b41089 100644
>> >--- a/BaseTools/Source/Python/Common/DataType.py
>> >+++ b/BaseTools/Source/Python/Common/DataType.py
>> >@@ -519,6 +519,7 @@ SECTIONS_HAVE_ITEM_AFTER_ARCH_SET =
>> >{TAB_LIBRARY_CLASSES.upper(), TAB_DEPEX.uppe
>> >                                  PCDS_DYNAMICEX_VPD.upper(),
>> >                                  PCDS_DYNAMICEX_HII.upper(),
>> >                                  TAB_BUILD_OPTIONS.upper(),
>> >+                                 TAB_PACKAGES.upper(),
>> >                                  TAB_INCLUDES.upper()}
>> >
>> > #
>> >diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py
>> >b/BaseTools/Source/Python/Workspace/DscBuildData.py
>> >index 9192077f90..03a15bbf3e 100644
>> >--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
>> >+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
>> >@@ -719,6 +719,24 @@ class DscBuildData(PlatformBuildClassObject):
>> >
>> >self._RawData.DisableOverrideComponent(Components[(file_guid_str,str
>(
>> M
>> >oduleFile))])
>> >             Components[(file_guid_str,str(ModuleFile))] = ModuleId
>> >         self._RawData._PostProcessed = False
>> >+
>> >+    ## Retrieve packages this Platform depends on
>> >+    @cached_property
>> >+    def Packages(self):
>> >+        RetVal = set()
>> >+        RecordList = self._RawData[MODEL_META_DATA_PACKAGE,
>> self._Arch]
>> >+        Macros = self._Macros
>> >+        for Record in RecordList:
>> >+            File = PathClass(NormPath(Record[0], Macros),
>> >GlobalData.gWorkspace, Arch=self._Arch)
>> >+            # check the file validation
>> >+            ErrorCode, ErrorInfo = File.Validate('.dec')
>> >+            if ErrorCode != 0:
>> >+                LineNo = Record[-1]
>> >+                EdkLogger.error('build', ErrorCode,
>> >+ ExtraData=ErrorInfo,
>> >File=self.MetaFile, Line=LineNo)
>> >+            # parse this package now. we need it to get protocol/ppi/guid value
>> >+            RetVal.add(self._Bdb[File, self._Arch, self._Target, self._Toolchain])
>> >+        return RetVal
>> >+
>> >     ## Retrieve [Components] section information
>> >     @property
>> >     def Modules(self):
>> >@@ -896,7 +914,8 @@ class DscBuildData(PlatformBuildClassObject):
>> >                     continue
>> >                 ModuleData = self._Bdb[ModuleFile, self._Arch,
>> >self._Target, self._Toolchain]
>> >                 PkgSet.update(ModuleData.Packages)
>> >-
>> >+            if self.Packages:
>> >+                PkgSet.update(self.Packages)
>> >             self._DecPcds, self._GuidDict = GetDeclaredPcd(self,
>> >self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)
>> >             self._GuidDict.update(GlobalData.gPlatformPcds)
>> >
>> >@@ -3320,6 +3339,8 @@ class DscBuildData(PlatformBuildClassObject):
>> >                     continue
>> >                 ModuleData = self._Bdb[ModuleFile, self._Arch,
>> >self._Target, self._Toolchain]
>> >                 PkgSet.update(ModuleData.Packages)
>> >+            if self.Packages:
>> >+                PkgSet.update(self.Packages)
>> >             self._DecPcds, self._GuidDict = GetDeclaredPcd(self,
>> >self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)
>> >             self._GuidDict.update(GlobalData.gPlatformPcds)
>> >         return self._DecPcds
>> >diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py
>> >b/BaseTools/Source/Python/Workspace/MetaFileParser.py
>> >index 806fc322c5..3f96ce0564 100644
>> >--- a/BaseTools/Source/Python/Workspace/MetaFileParser.py
>> >+++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py
>> >@@ -160,6 +160,7 @@ class MetaFileParser(object):
>> >         self.MetaFile = FilePath
>> >         self._FileDir = self.MetaFile.Dir
>> >         self._Defines = {}
>> >+        self._Packages = []
>> >         self._FileLocalMacros = {}
>> >         self._SectionsMacroDict = defaultdict(dict)
>> >
>> >@@ -351,6 +352,13 @@ class MetaFileParser(object):
>> >         # If the section information is needed later, it should be
>> >stored in database
>> >         self._ValueList[0] = self._SectionName
>> >
>> >+    ## [packages] section parser
>> >+    @ParseMacro
>> >+    def _PackageParser(self):
>> >+        self._CurrentLine = CleanString(self._CurrentLine)
>> >+        self._Packages.append(self._CurrentLine)
>> >+        self._ValueList[0] = self._CurrentLine
>> >+
>> >     ## [defines] section parser
>> >     @ParseMacro
>> >     def _DefineParser(self):
>> >@@ -848,6 +856,7 @@ class DscParser(MetaFileParser):
>> >         TAB_LIBRARIES.upper()                       :   MODEL_EFI_LIBRARY_INSTANCE,
>> >         TAB_LIBRARY_CLASSES.upper()                 :   MODEL_EFI_LIBRARY_CLASS,
>> >         TAB_BUILD_OPTIONS.upper()                   :
>> >MODEL_META_DATA_BUILD_OPTION,
>> >+        TAB_PACKAGES.upper()                        :
>> MODEL_META_DATA_PACKAGE,
>> >         TAB_PCDS_FIXED_AT_BUILD_NULL.upper()        :
>> >MODEL_PCD_FIXED_AT_BUILD,
>> >         TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper()   :
>> >MODEL_PCD_PATCHABLE_IN_MODULE,
>> >         TAB_PCDS_FEATURE_FLAG_NULL.upper()          :
>> >MODEL_PCD_FEATURE_FLAG,
>> >@@ -1339,6 +1348,7 @@ class DscParser(MetaFileParser):
>> >             MODEL_META_DATA_DEFINE                          :   self.__ProcessDefine,
>> >             MODEL_META_DATA_GLOBAL_DEFINE                   :
>> >self.__ProcessDefine,
>> >             MODEL_META_DATA_INCLUDE                         :
>> self.__ProcessDirective,
>> >+            MODEL_META_DATA_PACKAGE                         :
>> self.__ProcessPackages,
>> >             MODEL_META_DATA_CONDITIONAL_STATEMENT_IF        :
>> >self.__ProcessDirective,
>> >             MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE      :
>> >self.__ProcessDirective,
>> >             MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF     :
>> >self.__ProcessDirective,
>> >@@ -1642,6 +1652,9 @@ class DscParser(MetaFileParser):
>> >                 self._ValueList = None
>> >                 self._ContentIndex -= 1
>> >
>> >+    def __ProcessPackages(self):
>> >+        self._ValueList[0] = ReplaceMacro(self._ValueList[0],
>> >+ self._Macros)
>> >+
>> >     def __ProcessSkuId(self):
>> >         self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True)
>> >                            for Value in self._ValueList] @@ -1720,6
>> >+1733,7 @@ class DscParser(MetaFileParser):
>> >         MODEL_META_DATA_COMPONENT                       :   _ComponentParser,
>> >         MODEL_META_DATA_BUILD_OPTION                    :   _BuildOptionParser,
>> >         MODEL_UNKNOWN                                   :   MetaFileParser._Skip,
>> >+        MODEL_META_DATA_PACKAGE                         :
>> >MetaFileParser._PackageParser,
>> >         MODEL_META_DATA_USER_EXTENSION                  :
>> >MetaFileParser._SkipUserExtension,
>> >         MODEL_META_DATA_SECTION_HEADER                  :
>> >MetaFileParser._SectionHeaderParser,
>> >         MODEL_META_DATA_SUBSECTION_HEADER               :
>> >_SubsectionHeaderParser,
>> >diff --git a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
>> >b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
>> >index 0b11ec2d59..913e710fd9 100644
>> >--- a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
>> >+++ b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
>> >@@ -37,6 +37,8 @@ class OrderedListDict(OrderedDict):
>> > #
>> > def GetPackageList(Platform, BuildDatabase, Arch, Target, Toolchain):
>> >     PkgSet = set()
>> >+    if Platform.Packages:
>> >+        PkgSet.update(Platform.Packages)
>> >     for ModuleFile in Platform.Modules:
>> >         Data = BuildDatabase[ModuleFile, Arch, Target, Toolchain]
>> >         PkgSet.update(Data.Packages)
>> >diff --git a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
>> >b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
>> >index ab7b4506c1..9420eaa608 100644
>> >--- a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
>> >+++ b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
>> >@@ -186,6 +186,10 @@ class WorkspaceDatabase(object):
>> >             for Package in LibObj.Packages:
>> >                 if Package not in PackageList:
>> >                     PackageList.append(Package)
>> >+        for Package in Pa.Packages:
>> >+            if Package in PackageList:
>> >+                continue
>> >+            PackageList.append(Package)
>> >
>> >         return PackageList
>> >
>> >--
>> >2.14.1.windows.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-11-20  5:13 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-11-14  1:27 [PATCH V2] BaseTools:Add [packages] section in dsc file Fan, ZhijuX
2019-11-14  2:59 ` Bob Feng
2019-11-15  1:55 ` Liming Gao
2019-11-20  2:45   ` Fan, ZhijuX
2019-11-20  5:13     ` Liming Gao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox