Re: [edk2] [Patch] BaseTools: Enable component override functionality

2019-02-23 Thread Feng, Bob C
Felix,

I agree. I filed a new  BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1557 
to track the document update.
I think this new behavior would be better to be recorded in the Build spec.

Thanks,
Bob
-Original Message-
From: Felix Polyudov [mailto:fel...@ami.com] 
Sent: Saturday, February 23, 2019 6:06 AM
To: Feng, Bob C ; edk2-devel@lists.01.org
Cc: Carsey, Jaben ; Gao, Liming 
Subject: RE: [edk2] [Patch] BaseTools: Enable component override functionality

Bob,

Do you know if DSC specification has been updated to document this new behavior?
If not, it should be updated.

-Original Message-
From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of BobCF
Sent: Thursday, January 10, 2019 9:39 PM
To: edk2-devel@lists.01.org
Cc: Carsey Jaben; Liming Gao
Subject: [edk2] [Patch] BaseTools: Enable component override functionality

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 
Cc: Liming Gao 
Cc: Carsey Jaben 
---
 .../Source/Python/Workspace/DscBuildData.py   | 24 ---
 .../Source/Python/Workspace/MetaFileParser.py |  5   
.../Source/Python/Workspace/MetaFileTable.py  |  7 --
 3 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py 
b/BaseTools/Source/Python/Workspace/DscBuildData.py
index 7e82e8e934..f9805f58f5 100644
--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
@@ -704,36 +704,44 @@ class DscBuildData(PlatformBuildClassObject):
 if TAB_DEFAULT_STORES_DEFAULT not in self.DefaultStores:
 self.DefaultStores[TAB_DEFAULT_STORES_DEFAULT] = (0, 
TAB_DEFAULT_STORES_DEFAULT)
 GlobalData.gDefaultStores = sorted(self.DefaultStores.keys())
 return self.DefaultStores
 
+def OverrideDuplicateModule(self):
+RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]
+Macros = self._Macros
+Macros["EDK_SOURCE"] = GlobalData.gEcpSource
+Components = {}
+for Record in RecordList:
+ModuleId = Record[6]
+file_guid = self._RawData[MODEL_META_DATA_HEADER, self._Arch, 
None, ModuleId]
+file_guid_str = file_guid[0][2] if file_guid else "NULL"
+ModuleFile = PathClass(NormPath(Record[0], Macros), 
GlobalData.gWorkspace, Arch=self._Arch)
+if self._Arch != TAB_ARCH_COMMON and 
(file_guid_str,str(ModuleFile)) in Components:
+
self._RawData.DisableOverrideComponent(Components[(file_guid_str,str(ModuleFile))])
+Components[(file_guid_str,str(ModuleFile))] = ModuleId
+self._RawData._PostProcessed = False
 ## Retrieve [Components] section information
 @property
 def Modules(self):
 if self._Modules is not None:
 return self._Modules
-
+self.OverrideDuplicateModule()
 self._Modules = OrderedDict()
 RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]
 Macros = self._Macros
 Macros["EDK_SOURCE"] = GlobalData.gEcpSource
 for Record in RecordList:
-DuplicatedFile = False
-
 ModuleFile = PathClass(NormPath(Record[0], Macros), 
GlobalData.gWorkspace, Arch=self._Arch)
 ModuleId = Record[6]
 LineNo = Record[7]
 
 # check the file validation
 ErrorCode, ErrorInfo = ModuleFile.Validate('.inf')
 if ErrorCode != 0:
 EdkLogger.error('build', ErrorCode, File=self.MetaFile, 
Line=LineNo,
 ExtraData=ErrorInfo)
-# Check duplication
-# If arch is COMMON, no duplicate module is checked since all 
modules in all component sections are selected
-if self._Arch != TAB_ARCH_COMMON and ModuleFile in self._Modules:
-DuplicatedFile = True
 
 Module = ModuleBuildClassObject()
 Module.MetaFile = ModuleFile
 
 # get module private library instance @@ -792,12 +800,10 @@ class 
DscBuildData(PlatformBuildClassObject):
 else:
 OptionString = Module.BuildOptions[ToolChainFamily, 
ToolChain]
 Module.BuildOptions[ToolChainFamily, ToolChain] = 
OptionString + " " + Option
 
 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, 
