## @file\r
# This file is used to create a database used by build tool\r
#\r
-# Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2016, Intel Corporation. All rights reserved.<BR>\r
+# (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
# This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
# which accompanies this distribution. The full text of the license may be found at\r
self._PcdInfoFlag = None\r
self._VarCheckFlag = None\r
self._FlashDefinition = None\r
+ self._Prebuild = None\r
+ self._Postbuild = None\r
self._BuildNumber = None\r
self._MakefileName = None\r
self._BsBaseAddress = None\r
if ErrorCode != 0:\r
EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=Record[-1],\r
ExtraData=ErrorInfo)\r
+ elif Name == TAB_DSC_PREBUILD:\r
+ self._Prebuild = PathClass(NormPath(Record[2], self._Macros), GlobalData.gWorkspace)\r
+ elif Name == TAB_DSC_POSTBUILD:\r
+ self._Postbuild = PathClass(NormPath(Record[2], self._Macros), GlobalData.gWorkspace)\r
elif Name == TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES:\r
self._SupArchList = GetSplitValueList(Record[2], TAB_VALUE_SPLIT)\r
elif Name == TAB_DSC_DEFINES_BUILD_TARGETS:\r
self._FlashDefinition = ''\r
return self._FlashDefinition\r
\r
+ def _GetPrebuild(self):\r
+ if self._Prebuild == None:\r
+ if self._Header == None:\r
+ self._GetHeaderInfo()\r
+ if self._Prebuild == None:\r
+ self._Prebuild = ''\r
+ return self._Prebuild\r
+\r
+ def _GetPostbuild(self):\r
+ if self._Postbuild == None:\r
+ if self._Header == None:\r
+ self._GetHeaderInfo()\r
+ if self._Postbuild == None:\r
+ self._Postbuild = ''\r
+ return self._Postbuild\r
+\r
## Retrieve FLASH_DEFINITION\r
def _GetBuildNumber(self):\r
if self._BuildNumber == None:\r
Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
for Record in RecordList:\r
DuplicatedFile = False\r
+\r
ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
ModuleId = Record[5]\r
LineNo = Record[6]\r
PcdInfoFlag = property(_GetPcdInfoFlag)\r
VarCheckFlag = property(_GetVarCheckFlag)\r
FlashDefinition = property(_GetFdfFile)\r
+ Prebuild = property(_GetPrebuild)\r
+ Postbuild = property(_GetPostbuild)\r
BuildNumber = property(_GetBuildNumber)\r
MakefileName = property(_GetMakefileName)\r
BsBaseAddress = property(_GetBsBaseAddress)\r
self._LibraryClasses = None\r
self._Pcds = None\r
self.__Macros = None\r
+ self._PrivateProtocols = None\r
+ self._PrivatePpis = None\r
+ self._PrivateGuids = None\r
+ self._PrivateIncludes = None\r
\r
## Get current effective macros\r
def _GetMacros(self):\r
# protocol defition for given ARCH\r
#\r
ProtocolDict = tdict(True)\r
+ PrivateProtocolDict = tdict(True)\r
NameList = []\r
+ PrivateNameList = []\r
# find out all protocol definitions for specific and 'common' arch\r
RecordList = self._RawData[MODEL_EFI_PROTOCOL, self._Arch]\r
- for Name, Guid, Dummy, Arch, ID, LineNo in RecordList:\r
+ for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
+ if PrivateFlag == 'PRIVATE':\r
+ if Name not in PrivateNameList:\r
+ PrivateNameList.append(Name)\r
+ PrivateProtocolDict[Arch, Name] = Guid\r
if Name not in NameList:\r
NameList.append(Name)\r
ProtocolDict[Arch, Name] = Guid\r
# use sdict to keep the order\r
self._Protocols = sdict()\r
+ self._PrivateProtocols = sdict()\r
for Name in NameList:\r
#\r
# limit the ARCH to self._Arch, if no self._Arch found, tdict\r
# will automatically turn to 'common' ARCH for trying\r
#\r
self._Protocols[Name] = ProtocolDict[self._Arch, Name]\r
+ for Name in PrivateNameList:\r
+ self._PrivateProtocols[Name] = PrivateProtocolDict[self._Arch, Name]\r
return self._Protocols\r
\r
## Retrieve PPI definitions (name/value pairs)\r
# PPI defition for given ARCH\r
#\r
PpiDict = tdict(True)\r
+ PrivatePpiDict = tdict(True)\r
NameList = []\r
+ PrivateNameList = []\r
# find out all PPI definitions for specific arch and 'common' arch\r
RecordList = self._RawData[MODEL_EFI_PPI, self._Arch]\r
- for Name, Guid, Dummy, Arch, ID, LineNo in RecordList:\r
+ for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
+ if PrivateFlag == 'PRIVATE':\r
+ if Name not in PrivateNameList:\r
+ PrivateNameList.append(Name)\r
+ PrivatePpiDict[Arch, Name] = Guid\r
if Name not in NameList:\r
NameList.append(Name)\r
PpiDict[Arch, Name] = Guid\r
# use sdict to keep the order\r
self._Ppis = sdict()\r
+ self._PrivatePpis = sdict()\r
for Name in NameList:\r
#\r
# limit the ARCH to self._Arch, if no self._Arch found, tdict\r
# will automatically turn to 'common' ARCH for trying\r
#\r
self._Ppis[Name] = PpiDict[self._Arch, Name]\r
+ for Name in PrivateNameList:\r
+ self._PrivatePpis[Name] = PrivatePpiDict[self._Arch, Name]\r
return self._Ppis\r
\r
## Retrieve GUID definitions (name/value pairs)\r
# GUID defition for given ARCH\r
#\r
GuidDict = tdict(True)\r
+ PrivateGuidDict = tdict(True)\r
NameList = []\r
+ PrivateNameList = []\r
# find out all protocol definitions for specific and 'common' arch\r
RecordList = self._RawData[MODEL_EFI_GUID, self._Arch]\r
- for Name, Guid, Dummy, Arch, ID, LineNo in RecordList:\r
+ for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
+ if PrivateFlag == 'PRIVATE':\r
+ if Name not in PrivateNameList:\r
+ PrivateNameList.append(Name)\r
+ PrivateGuidDict[Arch, Name] = Guid\r
if Name not in NameList:\r
NameList.append(Name)\r
GuidDict[Arch, Name] = Guid\r
# use sdict to keep the order\r
self._Guids = sdict()\r
+ self._PrivateGuids = sdict()\r
for Name in NameList:\r
#\r
# limit the ARCH to self._Arch, if no self._Arch found, tdict\r
# will automatically turn to 'common' ARCH for trying\r
#\r
self._Guids[Name] = GuidDict[self._Arch, Name]\r
+ for Name in PrivateNameList:\r
+ self._PrivateGuids[Name] = PrivateGuidDict[self._Arch, Name]\r
return self._Guids\r
\r
## Retrieve public include paths declared in this package\r
def _GetInclude(self):\r
if self._Includes == None:\r
self._Includes = []\r
+ self._PrivateIncludes = []\r
RecordList = self._RawData[MODEL_EFI_INCLUDE, self._Arch]\r
Macros = self._Macros\r
Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
# avoid duplicate include path\r
if File not in self._Includes:\r
self._Includes.append(File)\r
+ if Record[4] == 'PRIVATE':\r
+ if File not in self._PrivateIncludes:\r
+ self._PrivateIncludes.append(File)\r
return self._Includes\r
\r
## Retrieve library class declarations (not used in build at present)\r
LibraryClassSet = set()\r
RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch]\r
Macros = self._Macros\r
- for LibraryClass, File, Dummy, Arch, ID, LineNo in RecordList:\r
+ for LibraryClass, File, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
File = PathClass(NormPath(File, Macros), self._PackageDir, Arch=self._Arch)\r
# check the file validation\r
ErrorCode, ErrorInfo = File.Validate()\r
PcdSet = set()\r
# find out all PCDs of the 'type'\r
RecordList = self._RawData[Type, self._Arch]\r
- for TokenSpaceGuid, PcdCName, Setting, Arch, Dummy1, Dummy2 in RecordList:\r
+ for TokenSpaceGuid, PcdCName, Setting, Arch, PrivateFlag, Dummy1, Dummy2 in RecordList:\r
PcdDict[Arch, PcdCName, TokenSpaceGuid] = Setting\r
PcdSet.add((PcdCName, TokenSpaceGuid))\r
\r
RecordList = self._RawData[MODEL_EFI_PROTOCOL, self._Arch, self._Platform]\r
for Record in RecordList:\r
CName = Record[0]\r
- Value = ProtocolValue(CName, self.Packages)\r
+ Value = ProtocolValue(CName, self.Packages, self.MetaFile.Path)\r
if Value == None:\r
PackageList = "\n\t".join([str(P) for P in self.Packages])\r
EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
RecordList = self._RawData[MODEL_EFI_PPI, self._Arch, self._Platform]\r
for Record in RecordList:\r
CName = Record[0]\r
- Value = PpiValue(CName, self.Packages)\r
+ Value = PpiValue(CName, self.Packages, self.MetaFile.Path)\r
if Value == None:\r
PackageList = "\n\t".join([str(P) for P in self.Packages])\r
EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
RecordList = self._RawData[MODEL_EFI_GUID, self._Arch, self._Platform]\r
for Record in RecordList:\r
CName = Record[0]\r
- Value = GuidValue(CName, self.Packages)\r
+ Value = GuidValue(CName, self.Packages, self.MetaFile.Path)\r
if Value == None:\r
PackageList = "\n\t".join([str(P) for P in self.Packages])\r
EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
DepexList.append(Module.Guid)\r
else:\r
# get the GUID value now\r
- Value = ProtocolValue(Token, self.Packages)\r
+ Value = ProtocolValue(Token, self.Packages, self.MetaFile.Path)\r
if Value == None:\r
- Value = PpiValue(Token, self.Packages)\r
+ Value = PpiValue(Token, self.Packages, self.MetaFile.Path)\r
if Value == None:\r
- Value = GuidValue(Token, self.Packages)\r
+ Value = GuidValue(Token, self.Packages, self.MetaFile.Path)\r
if Value == None:\r
PackageList = "\n\t".join([str(P) for P in self.Packages])\r
EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
PcdList.append((PcdCName, TokenSpaceGuid))\r
# get the guid value\r
if TokenSpaceGuid not in self.Guids:\r
- Value = GuidValue(TokenSpaceGuid, self.Packages)\r
+ Value = GuidValue(TokenSpaceGuid, self.Packages, self.MetaFile.Path)\r
if Value == None:\r
PackageList = "\n\t".join([str(P) for P in self.Packages])\r
EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
\r
# resolve PCD type, value, datum info, etc. by getting its definition from package\r
for PcdCName, TokenSpaceGuid in PcdList:\r
+ PcdRealName = PcdCName\r
Setting, LineNo = PcdDict[self._Arch, self.Platform, PcdCName, TokenSpaceGuid]\r
if Setting == None:\r
continue\r
# Patch PCD: TokenSpace.PcdCName|Value|Offset\r
Pcd.Offset = ValueList[1]\r
\r
+ if (PcdRealName, TokenSpaceGuid) in GlobalData.MixedPcd:\r
+ for Package in self.Packages:\r
+ for key in Package.Pcds:\r
+ if (Package.Pcds[key].TokenCName, Package.Pcds[key].TokenSpaceGuidCName) == (PcdRealName, TokenSpaceGuid):\r
+ for item in GlobalData.MixedPcd[(PcdRealName, TokenSpaceGuid)]:\r
+ Pcd_Type = item[0].split('_')[-1]\r
+ if Pcd_Type == Package.Pcds[key].Type:\r
+ Value = Package.Pcds[key]\r
+ Value.TokenCName = Package.Pcds[key].TokenCName + '_' + Pcd_Type\r
+ if len(key) == 2:\r
+ newkey = (Value.TokenCName, key[1])\r
+ elif len(key) == 3:\r
+ newkey = (Value.TokenCName, key[1], key[2])\r
+ del Package.Pcds[key]\r
+ Package.Pcds[newkey] = Value\r
+ break\r
+ else:\r
+ pass\r
+ else:\r
+ pass\r
+\r
# get necessary info from package declaring this PCD\r
for Package in self.Packages:\r
#\r
if Type == MODEL_PCD_DYNAMIC:\r
Pcd.Pending = True\r
for T in ["FixedAtBuild", "PatchableInModule", "FeatureFlag", "Dynamic", "DynamicEx"]:\r
- if (PcdCName, TokenSpaceGuid, T) in Package.Pcds:\r
- PcdType = T\r
+ if (PcdRealName, TokenSpaceGuid) in GlobalData.MixedPcd:\r
+ for item in GlobalData.MixedPcd[(PcdRealName, TokenSpaceGuid)]:\r
+ if str(item[0]).endswith(T) and (item[0], item[1], T) in Package.Pcds:\r
+ PcdType = T\r
+ PcdCName = item[0]\r
+ break\r
+ else:\r
+ pass\r
break\r
+ else:\r
+ if (PcdRealName, TokenSpaceGuid, T) in Package.Pcds:\r
+ PcdType = T\r
+ break\r
+\r
else:\r
Pcd.Pending = False\r
+ if (PcdRealName, TokenSpaceGuid) in GlobalData.MixedPcd:\r
+ for item in GlobalData.MixedPcd[(PcdRealName, TokenSpaceGuid)]:\r
+ Pcd_Type = item[0].split('_')[-1]\r
+ if Pcd_Type == PcdType:\r
+ PcdCName = item[0]\r
+ break\r
+ else:\r
+ pass\r
+ else:\r
+ pass\r
\r
if (PcdCName, TokenSpaceGuid, PcdType) in Package.Pcds:\r
PcdInPackage = Package.Pcds[PcdCName, TokenSpaceGuid, PcdType]\r
EdkLogger.error(\r
'build',\r
FORMAT_INVALID,\r
- "No TokenValue for PCD [%s.%s] in [%s]!" % (TokenSpaceGuid, PcdCName, str(Package)),\r
+ "No TokenValue for PCD [%s.%s] in [%s]!" % (TokenSpaceGuid, PcdRealName, str(Package)),\r
File=self.MetaFile, Line=LineNo,\r
ExtraData=None\r
) \r
EdkLogger.error(\r
'build',\r
FORMAT_INVALID,\r
- "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid:" % (Pcd.TokenValue, TokenSpaceGuid, PcdCName, str(Package)),\r
+ "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid:" % (Pcd.TokenValue, TokenSpaceGuid, PcdRealName, str(Package)),\r
File=self.MetaFile, Line=LineNo,\r
ExtraData=None\r
)\r
EdkLogger.error(\r
'build',\r
FORMAT_INVALID,\r
- "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid, as a decimal it should between: 0 - 4294967295!" % (Pcd.TokenValue, TokenSpaceGuid, PcdCName, str(Package)),\r
+ "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid, as a decimal it should between: 0 - 4294967295!" % (Pcd.TokenValue, TokenSpaceGuid, PcdRealName, str(Package)),\r
File=self.MetaFile, Line=LineNo,\r
ExtraData=None\r
)\r
EdkLogger.error(\r
'build',\r
FORMAT_INVALID,\r
- "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid, it should be hexadecimal or decimal!" % (Pcd.TokenValue, TokenSpaceGuid, PcdCName, str(Package)),\r
+ "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid, it should be hexadecimal or decimal!" % (Pcd.TokenValue, TokenSpaceGuid, PcdRealName, str(Package)),\r
File=self.MetaFile, Line=LineNo,\r
ExtraData=None\r
)\r
EdkLogger.error(\r
'build',\r
FORMAT_INVALID,\r
- "PCD [%s.%s] in [%s] is not found in dependent packages:" % (TokenSpaceGuid, PcdCName, self.MetaFile),\r
+ "PCD [%s.%s] in [%s] is not found in dependent packages:" % (TokenSpaceGuid, PcdRealName, self.MetaFile),\r
File=self.MetaFile, Line=LineNo,\r
ExtraData="\t%s" % '\n\t'.join([str(P) for P in self.Packages])\r
)\r
MetaFile = self._FILE_PARSER_[FileType](\r
FilePath, \r
FileType, \r
+ Arch,\r
MetaFileStorage(self.WorkspaceDb.Cur, FilePath, FileType)\r
)\r
# alwasy do post-process, in case of macros change\r
PlatformList.append(Platform)\r
return PlatformList\r
\r
+ def _MapPlatform(self, Dscfile):\r
+ Platform = self.BuildObject[PathClass(Dscfile), 'COMMON']\r
+ if Platform == None:\r
+ EdkLogger.error('build', PARSER_ERROR, "Failed to parser DSC file: %s" % Dscfile)\r
+ return Platform\r
+\r
PlatformList = property(_GetPlatformList)\r
\r
##\r