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 |
|