None, ModuleId]
-if DuplicatedFile and not RecordList:
-EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, 
ExtraData=str(ModuleFile), Line=LineNo)
 if RecordList:
 if len(RecordList) != 1:
 EdkLogger.error('build', OPTION_UNKNOWN, 'O

Re: [edk2] [Patch] BaseTools: Enable component override functionality

2019-02-22 Thread Felix Polyudov
Bob,

Do you know if DSC specification has been updated to document this new behavior?
If not, it should be updated.

-Original Message-
From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of BobCF
Sent: Thursday, January 10, 2019 9:39 PM
To: edk2-devel@lists.01.org
Cc: Carsey Jaben; Liming Gao
Subject: [edk2] [Patch] BaseTools: Enable component override functionality

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 
Cc: Liming Gao 
Cc: Carsey Jaben 
---
 .../Source/Python/Workspace/DscBuildData.py   | 24 ---
 .../Source/Python/Workspace/MetaFileParser.py |  5 
 .../Source/Python/Workspace/MetaFileTable.py  |  7 --
 3 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py 
b/BaseTools/Source/Python/Workspace/DscBuildData.py
index 7e82e8e934..f9805f58f5 100644
--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
@@ -704,36 +704,44 @@ class DscBuildData(PlatformBuildClassObject):
 if TAB_DEFAULT_STORES_DEFAULT not in self.DefaultStores:
 self.DefaultStores[TAB_DEFAULT_STORES_DEFAULT] = (0, 
TAB_DEFAULT_STORES_DEFAULT)
 GlobalData.gDefaultStores = sorted(self.DefaultStores.keys())
 return self.DefaultStores
 
+def OverrideDuplicateModule(self):
+RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]
+Macros = self._Macros
+Macros["EDK_SOURCE"] = GlobalData.gEcpSource
+Components = {}
+for Record in RecordList:
+ModuleId = Record[6]
+file_guid = self._RawData[MODEL_META_DATA_HEADER, self._Arch, 
None, ModuleId]
+file_guid_str = file_guid[0][2] if file_guid else "NULL"
+ModuleFile = PathClass(NormPath(Record[0], Macros), 
GlobalData.gWorkspace, Arch=self._Arch)
+if self._Arch != TAB_ARCH_COMMON and 
(file_guid_str,str(ModuleFile)) in Components:
+
self._RawData.DisableOverrideComponent(Components[(file_guid_str,str(ModuleFile))])
+Components[(file_guid_str,str(ModuleFile))] = ModuleId
+self._RawData._PostProcessed = False
 ## Retrieve [Components] section information
 @property
 def Modules(self):
 if self._Modules is not None:
 return self._Modules
-
+self.OverrideDuplicateModule()
 self._Modules = OrderedDict()
 RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]
 Macros = self._Macros
 Macros["EDK_SOURCE"] = GlobalData.gEcpSource
 for Record in RecordList:
-DuplicatedFile = False
-
 ModuleFile = PathClass(NormPath(Record[0], Macros), 
GlobalData.gWorkspace, Arch=self._Arch)
 ModuleId = Record[6]
 LineNo = Record[7]
 
 # check the file validation
 ErrorCode, ErrorInfo = ModuleFile.Validate('.inf')
 if ErrorCode != 0:
 EdkLogger.error('build', ErrorCode, File=self.MetaFile, 
Line=LineNo,
 ExtraData=ErrorInfo)
-# Check duplication
-# If arch is COMMON, no duplicate module is checked since all 
modules in all component sections are selected
-if self._Arch != TAB_ARCH_COMMON and ModuleFile in self._Modules:
-DuplicatedFile = True
 
 Module = ModuleBuildClassObject()
 Module.MetaFile = ModuleFile
 
 # get module private library instance
@@ -792,12 +800,10 @@ class DscBuildData(PlatformBuildClassObject):
 else:
 OptionString = Module.BuildOptions[ToolChainFamily, 
ToolChain]
 Module.BuildOptions[ToolChainFamily, ToolChain] = 
OptionString + " " + Option
 
 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, 
None, ModuleId]
-if DuplicatedFile and not RecordList:
-EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, 
ExtraData=str(ModuleFile), Line=LineNo)
 if RecordList:
 if len(RecordList) != 1:
 EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID 
can be listed in  section.',
 File=self.MetaFile, 
ExtraData=str(ModuleFile), Line=LineNo)
 ModuleFile = ProcessDuplicatedInf(ModuleFile, 
RecordList[0][2], GlobalData.gWorkspace)
diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py 
b/BaseTools/Source/Python/Workspace/MetaFileParser.py
index 032220813b..a52e9229df 100644
--- a/BaseTools/Source/Python/Workspace/MetaFileParser.py
+++ b/BaseTools/S

Re: [edk2] [Patch] BaseTools: Enable component override functionality

2019-01-13 Thread Ard Biesheuvel
On Mon, 14 Jan 2019 at 08:22, Gao, Liming  wrote:
>
> Ard:
>   Could you let me know which platform do you use? We will verify it for the 
> base tools change.
>

I use a CI job here

https://ci.linaro.org/view/leg-ci/job/leg-virt-tianocore-edk2-upstream/

that builds 
{ArmPkg,ArmPlatformPkg,EmbeddedPkg,ArmVirtQemu,ArmVirtXen,ArmVirtQemuKernel}
x {DEBUG,RELEASE,NOOPT} x {GCC48,GCC49,GCC5,CLANG35,CLANG38} and
{OvmfIa32,OvmfIa32X64,OvmfX64} x {DEBUG,RELEASE,NOOPT} with GCC5 only.

If anyone wants to be added to cc for the failure reports, I can
easily add them.

Thanks,
Ard.



