support/package-builder/ToolChainUtils.py
87815216
 import os.path
 import platform
 import traceback
342710b6
 import re
2820c61a
 from CommandUtils import CommandUtils
 from Logger import Logger
 from PackageUtils import PackageUtils
 from constants import constants
e45f5730
 from SpecData import SPECS
f93ef2b0
 from StringUtils import StringUtils
8f56b626
 from Sandbox import Chroot, Container
2820c61a
 
 class ToolChainUtils(object):
5fc28b16
 
87815216
     def __init__(self, logName=None, logPath=None):
2820c61a
         if logName is None:
             logName = "Toolchain Utils"
         if logPath is None:
             logPath = constants.logPath
87815216
         self.logName = logName
         self.logPath = logPath
26b55679
         self.logger = Logger.getLogger(logName, logPath, constants.logLevel)
58120db4
         self.rpmbuildCommand = "rpmbuild"
87815216
         if os.geteuid() == 0:
             self.rpmCommand = "rpm"
45e37dfb
         else:
87815216
             self.rpmCommand = "fakeroot-ng rpm"
45e37dfb
 
87815216
     def findRPMFileInGivenLocation(self, package, rpmdirPath):
8f56b626
         listFoundRPMFiles = CommandUtils.findFile(package + "-*.rpm", rpmdirPath)
87815216
         listFilterRPMFiles = []
a4a06c39
         for f in listFoundRPMFiles:
87815216
             rpmFileName = os.path.basename(f)
             checkRPMName = rpmFileName.replace(package, "")
7acb019e
             rpmNameSplit = checkRPMName.split("-")
             if len(rpmNameSplit) == 3:
a4a06c39
                 listFilterRPMFiles.append(f)
87815216
         if len(listFilterRPMFiles) == 1:
a4a06c39
             return listFilterRPMFiles[0]
87815216
         if len(listFilterRPMFiles) == 0:
a4a06c39
             return None
87815216
         if len(listFilterRPMFiles) > 1:
             self.logger.error("Found multiple rpm files for given package in rpm directory." +
                               "Unable to determine the rpm file for package:" + package)
a4a06c39
             return None
5fc28b16
 
085306ae
     def buildCoreToolChainPackages(self):
26b55679
         self.logger.info("Step 1 : Building the core toolchain packages.....")
9bc3518e
         self.logger.info(constants.listCoreToolChainPackages)
26b55679
         self.logger.info("")
8f56b626
         chroot = None
7418d2bf
         pkgCount = 0
518d6a6f
         try:
87815216
             pkgUtils = PackageUtils(self.logName, self.logPath)
26b55679
             coreToolChainYetToBuild = []
fb300e7c
             for package in constants.listCoreToolChainPackages:
f93ef2b0
                 version = SPECS.getData().getHighestVersion(package)
                 rpmPkg = pkgUtils.findRPMFileForGivenPackage(package, version)
0fae9cdd
                 if rpmPkg is not None:
                     continue
26b55679
                 else:
                     coreToolChainYetToBuild.append(package)
             if coreToolChainYetToBuild:
                 self.logger.info("The following core toolchain packages need to be built :")
                 self.logger.info(coreToolChainYetToBuild)
             else:
                 self.logger.info("Core toolchain packages are already available")
 
             for package in coreToolChainYetToBuild:
                 self.logger.debug("Building core toolchain package : " + package)
8f56b626
                 version = SPECS.getData().getHighestVersion(package)
                 destLogPath = constants.logPath + "/" + package + "-" + version
0fae9cdd
                 if not os.path.isdir(destLogPath):
8f56b626
                     CommandUtils.runCommandInShell("mkdir -p " + destLogPath)
                 chroot = Chroot(self.logger)
                 chroot.create(package + "-" + version)
                 self.installToolChainRPMS(chroot, package, version, destLogPath)
                 pkgUtils.adjustGCCSpecs(chroot, package, version)
                 pkgUtils.buildRPMSForGivenPackage(chroot, package, version, destLogPath)
7418d2bf
                 pkgCount += 1
8f56b626
                 chroot.destroy()
26b55679
             self.logger.debug("Successfully built toolchain")
             self.logger.info("-" * 45 + "\n")
518d6a6f
         except Exception as e:
             self.logger.error("Unable to build tool chain.")
d355ea7e
             # print stacktrace
             traceback.print_exc()
518d6a6f
             raise e
7418d2bf
         return pkgCount
87815216
 
f93ef2b0
     def getListDependentPackages(self, package, version):
         listBuildRequiresPkg=SPECS.getData().getBuildRequiresForPackage(package, version)
         listBuildRequiresPkg.extend(SPECS.getData().getCheckBuildRequiresForPackage(package, version))
         return listBuildRequiresPkg
e45f5730
 
8f56b626
     def installToolChainRPMS(self, chroot, packageName=None, packageVersion=None, logPath=None):
7f9d2e12
         if logPath is None:
