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
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
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
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
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
\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
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