> Thanks
> Liming
> >-Original Message-
> >From: Feng, Bob C
> >Sent: Monday, January 14, 2019 3:19 PM
> >To: Ard Biesheuvel ; Gao, Liming
> >
> >Cc: edk2-devel@lists.01.org; Carsey, Jaben 
> >Subject: RE: [edk2] [Patch] BaseTools: Enable component override
> >functionality
> >
> >Sorry for break your build.
> >
> >Yes. I'll double test the code before pushing it next time.
> >
> >-Bob
> >
> >-Original Message-
> >From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
> >Sent: Monday, January 14, 2019 3:11 PM
> >To: Gao, Liming 
> >Cc: Feng, Bob C ; edk2-devel@lists.01.org; Carsey,
> >Jaben 
> >Subject: Re: [edk2] [Patch] BaseTools: Enable component override
> >functionality
> >
> >On Mon, 14 Jan 2019 at 08:01, Gao, Liming  wrote:
> >>
> >> Ard:
> >>   Sorry for this break, Bob just sent hot fix for this issue in
> >https://lists.01.org/pipermail/edk2-devel/2019-January/034947.html. Could
> >you verify it?
> >>   In fact, it is caused by previous patch to remove EDK support in 
> >> BaseTools
> >Python code.
> >>
> >
> >OK, that patch fixes it for me.
> >
> >But may I kindly suggest that Bob tests his code before pushing it? Thanks.
> >
> >
> >> >-Original Message-
> >> >From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
> >> >Sent: Monday, January 14, 2019 2:58 PM
> >> >To: Gao, Liming 
> >> >Cc: Feng, Bob C ; edk2-devel@lists.01.org;
> >> >Carsey, Jaben 
> >> >Subject: Re: [edk2] [Patch] BaseTools: Enable component override
> >> >functionality
> >> >
> >> >On Mon, 14 Jan 2019 at 04:00, Gao, Liming  wrote:
> >> >>
> >> >> Reviewed-by: Liming Gao 
> >> >>
> >> >
> >> >This patch breaks the build on AArch64/GGC:
> >> >
> >> >(Python 2.7.13 on linux2) Traceback (most recent call last):
> >> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >> >upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Pytho
> >n/
> >> >b
> >> >uild/build.py",>
> >> >line 2403, in Main
> >> >MyBuild.Launch()
> >> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >> >upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Pytho
> >n/
> >> >b
> >> >uild/build.py",>
> >> >line 2137, in Launch
> >> >self._MultiThreadBuildPlatform()
> >> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >> >upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Pytho
> >n/
> >> >b
> >> >uild/build.py",>
> >> >line 1917, in _MultiThreadBuildPlatform
> >> >self.Progress
> >> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >> >upstream/ws/edk2/BaseTools/Source/Python/AutoGen/AutoGen.py",>
> >> >line 239, in __init__
> >> >self._InitWorker(Workspace, MetaFile, Target, Toolchain, Arch,
> >> >*args, **kwargs)
> >> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >> >upstream/ws/edk2/BaseTools/Source/Python/AutoGen/AutoGen.py",>
> >> >line 403, in _InitWorker
> >> >PlatformPcds = Platform.Pcds
> >> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.p
> >y",>
> >> >line 1194, in Pcds
> >> >self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST,
> >> >self._Pcds)
> >> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.p
> >y",>
> >> >line 148

Re: [edk2] [Patch] BaseTools: Enable component override functionality

2019-01-13 Thread Gao, Liming
Ard:
  Could you let me know which platform do you use? We will verify it for the 
base tools change. 

Thanks
Liming
>-Original Message-
>From: Feng, Bob C
>Sent: Monday, January 14, 2019 3:19 PM
>To: Ard Biesheuvel ; Gao, Liming
>
>Cc: edk2-devel@lists.01.org; Carsey, Jaben 
>Subject: RE: [edk2] [Patch] BaseTools: Enable component override
>functionality
>
>Sorry for break your build.
>
>Yes. I'll double test the code before pushing it next time.
>
>-Bob
>
>-Original Message-
>From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
>Sent: Monday, January 14, 2019 3:11 PM
>To: Gao, Liming 
>Cc: Feng, Bob C ; edk2-devel@lists.01.org; Carsey,
>Jaben 
>Subject: Re: [edk2] [Patch] BaseTools: Enable component override
>functionality
>
>On Mon, 14 Jan 2019 at 08:01, Gao, Liming  wrote:
>>
>> Ard:
>>   Sorry for this break, Bob just sent hot fix for this issue in
>https://lists.01.org/pipermail/edk2-devel/2019-January/034947.html. Could
>you verify it?
>>   In fact, it is caused by previous patch to remove EDK support in BaseTools
>Python code.
>>
>
>OK, that patch fixes it for me.
>
>But may I kindly suggest that Bob tests his code before pushing it? Thanks.
>
>
>> >-Original Message-
>> >From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
>> >Sent: Monday, January 14, 2019 2:58 PM
>> >To: Gao, Liming 
>> >Cc: Feng, Bob C ; edk2-devel@lists.01.org;
>> >Carsey, Jaben 
>> >Subject: Re: [edk2] [Patch] BaseTools: Enable component override
>> >functionality
>> >
>> >On Mon, 14 Jan 2019 at 04:00, Gao, Liming  wrote:
>> >>
>> >> Reviewed-by: Liming Gao 
>> >>
>> >
>> >This patch breaks the build on AArch64/GGC:
>> >
>> >(Python 2.7.13 on linux2) Traceback (most recent call last):
>> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>> >upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Pytho
>n/
>> >b
>> >uild/build.py",>
>> >line 2403, in Main
>> >MyBuild.Launch()
>> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>> >upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Pytho
>n/
>> >b
>> >uild/build.py",>
>> >line 2137, in Launch
>> >self._MultiThreadBuildPlatform()
>> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>> >upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Pytho
>n/
>> >b
>> >uild/build.py",>
>> >line 1917, in _MultiThreadBuildPlatform
>> >self.Progress
>> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>> >upstream/ws/edk2/BaseTools/Source/Python/AutoGen/AutoGen.py",>
>> >line 239, in __init__
>> >self._InitWorker(Workspace, MetaFile, Target, Toolchain, Arch,
>> >*args, **kwargs)
>> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>> >upstream/ws/edk2/BaseTools/Source/Python/AutoGen/AutoGen.py",>
>> >line 403, in _InitWorker
>> >PlatformPcds = Platform.Pcds
>> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.p
>y",>
>> >line 1194, in Pcds
>> >self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST,
>> >self._Pcds)
>> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.p
>y",>
>> >line 1486, in UpdateStructuredPcds
>> >for Pcd in self.DecPcds:
>> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.p
>y",>
>> >line 3183, in DecPcds
>> >self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb,
>> >self._Arch, self._Target, self._Toolchain, PkgSet)
>> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/WorkspaceCo
>mm
>> >on.py",>
>> >line 62, in GetDeclaredPcd
>> >PkgList = GetPackageList(Platform, BuildDatabase, Arch, Target,
>> >Toolchain)
>> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/WorkspaceCo
>mm
>> >on.py",>
>> >line 44, in GetPackageList
>>

