]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Enable component override functionality
authorFeng, Bob C <bob.c.feng@intel.com>
Thu, 10 Jan 2019 09:03:29 +0000 (17:03 +0800)
committerFeng, Bob C <bob.c.feng@intel.com>
Mon, 14 Jan 2019 03:14:24 +0000 (11:14 +0800)
https://bugzilla.tianocore.org/show_bug.cgi?id=1449
This patch enable build tools to recognize that
when two given files have the same GUID, file path and ARCH in Dsc,
The later one's definition will be used.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Bob Feng <bob.c.feng@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Carsey Jaben <jaben.carsey@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools/Source/Python/Workspace/MetaFileParser.py
BaseTools/Source/Python/Workspace/MetaFileTable.py

index ff41af13723435753a9e4764acd95878d8eef0d3..93751678f95d0661d6c339850a99a371ede8c66d 100644 (file)
@@ -706,18 +706,30 @@ class DscBuildData(PlatformBuildClassObject):
             GlobalData.gDefaultStores = sorted(self.DefaultStores.keys())\r
         return self.DefaultStores\r
 \r
+    def OverrideDuplicateModule(self):\r
+        RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
+        Macros = self._Macros\r
+        Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
+        Components = {}\r
+        for Record in RecordList:\r
+            ModuleId = Record[6]\r
+            file_guid = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]\r
+            file_guid_str = file_guid[0][2] if file_guid else "NULL"\r
+            ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
+            if self._Arch != TAB_ARCH_COMMON and (file_guid_str,str(ModuleFile)) in Components:\r
+                self._RawData.DisableOverrideComponent(Components[(file_guid_str,str(ModuleFile))])\r
+            Components[(file_guid_str,str(ModuleFile))] = ModuleId\r
+        self._RawData._PostProcessed = False\r
     ## Retrieve [Components] section information\r
     @property\r
     def Modules(self):\r
         if self._Modules is not None:\r
             return self._Modules\r
-\r
+        self.OverrideDuplicateModule()\r
         self._Modules = OrderedDict()\r
         RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
         Macros = self._Macros\r
         for Record in RecordList:\r
-            DuplicatedFile = False\r
-\r
             ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
             ModuleId = Record[6]\r
             LineNo = Record[7]\r
@@ -727,10 +739,6 @@ class DscBuildData(PlatformBuildClassObject):
             if ErrorCode != 0:\r
                 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
                                 ExtraData=ErrorInfo)\r
-            # Check duplication\r
-            # If arch is COMMON, no duplicate module is checked since all modules in all component sections are selected\r
-            if self._Arch != TAB_ARCH_COMMON and ModuleFile in self._Modules:\r
-                DuplicatedFile = True\r
 \r
             Module = ModuleBuildClassObject()\r
             Module.MetaFile = ModuleFile\r
@@ -793,8 +801,6 @@ class DscBuildData(PlatformBuildClassObject):
                     Module.BuildOptions[ToolChainFamily, ToolChain] = OptionString + " " + Option\r
 \r
             RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]\r
-            if DuplicatedFile and not RecordList:\r
-                EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
             if RecordList:\r
                 if len(RecordList) != 1:\r
                     EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID can be listed in <Defines> section.',\r
index f2322b36ac1b4ab5f196c849fbc4bb907015d279..6df0d3cdf84df7be4e6bfed9e7d98fcc45a4ac8c 100644 (file)
@@ -1697,6 +1697,11 @@ class DscParser(MetaFileParser):
         self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=False)\r
                            for Value in self._ValueList]\r
 \r
+    def DisableOverrideComponent(self,module_id):\r
+        for ori_id in self._IdMapping:\r
+            if self._IdMapping[ori_id] == module_id:\r
+                self._RawTable.DisableComponent(ori_id)\r
+\r
     _SectionParser = {\r
         MODEL_META_DATA_HEADER                          :   _DefineParser,\r
         MODEL_EFI_SKU_ID                                :   _SkuIdParser,\r
index 004e9494c3a0b77545d651da725525d4c6f55734..823a87e0577e23a534a7280958b9717db2df62c5 100644 (file)
@@ -76,7 +76,7 @@ class MetaFileTable():
         self.CurrentContent.append(self._DUMMY_)\r
 \r
     def GetAll(self):\r
-        return [item for item in self.CurrentContent if item[0] >= 0 ]\r
+        return [item for item in self.CurrentContent if item[0] >= 0 and item[-1]>=0]\r
 \r
 ## Python class representation of table storing module data\r
 class ModuleTable(MetaFileTable):\r
@@ -373,7 +373,6 @@ class PlatformTable(MetaFileTable):
 \r
         QueryTab = self.CurrentContent\r
         result = [item for item in QueryTab if item[1] == Model and item[-1]>0 ]\r
-\r
         if Scope1 is not None and Scope1 != TAB_ARCH_COMMON:\r
             Sc1 = set(['COMMON'])\r
             Sc1.add(Scope1)\r
@@ -397,6 +396,10 @@ class PlatformTable(MetaFileTable):
         result = [ [r[2],r[3],r[4],r[5],r[6],r[7],r[0],r[9]] for r in result ]\r
         return result\r
 \r
+    def DisableComponent(self,comp_id):\r
+        for item in self.CurrentContent:\r
+            if item[0] == comp_id or item[8] == comp_id:\r
+                item[-1] = -1\r
 \r
 ## Factory class to produce different storage for different type of meta-file\r
 class MetaFileStorage(object):\r