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 |