Re: [edk2] [Patch] BaseTools: Enable component override functionality

2019-01-13 Thread Feng, Bob C
Sorry for break your build.

Yes. I'll double test the code before pushing it next time.

-Bob

-Original Message-
From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org] 
Sent: Monday, January 14, 2019 3:11 PM
To: Gao, Liming 
Cc: Feng, Bob C ; edk2-devel@lists.01.org; Carsey, Jaben 

Subject: Re: [edk2] [Patch] BaseTools: Enable component override functionality

On Mon, 14 Jan 2019 at 08:01, Gao, Liming  wrote:
>
> Ard:
>   Sorry for this break, Bob just sent hot fix for this issue in 
> https://lists.01.org/pipermail/edk2-devel/2019-January/034947.html. Could you 
> verify it?
>   In fact, it is caused by previous patch to remove EDK support in BaseTools 
> Python code.
>

OK, that patch fixes it for me.

But may I kindly suggest that Bob tests his code before pushing it? Thanks.


> >-Original Message-
> >From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
> >Sent: Monday, January 14, 2019 2:58 PM
> >To: Gao, Liming 
> >Cc: Feng, Bob C ; edk2-devel@lists.01.org; 
> >Carsey, Jaben 
> >Subject: Re: [edk2] [Patch] BaseTools: Enable component override 
> >functionality
> >
> >On Mon, 14 Jan 2019 at 04:00, Gao, Liming  wrote:
> >>
> >> Reviewed-by: Liming Gao 
> >>
> >
> >This patch breaks the build on AArch64/GGC:
> >
> >(Python 2.7.13 on linux2) Traceback (most recent call last):
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Python/
> >b
> >uild/build.py",>
> >line 2403, in Main
> >MyBuild.Launch()
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Python/
> >b
> >uild/build.py",>
> >line 2137, in Launch
> >self._MultiThreadBuildPlatform()
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Python/
> >b
> >uild/build.py",>
> >line 1917, in _MultiThreadBuildPlatform
> >self.Progress
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/AutoGen/AutoGen.py",>
> >line 239, in __init__
> >self._InitWorker(Workspace, MetaFile, Target, Toolchain, Arch, 
> >*args, **kwargs)
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/AutoGen/AutoGen.py",>
> >line 403, in _InitWorker
> >PlatformPcds = Platform.Pcds
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
> >line 1194, in Pcds
> >self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, 
> >self._Pcds)
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
> >line 1486, in UpdateStructuredPcds
> >for Pcd in self.DecPcds:
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
> >line 3183, in DecPcds
> >self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, 
> >self._Arch, self._Target, self._Toolchain, PkgSet)
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/WorkspaceComm
> >on.py",>
> >line 62, in GetDeclaredPcd
> >PkgList = GetPackageList(Platform, BuildDatabase, Arch, Target, 
> >Toolchain)
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/WorkspaceComm
> >on.py",>
> >line 44, in GetPackageList
> >for ModuleFile in Platform.Modules:
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
> >line 728, in Modules
> >self.OverrideDuplicateModule()
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
> >line 712, in OverrideDuplicateModule
> >Macros["EDK_SOURCE"] = GlobalData.gEcpSource
> >AttributeError: 'module' object has no attribute 'gEcpSource'
> >
> >
> >
> >> >-Original Message-
> >> >From: Feng, Bob C
> >> >Sent: Friday, January 11, 2019 10:39

