support/package-builder/PackageBuilder.py
87815216
 import sys
 import os.path
2820c61a
 from PackageUtils import PackageUtils
 from Logger import Logger
 from ToolChainUtils import ToolChainUtils
 from CommandUtils import CommandUtils
 from constants import constants
45c9260c
 from SpecData import SPECS
f93ef2b0
 from StringUtils import StringUtils
8f56b626
 from Sandbox import Chroot, Container
2820c61a
 
a458a5f9
 class PackageBuilder(object):
     def __init__(self, mapPackageToCycles, sandboxType):
f3cc9fa8
         # will be initialized in buildPackageFunction()
87815216
         self.logName = None
         self.logPath = None
         self.logger = None
         self.package = None
f93ef2b0
         self.version = None
f67fb5e3
         self.doneList = None
a458a5f9
         self.sandboxType = sandboxType
         self.sandbox = None
2820c61a
         self.mapPackageToCycles = mapPackageToCycles
87815216
         self.listNodepsPackages = ["glibc", "gmp", "zlib", "file", "binutils", "mpfr",
                                    "mpc", "gcc", "ncurses", "util-linux", "groff", "perl",
                                    "texinfo", "rpm", "openssl", "go"]
97a9151c
 
a458a5f9
     def build(self, pkg, doneList):
f93ef2b0
         packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
         #do not build if RPM is already built
         #test only if the package is in the testForceRPMS with rpmCheck
         #build only if the package is not in the testForceRPMS with rpmCheck
f67fb5e3
 
61d640ad
         if not (constants.rpmCheck or packageName in constants.testForceRPMS):
f67fb5e3
             if self._checkIfPackageIsAlreadyBuilt(packageName, packageVersion, doneList):
f93ef2b0
                 return
326d5ca8
 
f67fb5e3
         self._buildPackagePrepareFunction(packageName, packageVersion, doneList)
f93ef2b0
         try:
             self._buildPackage()
         except Exception as e:
             # TODO: self.logger might be None
             self.logger.exception(e)
             raise e
 
a458a5f9
     def _buildPackage(self):
         try:
             self.sandbox.create(self.package + "-" + self.version)
 
             tUtils = ToolChainUtils(self.logName, self.logPath)
             if self.sandbox.hasToolchain():
22540e38
                 tUtils.installExtraToolchainRPMS(self.sandbox, self.package, self.version)
a458a5f9
             else:
fe8a5375
                 tUtils.installToolchainRPMS(self.sandbox, self.package, self.version, availablePackages=self.doneList)
a458a5f9
 
             listDependentPackages, listTestPackages, listInstalledPackages, listInstalledRPMs = (
                 self._findDependentPackagesAndInstalledRPM(self.sandbox))
 
             pkgUtils = PackageUtils(self.logName, self.logPath)
 
             if listDependentPackages:
                 self.logger.debug("Installing the build time dependent packages......")
                 for pkg in listDependentPackages:
                     packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
                     self._installPackage(pkgUtils, packageName, packageVersion, self.sandbox, self.logPath,listInstalledPackages, listInstalledRPMs)
                 for pkg in listTestPackages:
                     flag = False
                     packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
                     for depPkg in listDependentPackages:
                         depPackageName, depPackageVersion = StringUtils.splitPackageNameAndVersion(depPkg)
                         if depPackageName == packageName:
                             flag = True
                             break;
                     if flag == False:
                         self._installPackage(pkgUtils, packageName,packageVersion, self.sandbox, self.logPath,listInstalledPackages, listInstalledRPMs)
                 pkgUtils.installRPMSInOneShot(self.sandbox)
                 self.logger.debug("Finished installing the build time dependent packages....")
 
             pkgUtils.adjustGCCSpecs(self.sandbox, self.package, self.version)
             pkgUtils.buildRPMSForGivenPackage(self.sandbox, self.package, self.version,
                                               self.logPath)
             self.logger.debug("Successfully built the package: " + self.package)
         except Exception as e:
             self.logger.error("Failed while building package: " + self.package)
             self.logger.debug("Sandbox: " + self.sandbox.getID() +
                               " not deleted for debugging.")
             logFileName = os.path.join(self.logPath, self.package + ".log")
             fileLog = os.popen('tail -n 100 ' + logFileName).read()
             self.logger.info(fileLog)
             raise e
         if self.sandbox:
             self.sandbox.destroy()
 
f67fb5e3
     def _buildPackagePrepareFunction(self, package, version, doneList):
87815216
         self.package = package
f93ef2b0
         self.version = version
         self.logName = "build-" + package + "-" + version
         self.logPath = constants.logPath + "/" + package + "-" + version
56c77555
         if not os.path.isdir(self.logPath):
             cmdUtils = CommandUtils()
87815216
             cmdUtils.runCommandInShell("mkdir -p " + self.logPath)
26b55679
         self.logger = Logger.getLogger(self.logName, self.logPath, constants.logLevel)
f67fb5e3
         self.doneList = doneList
97a9151c
 
a458a5f9
         if self.sandboxType == "chroot":
             sandbox = Chroot(self.logger)
         elif self.sandboxType == "container":
             sandbox = Container(self.logger)
         else:
             raise Exception("Unknown sandbox type: " + sandboxType)
 
         self.sandbox = sandbox
 
f93ef2b0
     def _findPackageNameAndVersionFromRPMFile(self, rpmfile):
87815216
         rpmfile = os.path.basename(rpmfile)
         releaseindex = rpmfile.rfind("-")
2820c61a
         if releaseindex == -1:
87815216
             self.logger.error("Invalid rpm file:" + rpmfile)