87815216
             logPath = self.logPath
26b55679
         self.logger.debug("Installing Tool Chain RPMS.......")
1eb9191f
         rpmFiles = ""
         packages = ""
8f56b626
         listBuildRequiresPackages = []
         if packageName:
             listBuildRequiresPackages = self.getListDependentPackages(packageName, packageVersion)
fb300e7c
         for package in constants.listToolChainRPMsToInstall:
87815216
             pkgUtils = PackageUtils(self.logName, self.logPath)
5fc28b16
             rpmFile = None
e45f5730
             version = "*"
f93ef2b0
             for depPkg in listBuildRequiresPackages:
                 depPkgName, depPkgVersion = StringUtils.splitPackageNameAndVersion(depPkg)
                 if depPkgName == package:
                         version=depPkgVersion
6d17349b
             if constants.rpmCheck:
e45f5730
                 rpmFile = pkgUtils.findRPMFileForGivenPackage(package, version)
8f56b626
             elif (packageName is None or 
                     packageName not in constants.listToolChainRPMsToInstall or
                     constants.listToolChainRPMsToInstall.index(packageName) >
87815216
                         constants.listToolChainRPMsToInstall.index(package)):
8f56b626
                 rpmFile = pkgUtils.findRPMFileForGivenPackage(package, version)
1ffbd987
             if rpmFile is None:
9874e684
                 # sqlite-autoconf package was renamed, but it still published as sqlite-autoconf
9b9c0eac
                 if (package == "sqlite") and (platform.machine() == "x86_64"):
9874e684
                     package = "sqlite-autoconf"
87815216
                 rpmFile = self.findRPMFileInGivenLocation(package, constants.prevPublishRPMRepo)
1ffbd987
                 if rpmFile is None:
fb300e7c
                     if package in constants.listOfRPMsProvidedAfterBuild:
26b55679
                         self.logger.debug("No old version of " + package +
87815216
                                          " exists, skip until the new version is built")
d77dd20b
                         continue
87815216
                     self.logger.error("Unable to find rpm " + package +
                                       " in current and previous versions")
36c2f510
                     raise Exception("Input Error")
1ffbd987
             rpmFiles += " " + rpmFile
f93ef2b0
             packages += " " + package+"-"+version
1eb9191f
 
f93ef2b0
         self.logger.debug(packages)
87815216
         cmd = (self.rpmCommand + " -i -v --nodeps --noorder --force --root " +
8f56b626
                chroot.getPath() +" --define \'_dbpath /var/lib/rpm\' "+ rpmFiles)
         retVal = CommandUtils.runCommandInShell(cmd, logfn=self.logger.debug)
         if retVal != 0:
7f9d2e12
             self.logger.debug("Command Executed:" + cmd)
1ffbd987
             self.logger.error("Installing tool chain  failed")
36c2f510
             raise Exception("RPM installation failed")
8f56b626
         self.logger.debug("Successfully installed default Tool Chain RPMS in Chroot:" + chroot.getPath())
         if packageName:
             self.installCustomToolChainRPMS(chroot, packageName, packageVersion)
 
     def installCustomToolChainRPMS(self, sandbox, packageName, packageVersion):
         listOfToolChainPkgs = SPECS.getData().getExtraBuildRequiresForPackage(packageName, packageVersion)
         if not listOfToolChainPkgs:
             return
26b55679
         self.logger.debug("Installing package specific tool chain RPMs for " + packageName +
8f56b626
                          ": " + str(listOfToolChainPkgs))
062d56d1
         rpmFiles = ""
         packages = ""
27a75769
         for package in listOfToolChainPkgs:
87815216
             pkgUtils = PackageUtils(self.logName, self.logPath)
342710b6
             if re.match("openjre*", packageName) is not None or re.match("openjdk*", packageName):
8f56b626
                 path = constants.prevPublishXRPMRepo
                 sandboxPath = "/publishxrpms"
27a75769
             else:
8f56b626
                 path = constants.prevPublishRPMRepo
                 sandboxPath = "/publishrpms"
             rpmFile = self.findRPMFileInGivenLocation(package, path)
062d56d1
             if rpmFile is None:
87815216
                 self.logger.error("Unable to find rpm "+ package +
                                   " in current and previous versions")
062d56d1
                 raise Exception("Input Error")
8f56b626
             rpmFiles += " " + rpmFile.replace(path, sandboxPath)
062d56d1
             packages += " " + package
 
87815216
         self.logger.debug("Installing custom rpms:" + packages)
8f56b626
         cmd = (self.rpmCommand + " -i -v --nodeps --noorder --force " + rpmFiles)
         retVal = sandbox.run(cmd, logfn=self.logger.debug)
         if retVal != 0:
7f9d2e12
             self.logger.debug("Command Executed:" + cmd)
8f56b626
             self.logger.error("Installing custom toolchains failed")
062d56d1
             raise Exception("RPM installation failed")
7418d2bf