Re: [edk2] [Patch] BaseTools: Enable component override functionality

2019-01-13 Thread Ard Biesheuvel
On Mon, 14 Jan 2019 at 08:01, Gao, Liming  wrote:
>
> Ard:
>   Sorry for this break, Bob just sent hot fix for this issue in 
> https://lists.01.org/pipermail/edk2-devel/2019-January/034947.html. Could you 
> verify it?
>   In fact, it is caused by previous patch to remove EDK support in BaseTools 
> Python code.
>

OK, that patch fixes it for me.

But may I kindly suggest that Bob tests his code before pushing it? Thanks.


> >-Original Message-
> >From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
> >Sent: Monday, January 14, 2019 2:58 PM
> >To: Gao, Liming 
> >Cc: Feng, Bob C ; edk2-devel@lists.01.org; Carsey,
> >Jaben 
> >Subject: Re: [edk2] [Patch] BaseTools: Enable component override
> >functionality
> >
> >On Mon, 14 Jan 2019 at 04:00, Gao, Liming  wrote:
> >>
> >> Reviewed-by: Liming Gao 
> >>
> >
> >This patch breaks the build on AArch64/GGC:
> >
> >(Python 2.7.13 on linux2) Traceback (most recent call last):
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Python/b
> >uild/build.py",>
> >line 2403, in Main
> >MyBuild.Launch()
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Python/b
> >uild/build.py",>
> >line 2137, in Launch
> >self._MultiThreadBuildPlatform()
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Python/b
> >uild/build.py",>
> >line 1917, in _MultiThreadBuildPlatform
> >self.Progress
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/AutoGen/AutoGen.py",>
> >line 239, in __init__
> >self._InitWorker(Workspace, MetaFile, Target, Toolchain, Arch,
> >*args, **kwargs)
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/AutoGen/AutoGen.py",>
> >line 403, in _InitWorker
> >PlatformPcds = Platform.Pcds
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
> >line 1194, in Pcds
> >self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, self._Pcds)
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
> >line 1486, in UpdateStructuredPcds
> >for Pcd in self.DecPcds:
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
> >line 3183, in DecPcds
> >self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb,
> >self._Arch, self._Target, self._Toolchain, PkgSet)
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/WorkspaceComm
> >on.py",>
> >line 62, in GetDeclaredPcd
> >PkgList = GetPackageList(Platform, BuildDatabase, Arch, Target, 
> > Toolchain)
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/WorkspaceComm
> >on.py",>
> >line 44, in GetPackageList
> >for ModuleFile in Platform.Modules:
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
> >line 728, in Modules
> >self.OverrideDuplicateModule()
> >  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
> >upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
> >line 712, in OverrideDuplicateModule
> >Macros["EDK_SOURCE"] = GlobalData.gEcpSource
> >AttributeError: 'module' object has no attribute 'gEcpSource'
> >
> >
> >
> >> >-Original Message-
> >> >From: Feng, Bob C
> >> >Sent: Friday, January 11, 2019 10:39 AM
> >> >To: edk2-devel@lists.01.org
> >> >Cc: Feng, Bob C ; Gao, Liming
> >> >; Carsey, Jaben 
> >> >Subject: [Patch] BaseTools: Enable component override functionality
> >> >
> >> >https://bugzilla.tianocore.org/show_bug.cgi?id=1449
> >> >This patch enable build tools to recognize that
> >> >when two given files have the same

Re: [edk2] [Patch] BaseTools: Enable component override functionality

2019-01-13 Thread Gao, Liming
Ard:
  Sorry for this break, Bob just sent hot fix for this issue in 
https://lists.01.org/pipermail/edk2-devel/2019-January/034947.html. Could you 
verify it?
  In fact, it is caused by previous patch to remove EDK support in BaseTools 
Python code. 