2820c61a
             return None
f93ef2b0
         pkg = rpmfile[0:releaseindex]
         return pkg
97a9151c
 
8f56b626
     def _findInstalledPackages(self, sandbox):
56c77555
         pkgUtils = PackageUtils(self.logName, self.logPath)
8f56b626
         listInstalledRPMs = pkgUtils.findInstalledRPMPackages(sandbox)
87815216
         listInstalledPackages = []
2820c61a
         for installedRPM in listInstalledRPMs:
f93ef2b0
             pkg = self._findPackageNameAndVersionFromRPMFile(installedRPM)
             if pkg is not None:
                 listInstalledPackages.append(pkg)
56c77555
         return listInstalledPackages, listInstalledRPMs
adf248d5
 
f67fb5e3
     def _checkIfPackageIsAlreadyBuilt(self, package, version, doneList):
         basePkg = SPECS.getData().getSpecName(package) + "-" + version
         return basePkg in doneList
 
adf248d5
 
f93ef2b0
     def _findRunTimeRequiredRPMPackages(self, rpmPackage, version):
         return SPECS.getData().getRequiresForPackage(rpmPackage, version)
97a9151c
 
f93ef2b0
     def _findBuildTimeRequiredPackages(self):
         return SPECS.getData().getBuildRequiresForPackage(self.package, self.version)
97a9151c
 
f93ef2b0
     def _findBuildTimeCheckRequiredPackages(self):
         return SPECS.getData().getCheckBuildRequiresForPackage(self.package, self.version)
5f40784b
 
8f56b626
     def _installPackage(self, pkgUtils, package, packageVersion, sandbox, destLogPath,
326d5ca8
                         listInstalledPackages, listInstalledRPMs):
f67fb5e3
         rpmfile = pkgUtils.findRPMFile(package,packageVersion);
f93ef2b0
         if rpmfile is None:
             self.logger.error("No rpm file found for package: " + package + "-" + packageVersion)
             raise Exception("Missing rpm file")
         specificRPM = os.path.basename(rpmfile.replace(".rpm", ""))
         pkg = package+"-"+packageVersion
         if pkg in listInstalledPackages:
e45f5730
                 return
75cb675a
         # mark it as installed -  to avoid cyclic recursion
f93ef2b0
         listInstalledPackages.append(pkg)
e45f5730
         listInstalledRPMs.append(specificRPM)
8f56b626
         self._installDependentRunTimePackages(pkgUtils, package, packageVersion, sandbox, destLogPath,
326d5ca8
                                               listInstalledPackages, listInstalledRPMs)
87815216
         noDeps = False
326d5ca8
         if (package in self.mapPackageToCycles or
                 package in self.listNodepsPackages or
                 package in constants.noDepsPackageList):
87815216
             noDeps = True
8f56b626
         pkgUtils.prepRPMforInstall(package,packageVersion, noDeps, destLogPath)
2820c61a
 
8f56b626
     def _installDependentRunTimePackages(self, pkgUtils, package, packageVersion, sandbox, destLogPath,
326d5ca8
                                          listInstalledPackages, listInstalledRPMs):
f93ef2b0
         listRunTimeDependentPackages = self._findRunTimeRequiredRPMPackages(package, packageVersion)
326d5ca8
         if listRunTimeDependentPackages:
2820c61a
             for pkg in listRunTimeDependentPackages:
326d5ca8
                 if pkg in self.mapPackageToCycles:
2820c61a
                     continue
f93ef2b0
                 packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
8fa7d1c5
                 rpmfile = pkgUtils.findRPMFile(packageName, packageVersion)
                 if rpmfile is None:
                     self.logger.error("No rpm file found for package: " + packageName + "-" + packageVersion)
                     raise Exception("Missing rpm file")
                 latestPkgRPM = os.path.basename(rpmfile).replace(".rpm", "")
56c77555
                 if pkg in listInstalledPackages and latestPkgRPM in listInstalledRPMs:
2820c61a
                     continue
8f56b626
                 self._installPackage(pkgUtils, packageName,packageVersion, sandbox, destLogPath,listInstalledPackages, listInstalledRPMs)
326d5ca8
 
8f56b626
     def _findDependentPackagesAndInstalledRPM(self, sandbox):
         listInstalledPackages, listInstalledRPMs = self._findInstalledPackages(sandbox)
26b55679
         self.logger.debug(listInstalledPackages)
f93ef2b0
         listDependentPackages = self._findBuildTimeRequiredPackages()
e45f5730
         listTestPackages=[]
326d5ca8
         if constants.rpmCheck and self.package in constants.testForceRPMS:
f93ef2b0
             # One time optimization
             if constants.listMakeCheckRPMPkgWithVersionstoInstall is None:
dd6e479c
                 constants.listMakeCheckRPMPkgWithVersionstoInstall=[]
f93ef2b0
                 for package in constants.listMakeCheckRPMPkgtoInstall:
                     version = SPECS.getData().getHighestVersion(package)
                     constants.listMakeCheckRPMPkgWithVersionstoInstall.append(package+"-"+version)
 
             listDependentPackages.extend(self._findBuildTimeCheckRequiredPackages())
             testPackages = (set(constants.listMakeCheckRPMPkgWithVersionstoInstall) -
326d5ca8
                             set(listInstalledPackages) -
f93ef2b0
                             set([self.package+"-"+self.version]))
e45f5730
             listTestPackages=list(set(testPackages))
326d5ca8
             listDependentPackages = list(set(listDependentPackages))
e45f5730
         return listDependentPackages, listTestPackages, listInstalledPackages, listInstalledRPMs