LibConstructorList = Lib.ConstructorList\r
LibDesstructorList = Lib.DestructorList\r
LibDepexList = Lib.DepexExpression[M.Arch, M.ModuleType]\r
- self.LibraryList.append((LibInfPath, LibClassList, LibConstructorList, LibDesstructorList, LibDepexList))\r
+ for LibAutoGen in M.LibraryAutoGenList:\r
+ if LibInfPath == LibAutoGen.MetaFile.Path:\r
+ LibTime = LibAutoGen.BuildTime\r
+ break\r
+ self.LibraryList.append((LibInfPath, LibClassList, LibConstructorList, LibDesstructorList, LibDepexList, LibTime))\r
\r
##\r
# Generate report for module library information\r
LibDepex = " ".join(LibraryItem[4])\r
if LibDepex:\r
EdkIILibInfo += " Depex = " + LibDepex\r
+ if LibraryItem[5]:\r
+ EdkIILibInfo += " Time = " + LibraryItem[5]\r
if EdkIILibInfo:\r
FileWrite(File, "{%s: %s}" % (LibClass, EdkIILibInfo))\r
else:\r
self.PciDeviceId = M.Module.Defines.get("PCI_DEVICE_ID", "")\r
self.PciVendorId = M.Module.Defines.get("PCI_VENDOR_ID", "")\r
self.PciClassCode = M.Module.Defines.get("PCI_CLASS_CODE", "")\r
+ self.BuildTime = M.BuildTime\r
\r
self._BuildDir = M.BuildDir\r
self.ModulePcdSet = {}\r
FileWrite(File, "SHA1 HASH: %s *%s" % (self.Hash, self.ModuleName + ".efi"))\r
if self.BuildTimeStamp:\r
FileWrite(File, "Build Time Stamp: %s" % self.BuildTimeStamp)\r
+ if self.BuildTime:\r
+ FileWrite(File, "Module Build Time: %s" % self.BuildTime)\r
if self.DriverType:\r
FileWrite(File, "Driver Type: %s" % self.DriverType)\r
if self.UefiSpecVersion:\r
# @param self The object pointer\r
# @param File The file object for report\r
# @param BuildDuration The total time to build the modules\r
+ # @param AutoGenTime The total time of AutoGen Phase\r
+ # @param MakeTime The total time of Make Phase\r
+ # @param GenFdsTime The total time of GenFds Phase\r
# @param ReportType The kind of report items in the final report file\r
#\r
- def GenerateReport(self, File, BuildDuration, ReportType):\r
+ def GenerateReport(self, File, BuildDuration, AutoGenTime, MakeTime, GenFdsTime, ReportType):\r
FileWrite(File, "Platform Summary")\r
FileWrite(File, "Platform Name: %s" % self.PlatformName)\r
FileWrite(File, "Platform DSC Path: %s" % self.PlatformDscPath)\r
FileWrite(File, "Output Path: %s" % self.OutputPath)\r
FileWrite(File, "Build Environment: %s" % self.BuildEnvironment)\r
FileWrite(File, "Build Duration: %s" % BuildDuration)\r
+ if AutoGenTime:\r
+ FileWrite(File, "AutoGen Duration: %s" % AutoGenTime)\r
+ if MakeTime:\r
+ FileWrite(File, "Make Duration: %s" % MakeTime)\r
+ if GenFdsTime:\r
+ FileWrite(File, "GenFds Duration: %s" % GenFdsTime)\r
FileWrite(File, "Report Content: %s" % ", ".join(ReportType))\r
\r
if GlobalData.MixedPcd:\r
#\r
# @param self The object pointer\r
# @param BuildDuration The total time to build the modules\r
+ # @param AutoGenTime The total time of AutoGen phase\r
+ # @param MakeTime The total time of Make phase\r
+ # @param GenFdsTime The total time of GenFds phase\r
#\r
- def GenerateReport(self, BuildDuration):\r
+ def GenerateReport(self, BuildDuration, AutoGenTime, MakeTime, GenFdsTime):\r
if self.ReportFile:\r
try:\r
File = StringIO('')\r
for (Wa, MaList) in self.ReportList:\r
- PlatformReport(Wa, MaList, self.ReportType).GenerateReport(File, BuildDuration, self.ReportType)\r
+ PlatformReport(Wa, MaList, self.ReportType).GenerateReport(File, BuildDuration, AutoGenTime, MakeTime, GenFdsTime, self.ReportType)\r
Content = FileLinesSplit(File.getvalue(), gLineMaxLength)\r
SaveFileOnChange(self.ReportFile, Content, True)\r
EdkLogger.quiet("Build report can be found at %s" % os.path.abspath(self.ReportFile))\r
# @param WorkingDir The directory in which the program will be running\r
#\r
def LaunchCommand(Command, WorkingDir):\r
+ BeginTime = time.time()\r
# if working directory doesn't exist, Popen() will raise an exception\r
if not os.path.isdir(WorkingDir):\r
EdkLogger.error("build", FILE_NOT_FOUND, ExtraData=WorkingDir)\r
EdkLogger.info(RespContent)\r
\r
EdkLogger.error("build", COMMAND_FAILURE, ExtraData="%s [%s]" % (Command, WorkingDir))\r
+ return "%dms" % (int(round((time.time() - BeginTime) * 1000)))\r
\r
## The smallest unit that can be built in multi-thread build mode\r
#\r
#\r
def _CommandThread(self, Command, WorkingDir):\r
try:\r
- LaunchCommand(Command, WorkingDir)\r
+ self.BuildItem.BuildObject.BuildTime = LaunchCommand(Command, WorkingDir)\r
self.CompleteFlag = True\r
except:\r
#\r
self.BuildReport = BuildReport(BuildOptions.ReportFile, BuildOptions.ReportType)\r
self.TargetTxt = TargetTxtClassObject()\r
self.ToolDef = ToolDefClassObject()\r
+ self.AutoGenTime = 0\r
+ self.MakeTime = 0\r
+ self.GenFdsTime = 0\r
GlobalData.BuildOptionPcd = BuildOptions.OptionPcd\r
#Set global flag for build mode\r
GlobalData.gIgnoreSource = BuildOptions.IgnoreSources\r
if BuildModule:\r
if Target != 'fds':\r
BuildCommand = BuildCommand + [Target]\r
- LaunchCommand(BuildCommand, AutoGenObject.MakeFileDir)\r
+ AutoGenObject.BuildTime = LaunchCommand(BuildCommand, AutoGenObject.MakeFileDir)\r
self.CreateAsBuiltInf()\r
return True\r
\r
GlobalData.gGlobalDefines['TARGET'] = BuildTarget\r
index = 0\r
for ToolChain in self.ToolChainList:\r
+ WorkspaceAutoGenTime = time.time()\r
GlobalData.gGlobalDefines['TOOLCHAIN'] = ToolChain\r
GlobalData.gGlobalDefines['TOOL_CHAIN_TAG'] = ToolChain\r
GlobalData.gGlobalDefines['FAMILY'] = self.ToolChainFamily[index]\r
Wa.CreateMakeFile(False)\r
self.Progress.Stop("done!")\r
MaList = []\r
+ ExitFlag = threading.Event()\r
+ ExitFlag.clear()\r
+ self.AutoGenTime += int(round((time.time() - WorkspaceAutoGenTime)))\r
for Arch in Wa.ArchList:\r
+ AutoGenStart = time.time()\r
GlobalData.gGlobalDefines['ARCH'] = Arch\r
Pa = PlatformAutoGen(Wa, self.PlatformFile, BuildTarget, ToolChain, Arch)\r
for Module in Pa.Platform.Modules:\r
if Ma == None: continue\r
MaList.append(Ma)\r
self.BuildModules.append(Ma)\r
- if not Ma.IsBinaryModule:\r
- self._Build(self.Target, Ma, BuildModule=True)\r
+ self.AutoGenTime += int(round((time.time() - AutoGenStart)))\r
+ MakeStart = time.time()\r
+ for Ma in self.BuildModules:\r
+ if not Ma.IsBinaryModule:\r
+ Bt = BuildTask.New(ModuleMakeUnit(Ma, self.Target))\r
+ # Break build if any build thread has error\r
+ if BuildTask.HasError():\r
+ # we need a full version of makefile for platform\r
+ ExitFlag.set()\r
+ BuildTask.WaitForComplete()\r
+ Pa.CreateMakeFile(False)\r
+ EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)\r
+ # Start task scheduler\r
+ if not BuildTask.IsOnGoing():\r
+ BuildTask.StartScheduler(self.ThreadNumber, ExitFlag)\r
+\r
+ # in case there's an interruption. we need a full version of makefile for platform\r
+ Pa.CreateMakeFile(False)\r
+ if BuildTask.HasError():\r
+ EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)\r
+ self.MakeTime += int(round((time.time() - MakeStart)))\r
+\r
+ MakeContiue = time.time()\r
+ ExitFlag.set()\r
+ BuildTask.WaitForComplete()\r
+ self.CreateAsBuiltInf()\r
+ self.MakeTime += int(round((time.time() - MakeContiue)))\r
+ if BuildTask.HasError():\r
+ EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)\r
\r
self.BuildReport.AddPlatformReport(Wa, MaList)\r
if MaList == []:\r
#\r
# create FDS again for the updated EFI image\r
#\r
+ GenFdsStart = time.time()\r
self._Build("fds", Wa)\r
+ self.GenFdsTime += int(round((time.time() - GenFdsStart)))\r
#\r
# Create MAP file for all platform FVs after GenFds.\r
#\r
GlobalData.gGlobalDefines['TARGET'] = BuildTarget\r
index = 0\r
for ToolChain in self.ToolChainList:\r
+ WorkspaceAutoGenTime = time.time()\r
GlobalData.gGlobalDefines['TOOLCHAIN'] = ToolChain\r
GlobalData.gGlobalDefines['TOOL_CHAIN_TAG'] = ToolChain\r
GlobalData.gGlobalDefines['FAMILY'] = self.ToolChainFamily[index]\r
# multi-thread exit flag\r
ExitFlag = threading.Event()\r
ExitFlag.clear()\r
+ self.AutoGenTime += int(round((time.time() - WorkspaceAutoGenTime)))\r
for Arch in Wa.ArchList:\r
+ AutoGenStart = time.time()\r
GlobalData.gGlobalDefines['ARCH'] = Arch\r
Pa = PlatformAutoGen(Wa, self.PlatformFile, BuildTarget, ToolChain, Arch)\r
if Pa == None:\r
continue\r
self.BuildModules.append(Ma)\r
self.Progress.Stop("done!")\r
-\r
+ self.AutoGenTime += int(round((time.time() - AutoGenStart)))\r
+ MakeStart = time.time()\r
for Ma in self.BuildModules:\r
# Generate build task for the module\r
if not Ma.IsBinaryModule:\r
Pa.CreateMakeFile(False)\r
if BuildTask.HasError():\r
EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)\r
+ self.MakeTime += int(round((time.time() - MakeStart)))\r
\r
+ MakeContiue = time.time()\r
#\r
# Save temp tables to a TmpTableDict.\r
#\r
ExitFlag.set()\r
BuildTask.WaitForComplete()\r
self.CreateAsBuiltInf()\r
-\r
+ self.MakeTime += int(round((time.time() - MakeContiue)))\r
#\r
# Check for build error, and raise exception if one\r
# has been signaled.\r
#\r
# Generate FD image if there's a FDF file found\r
#\r
+ GenFdsStart = time.time()\r
LaunchCommand(Wa.GenFdsCommand, os.getcwd())\r
\r
#\r
# Create MAP file for all platform FVs after GenFds.\r
#\r
self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList)\r
+ self.GenFdsTime += int(round((time.time() - GenFdsStart)))\r
#\r
# Save MAP buffer into MAP file.\r
#\r
else:\r
parser.error("Option %s only allows one instance in command line!" % option)\r
\r
+def LogBuildTime(Time):\r
+ if Time:\r
+ TimeDurStr = ''\r
+ TimeDur = time.gmtime(Time)\r
+ if TimeDur.tm_yday > 1:\r
+ TimeDurStr = time.strftime("%H:%M:%S", TimeDur) + ", %d day(s)" % (TimeDur.tm_yday - 1)\r
+ else:\r
+ TimeDurStr = time.strftime("%H:%M:%S", TimeDur)\r
+ return TimeDurStr\r
+ else:\r
+ return None\r
+\r
## Parse command line options\r
#\r
# Using standard Python module optparse to parse command line option of this tool.\r
BuildDurationStr = time.strftime("%H:%M:%S", BuildDuration)\r
if MyBuild != None:\r
if not BuildError:\r
- MyBuild.BuildReport.GenerateReport(BuildDurationStr)\r
+ MyBuild.BuildReport.GenerateReport(BuildDurationStr, LogBuildTime(MyBuild.AutoGenTime), LogBuildTime(MyBuild.MakeTime), LogBuildTime(MyBuild.GenFdsTime))\r
MyBuild.Db.Close()\r
EdkLogger.SetLevel(EdkLogger.QUIET)\r
EdkLogger.quiet("\n- %s -" % Conclusion)\r