Thanks
Liming
>-Original Message-
>From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
>Sent: Monday, January 14, 2019 2:58 PM
>To: Gao, Liming 
>Cc: Feng, Bob C ; edk2-devel@lists.01.org; Carsey,
>Jaben 
>Subject: Re: [edk2] [Patch] BaseTools: Enable component override
>functionality
>
>On Mon, 14 Jan 2019 at 04:00, Gao, Liming  wrote:
>>
>> Reviewed-by: Liming Gao 
>>
>
>This patch breaks the build on AArch64/GGC:
>
>(Python 2.7.13 on linux2) Traceback (most recent call last):
>  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Python/b
>uild/build.py",>
>line 2403, in Main
>MyBuild.Launch()
>  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Python/b
>uild/build.py",>
>line 2137, in Launch
>self._MultiThreadBuildPlatform()
>  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>upstream/ws/edk2/BaseTools/BinWrappers/PosixLike/../../Source/Python/b
>uild/build.py",>
>line 1917, in _MultiThreadBuildPlatform
>self.Progress
>  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>upstream/ws/edk2/BaseTools/Source/Python/AutoGen/AutoGen.py",>
>line 239, in __init__
>self._InitWorker(Workspace, MetaFile, Target, Toolchain, Arch,
>*args, **kwargs)
>  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>upstream/ws/edk2/BaseTools/Source/Python/AutoGen/AutoGen.py",>
>line 403, in _InitWorker
>PlatformPcds = Platform.Pcds
>  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
>line 1194, in Pcds
>self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, self._Pcds)
>  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
>line 1486, in UpdateStructuredPcds
>for Pcd in self.DecPcds:
>  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
>line 3183, in DecPcds
>self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb,
>self._Arch, self._Target, self._Toolchain, PkgSet)
>  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>upstream/ws/edk2/BaseTools/Source/Python/Workspace/WorkspaceComm
>on.py",>
>line 62, in GetDeclaredPcd
>PkgList = GetPackageList(Platform, BuildDatabase, Arch, Target, Toolchain)
>  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>upstream/ws/edk2/BaseTools/Source/Python/Workspace/WorkspaceComm
>on.py",>
>line 44, in GetPackageList
>for ModuleFile in Platform.Modules:
>  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
>line 728, in Modules
>self.OverrideDuplicateModule()
>  File "<https://ci.linaro.org/job/leg-virt-tianocore-edk2-
>upstream/ws/edk2/BaseTools/Source/Python/Workspace/DscBuildData.py",>
>line 712, in OverrideDuplicateModule
>Macros["EDK_SOURCE"] = GlobalData.gEcpSource
>AttributeError: 'module' object has no attribute 'gEcpSource'
>
>
>
>> >-Original Message-
>> >From: Feng, Bob C
>> >Sent: Friday, January 11, 2019 10:39 AM
>> >To: edk2-devel@lists.01.org
>> >Cc: Feng, Bob C ; Gao, Liming
>> >; Carsey, Jaben 
>> >Subject: [Patch] BaseTools: Enable component override functionality
>> >
>> >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 
>> >Cc: Liming Gao 
>> >Cc: Carsey Jaben 
>> >---
>> > .../Source/Python/Workspace/DscBuildData.py   | 24 --
>-
>> > .../Source/Python/Workspace/MetaFileParser.py |  5 
>> > .../Source/Python/Workspace/MetaFileTable.py  |  7 --
>> > 3 files changed, 25 insertions(+), 11 deletions(-)
>> >
>> >diff --g

Re: [edk2] [Patch] BaseTools: Enable component override functionality

2019-01-13 Thread Ard Biesheuvel
On Mon, 14 Jan 2019 at 04:00, Gao, Liming  wrote:
>
> Reviewed-by: Liming Gao 
>

This patch breaks the build on AArch64/GGC:

(Python 2.7.13 on linux2) Traceback (most recent call last):
  File 
"
line 2403, in Main
MyBuild.Launch()
  File 
"
line 2137, in Launch
self._MultiThreadBuildPlatform()
  File 
"
line 1917, in _MultiThreadBuildPlatform
self.Progress
  File 
"
line 239, in __init__
self._InitWorker(Workspace, MetaFile, Target, Toolchain, Arch,
*args, **kwargs)
  File 
"
line 403, in _InitWorker
PlatformPcds = Platform.Pcds
  File 
"
line 1194, in Pcds
self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, self._Pcds)
  File 
"
line 1486, in UpdateStructuredPcds
for Pcd in self.DecPcds:
  File 
"
line 3183, in DecPcds
self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb,
self._Arch, self._Target, self._Toolchain, PkgSet)
  File 
"
line 62, in GetDeclaredPcd
PkgList = GetPackageList(Platform, BuildDatabase, Arch, Target, Toolchain)
  File 
"
line 44, in GetPackageList
for ModuleFile in Platform.Modules:
  File 
"
line 728, in Modules
self.OverrideDuplicateModule()
  File 
"
line 712, in OverrideDuplicateModule
Macros["EDK_SOURCE"] = GlobalData.gEcpSource
AttributeError: 'module' object has no attribute 'gEcpSource'



> >-Original Message-
> >From: Feng, Bob C
> >Sent: Friday, January 11, 2019 10:39 AM
> >To: edk2-devel@lists.01.org
> >Cc: Feng, Bob C ; Gao, Liming
> >; Carsey, Jaben 
> >Subject: [Patch] BaseTools: Enable component override functionality
> >
> >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 
> >Cc: Liming Gao 
> >Cc: Carsey Jaben 
> >---
> > .../Source/Python/Workspace/DscBuildData.py   | 24 ---
> > .../Source/Python/Workspace/MetaFileParser.py |  5 
> > .../Source/Python/Workspace/MetaFileTable.py  |  7 --
> > 3 files changed, 25 insertions(+), 11 deletions(-)
> >
> >diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py
> >b/BaseTools/Source/Python/Workspace/DscBuildData.py
> >index 7e82e8e934..f9805f58f5 100644
> >--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
> >+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
> >@@ -704,36 +704,44 @@ class DscBuildData(PlatformBuildClassObject):
> > if TAB_DEFAULT_STORES_DEFAULT not in self.DefaultStores:
> > self.DefaultStores[TAB_DEFAULT_STORES_DEFAULT] = (0,
> >TAB_DEFAULT_STORES_DEFAULT)
> > GlobalData.gDefaultStores = sorted(self.DefaultStores.keys())
> > return self.DefaultStores
> >
> >+def OverrideDuplicateModule(self):
> >+RecordList = self._RawData[MODEL_META_DATA_COMPONENT,
> >self._Arch]
> >+Macros = self._Macros
> >+Macros["EDK_SOURCE"] = GlobalData.gEcpSource
> >+Components = {}
> >+for Record in RecordList:
> >+ModuleId = Record[6]
> >+file_guid = self._RawData[MODEL_META_DATA_HEADER, self._Arch,
> >None, ModuleId]
> >+file_guid_str = file_guid[0][2] if file_guid else "NULL"
> >+ModuleFile = PathClass(NormPath(Record[0], Macros),
> >GlobalData.gWorkspace, Arch=self._Arch)
> >+if self._Arch != TAB_ARCH_COMMON and
> >(file_guid_str,str(ModuleFile)) in 

