from Common.BuildToolError import *\r
from Common.DataType import *\r
from Common.Misc import *\r
+import json\r
\r
## Regular expression for splitting Dependency Expression string into tokens\r
gDepexTokenPattern = re.compile("(\(|\)|\w+| \S+\.inf)")\r
\r
self.CreateBuildOptionsFile()\r
self.CreatePcdTokenNumberFile()\r
- self.CreateModuleHashInfo()\r
+ self.GeneratePlatformLevelHash()\r
\r
#\r
# Merge Arch\r
if Fdf.CurrentFdName and Fdf.CurrentFdName in Fdf.Profile.FdDict:\r
FdDict = Fdf.Profile.FdDict[Fdf.CurrentFdName]\r
for FdRegion in FdDict.RegionList:\r
- if str(FdRegion.RegionType) is 'FILE' and self.Platform.VpdToolGuid in str(FdRegion.RegionDataList):\r
+ if str(FdRegion.RegionType) == 'FILE' and self.Platform.VpdToolGuid in str(FdRegion.RegionDataList):\r
if int(FdRegion.Offset) % 8 != 0:\r
EdkLogger.error("build", FORMAT_INVALID, 'The VPD Base Address %s must be 8-byte aligned.' % (FdRegion.Offset))\r
FdfProfile = Fdf.Profile\r
continue\r
ModuleData = self.BuildDatabase[ModuleFile, Arch, self.BuildTarget, self.ToolChain]\r
PkgSet.update(ModuleData.Packages)\r
+ PkgSet.update(Platform.Packages)\r
Pkgs[Arch] = list(PkgSet)\r
return Pkgs\r
\r
PcdTokenNumber += str(Pa.PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName])\r
SaveFileOnChange(os.path.join(self.BuildDir, 'PcdTokenNumber'), PcdTokenNumber, False)\r
\r
- def CreateModuleHashInfo(self):\r
+ def GeneratePlatformLevelHash(self):\r
#\r
# Get set of workspace metafiles\r
#\r
AllWorkSpaceMetaFiles = self._GetMetaFiles(self.BuildTarget, self.ToolChain)\r
-\r
+ AllWorkSpaceMetaFileList = sorted(AllWorkSpaceMetaFiles, key=lambda x: str(x))\r
#\r
# Retrieve latest modified time of all metafiles\r
#\r
self._SrcTimeStamp = SrcTimeStamp\r
\r
if GlobalData.gUseHashCache:\r
+ FileList = []\r
m = hashlib.md5()\r
- for files in AllWorkSpaceMetaFiles:\r
- if files.endswith('.dec'):\r
+ for file in AllWorkSpaceMetaFileList:\r
+ if file.endswith('.dec'):\r
continue\r
- f = open(files, 'rb')\r
+ f = open(file, 'rb')\r
Content = f.read()\r
f.close()\r
m.update(Content)\r
- SaveFileOnChange(os.path.join(self.BuildDir, 'AutoGen.hash'), m.hexdigest(), False)\r
- GlobalData.gPlatformHash = m.hexdigest()\r
+ FileList.append((str(file), hashlib.md5(Content).hexdigest()))\r
+\r
+ HashDir = path.join(self.BuildDir, "Hash_Platform")\r
+ HashFile = path.join(HashDir, 'Platform.hash.' + m.hexdigest())\r
+ SaveFileOnChange(HashFile, m.hexdigest(), False)\r
+ HashChainFile = path.join(HashDir, 'Platform.hashchain.' + m.hexdigest())\r
+ GlobalData.gPlatformHashFile = HashChainFile\r
+ try:\r
+ with open(HashChainFile, 'w') as f:\r
+ json.dump(FileList, f, indent=2)\r
+ except:\r
+ EdkLogger.quiet("[cache warning]: fail to save hashchain file:%s" % HashChainFile)\r
+\r
+ if GlobalData.gBinCacheDest:\r
+ # Copy platform hash files to cache destination\r
+ FileDir = path.join(GlobalData.gBinCacheDest, self.OutputDir, self.BuildTarget + "_" + self.ToolChain, "Hash_Platform")\r
+ CacheFileDir = FileDir\r
+ CreateDirectory(CacheFileDir)\r
+ CopyFileOnChange(HashFile, CacheFileDir)\r
+ CopyFileOnChange(HashChainFile, CacheFileDir)\r
\r
#\r
# Write metafile list to build directory\r
if not os.path.exists(self.BuildDir):\r
os.makedirs(self.BuildDir)\r
with open(os.path.join(self.BuildDir, 'AutoGen'), 'w+') as file:\r
- for f in AllWorkSpaceMetaFiles:\r
+ for f in AllWorkSpaceMetaFileList:\r
print(f, file=file)\r
return True\r
\r
if Pkg.PackageName in GlobalData.gPackageHash:\r
return\r
\r
- PkgDir = os.path.join(self.BuildDir, Pkg.Arch, Pkg.PackageName)\r
+ PkgDir = os.path.join(self.BuildDir, Pkg.Arch, "Hash_Pkg", Pkg.PackageName)\r
CreateDirectory(PkgDir)\r
- HashFile = os.path.join(PkgDir, Pkg.PackageName + '.hash')\r
+ FileList = []\r
m = hashlib.md5()\r
# Get .dec file's hash value\r
f = open(Pkg.MetaFile.Path, 'rb')\r
Content = f.read()\r
f.close()\r
m.update(Content)\r
+ FileList.append((str(Pkg.MetaFile.Path), hashlib.md5(Content).hexdigest()))\r
# Get include files hash value\r
if Pkg.Includes:\r
for inc in sorted(Pkg.Includes, key=lambda x: str(x)):\r
Content = f.read()\r
f.close()\r
m.update(Content)\r
- SaveFileOnChange(HashFile, m.hexdigest(), False)\r
+ FileList.append((str(File_Path), hashlib.md5(Content).hexdigest()))\r
GlobalData.gPackageHash[Pkg.PackageName] = m.hexdigest()\r
\r
+ HashDir = PkgDir\r
+ HashFile = path.join(HashDir, Pkg.PackageName + '.hash.' + m.hexdigest())\r
+ SaveFileOnChange(HashFile, m.hexdigest(), False)\r
+ HashChainFile = path.join(HashDir, Pkg.PackageName + '.hashchain.' + m.hexdigest())\r
+ GlobalData.gPackageHashFile[(Pkg.PackageName, Pkg.Arch)] = HashChainFile\r
+ try:\r
+ with open(HashChainFile, 'w') as f:\r
+ json.dump(FileList, f, indent=2)\r
+ except:\r
+ EdkLogger.quiet("[cache warning]: fail to save hashchain file:%s" % HashChainFile)\r
+\r
+ if GlobalData.gBinCacheDest:\r
+ # Copy Pkg hash files to cache destination dir\r
+ FileDir = path.join(GlobalData.gBinCacheDest, self.OutputDir, self.BuildTarget + "_" + self.ToolChain, Pkg.Arch, "Hash_Pkg", Pkg.PackageName)\r
+ CacheFileDir = FileDir\r
+ CreateDirectory(CacheFileDir)\r
+ CopyFileOnChange(HashFile, CacheFileDir)\r
+ CopyFileOnChange(HashChainFile, CacheFileDir)\r
+\r
def _GetMetaFiles(self, Target, Toolchain):\r
AllWorkSpaceMetaFiles = set()\r
#\r