Re: [edk2] [Patch] BaseTools: Enable component override functionality

2019-01-13 Thread Gao, Liming
Reviewed-by: Liming Gao 

>-Original Message-
>From: Feng, Bob C
>Sent: Friday, January 11, 2019 10:39 AM
>To: edk2-devel@lists.01.org
>Cc: Feng, Bob C ; Gao, Liming
>; Carsey, Jaben 
>Subject: [Patch] BaseTools: Enable component override functionality
>
>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 
>Cc: Liming Gao 
>Cc: Carsey Jaben 
>---
> .../Source/Python/Workspace/DscBuildData.py   | 24 ---
> .../Source/Python/Workspace/MetaFileParser.py |  5 
> .../Source/Python/Workspace/MetaFileTable.py  |  7 --
> 3 files changed, 25 insertions(+), 11 deletions(-)
>
>diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py
>b/BaseTools/Source/Python/Workspace/DscBuildData.py
>index 7e82e8e934..f9805f58f5 100644
>--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
>+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
>@@ -704,36 +704,44 @@ class DscBuildData(PlatformBuildClassObject):
> if TAB_DEFAULT_STORES_DEFAULT not in self.DefaultStores:
> self.DefaultStores[TAB_DEFAULT_STORES_DEFAULT] = (0,
>TAB_DEFAULT_STORES_DEFAULT)
> GlobalData.gDefaultStores = sorted(self.DefaultStores.keys())
> return self.DefaultStores
>
>+def OverrideDuplicateModule(self):
>+RecordList = self._RawData[MODEL_META_DATA_COMPONENT,
>self._Arch]
>+Macros = self._Macros
>+Macros["EDK_SOURCE"] = GlobalData.gEcpSource
>+Components = {}
>+for Record in RecordList:
>+ModuleId = Record[6]
>+file_guid = self._RawData[MODEL_META_DATA_HEADER, self._Arch,
>None, ModuleId]
>+file_guid_str = file_guid[0][2] if file_guid else "NULL"
>+ModuleFile = PathClass(NormPath(Record[0], Macros),
>GlobalData.gWorkspace, Arch=self._Arch)
>+if self._Arch != TAB_ARCH_COMMON and
>(file_guid_str,str(ModuleFile)) in Components:
>+
>self._RawData.DisableOverrideComponent(Components[(file_guid_str,str(M
>oduleFile))])
>+Components[(file_guid_str,str(ModuleFile))] = ModuleId
>+self._RawData._PostProcessed = False
> ## Retrieve [Components] section information
> @property
> def Modules(self):
> if self._Modules is not None:
> return self._Modules
>-
>+self.OverrideDuplicateModule()
> self._Modules = OrderedDict()
> RecordList = self._RawData[MODEL_META_DATA_COMPONENT,
>self._Arch]
> Macros = self._Macros
> Macros["EDK_SOURCE"] = GlobalData.gEcpSource
> for Record in RecordList:
>-DuplicatedFile = False
>-
> ModuleFile = PathClass(NormPath(Record[0], Macros),
>GlobalData.gWorkspace, Arch=self._Arch)
> ModuleId = Record[6]
> LineNo = Record[7]
>
> # check the file validation
> ErrorCode, ErrorInfo = ModuleFile.Validate('.inf')
> if ErrorCode != 0:
> EdkLogger.error('build', ErrorCode, File=self.MetaFile, 
> Line=LineNo,
> ExtraData=ErrorInfo)
>-# Check duplication
>-# If arch is COMMON, no duplicate module is checked since all 
>modules
>in all component sections are selected
>-if self._Arch != TAB_ARCH_COMMON and ModuleFile in self._Modules:
>-DuplicatedFile = True
>
> Module = ModuleBuildClassObject()
> Module.MetaFile = ModuleFile
>
> # get module private library instance
>@@ -792,12 +800,10 @@ class DscBuildData(PlatformBuildClassObject):
> else:
> OptionString = Module.BuildOptions[ToolChainFamily, 
> ToolChain]
> Module.BuildOptions[ToolChainFamily, ToolChain] = 
> OptionString +
>" " + Option
>
> RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch,
>None, ModuleId]
>-if DuplicatedFile and not RecordList:
>-EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile,
>ExtraData=str(ModuleFile), Line=LineNo)
> if RecordList:
> if len(RecordList) != 1:
> EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID 
> can
>be listed in  section.',
> File=self.MetaFile, 
> ExtraData=str(ModuleFile), Line=LineNo)
> ModuleFile = ProcessDuplicatedInf(ModuleFile, 
> RecordList[0][2],
>GlobalData.gWorkspace)
>diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py
>b/BaseTools/Source/Python/Workspace/MetaFileParser.py
>index 032220813b..a52e9229df 100644
>--- a/BaseTools/Source/Python/Workspace/MetaFileParser.py
>+++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py
>@@ -1711,10 +1711,15 @@ class 

[edk2] [Patch] BaseTools: Enable component override functionality

2019-01-10 Thread BobCF
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 
Cc: Liming Gao 
Cc: Carsey Jaben 
---
 .../Source/Python/Workspace/DscBuildData.py   | 24 ---
 .../Source/Python/Workspace/MetaFileParser.py |  5 
 .../Source/Python/Workspace/MetaFileTable.py  |  7 --
 3 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py 
b/BaseTools/Source/Python/Workspace/DscBuildData.py
index 7e82e8e934..f9805f58f5 100644
--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
@@ -704,36 +704,44 @@ class DscBuildData(PlatformBuildClassObject):
 if TAB_DEFAULT_STORES_DEFAULT not in self.DefaultStores:
 self.DefaultStores[TAB_DEFAULT_STORES_DEFAULT] = (0, 
TAB_DEFAULT_STORES_DEFAULT)
 GlobalData.gDefaultStores = sorted(self.DefaultStores.keys())
 return self.DefaultStores
 
+def OverrideDuplicateModule(self):
+RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]
+Macros = self._Macros
+Macros["EDK_SOURCE"] = GlobalData.gEcpSource
+Components = {}
+for Record in RecordList:
+ModuleId = Record[6]
+file_guid = self._RawData[MODEL_META_DATA_HEADER, self._Arch, 
None, ModuleId]
+file_guid_str = file_guid[0][2] if file_guid else "NULL"
+ModuleFile = PathClass(NormPath(Record[0], Macros), 
GlobalData.gWorkspace, Arch=self._Arch)
+if self._Arch != TAB_ARCH_COMMON and 
(file_guid_str,str(ModuleFile)) in Components:
+
self._RawData.DisableOverrideComponent(Components[(file_guid_str,str(ModuleFile))])
+Components[(file_guid_str,str(ModuleFile))] = ModuleId
+self._RawData._PostProcessed = False
 ## Retrieve [Components] section information
 @property
 def Modules(self):
 if self._Modules is not None:
 return self._Modules
-
+self.OverrideDuplicateModule()
 self._Modules = OrderedDict()
 RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]
 Macros = self._Macros
 Macros["EDK_SOURCE"] = GlobalData.gEcpSource
 for Record in RecordList:
-DuplicatedFile = False
-
 ModuleFile = PathClass(NormPath(Record[0], Macros), 
GlobalData.gWorkspace, Arch=self._Arch)
 ModuleId = Record[6]
 LineNo = Record[7]
 
 # check the file validation
 ErrorCode, ErrorInfo = ModuleFile.Validate('.inf')
 if ErrorCode != 0:
 EdkLogger.error('build', ErrorCode, File=self.MetaFile, 
Line=LineNo,
 ExtraData=ErrorInfo)
-# Check duplication
-# If arch is COMMON, no duplicate module is checked since all 
modules in all component sections are selected
-if self._Arch != TAB_ARCH_COMMON and ModuleFile in self._Modules:
-DuplicatedFile = True
 
 Module = ModuleBuildClassObject()
 Module.MetaFile = ModuleFile
 
 # get module private library instance
@@ -792,12 +800,10 @@ class DscBuildData(PlatformBuildClassObject):
 else:
 OptionString = Module.BuildOptions[ToolChainFamily, 
ToolChain]
 Module.BuildOptions[ToolChainFamily, ToolChain] = 
OptionString + " " + Option
 
 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, 
None, ModuleId]
-if DuplicatedFile and not RecordList:
-EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, 
ExtraData=str(ModuleFile), Line=LineNo)
 if RecordList:
 if len(RecordList) != 1:
 EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID 
can be listed in  section.',
 File=self.MetaFile, 
ExtraData=str(ModuleFile), Line=LineNo)
 ModuleFile = ProcessDuplicatedInf(ModuleFile, 
RecordList[0][2], GlobalData.gWorkspace)
diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py 
b/BaseTools/Source/Python/Workspace/MetaFileParser.py
index 032220813b..a52e9229df 100644
--- a/BaseTools/Source/Python/Workspace/MetaFileParser.py
+++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py
@@ -1711,10 +1711,15 @@ class DscParser(MetaFileParser):
 
 def __ProcessBuildOption(self):
 self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=False)
for Value in self._ValueList]
 
+def DisableOverrideComponent(self,module_id):
+for ori_id in self._IdMapping:
+if self._IdMapping[ori_id] == module_id:
+