from CommandUtils import CommandUtils from ChrootUtils import ChrootUtils from Logger import Logger from PackageUtils import PackageUtils import shutil from constants import constants import subprocess class ToolChainUtils(object): __built_successfull=False def __init__(self,logName=None,logPath=None): if logName is None: logName = "Toolchain Utils" if logPath is None: logPath = constants.logPath self.logName=logName self.logPath=logPath self.logger=Logger.getLogger(logName,logPath) self.adjustToolChainScript = "adjust-tool-chain.sh" self.localegenScript = "./locale-gen.sh" self.localegenConfig = "./locale-gen.conf" self.prepareBuildRootCmd="./prepare-build-root.sh" self.listPkgsRequiredToBuildToolchain=["linux-api-headers", "glibc","glibc-devel", "zlib","zlib-devel", "file", "binutils","binutils-devel", "gmp","gmp-devel", "mpfr", "mpfr-devel", "mpc", "libgcc","libgcc-devel","libstdc++","libstdc++-devel","libgomp","libgomp-devel","gcc", "pkg-config", "ncurses", "bash", "bzip2", "sed","ncurses-devel","procps-ng","coreutils", "m4","grep", "readline", "diffutils","gawk", "findutils", "gettext", "gzip","make", "patch", "util-linux", "tar", "xz","libtool", "flex", "bison", "readline-devel", "lua","lua-devel","popt","popt-devel","nspr","sqlite-autoconf","nss","nss-devel", "bzip2-devel","elfutils-libelf","elfutils","elfutils-libelf-devel","elfutils-devel", "expat","libffi","libpipeline", "gdbm","perl","texinfo","autoconf","automake", "openssl","openssl-devel","python2","python2-libs","python2-devel","rpm", "groff", "man-db", "man-pages","cpio"] self.listPkgsToInstallToolChain=["linux-api-headers", "glibc","glibc-devel", "zlib","zlib-devel", "file", "binutils","binutils-devel", "gmp","gmp-devel", "mpfr", "mpfr-devel", "mpc", "libgcc","libgcc-devel","libstdc++","libstdc++-devel","libgomp","libgomp-devel","gcc", "pkg-config", "ncurses", "bash", "bzip2", "sed","procps-ng","coreutils", "m4","grep", "readline","diffutils","gawk", "findutils", "gettext", "gzip","make", "patch", "util-linux", "tar", "xz","libtool", "flex", "bison", "lua","popt","nspr","sqlite-autoconf","nss","elfutils-libelf", "libpipeline", "gdbm","perl","texinfo","rpm", "autoconf","automake", "groff", "man-db", "man-pages","elfutils","cpio"] def prepareChroot(self,chrootID,toolsArchive=""): process = subprocess.Popen([self.prepareBuildRootCmd, chrootID, constants.specPath, constants.rpmPath, constants.toolsPath,toolsArchive]) returnVal = process.wait() if returnVal != 0: self.logger.error("Unable to prepare chroot.") return False cmdUtils=CommandUtils() cmdUtils.run_command("mkdir -p "+chrootID+constants.topDirPath+"/RPMS") cmdUtils.run_command("mkdir -p "+chrootID+constants.topDirPath+"/RPMS/x86_64") cmdUtils.run_command("mkdir -p "+chrootID+constants.topDirPath+"/RPMS/noarch") cmdUtils.run_command("mkdir -p "+chrootID+constants.topDirPath+"/SOURCES") cmdUtils.run_command("mkdir -p "+chrootID+constants.topDirPath+"/SPECS") self.logger.info("Successfully prepared chroot:"+chrootID) return True def buildToolChain(self): chrUtils = ChrootUtils(self.logName,self.logPath) returnVal,chrootID = chrUtils.createChroot() if not returnVal: self.logger.error("Unable to build tool chain.") chrUtils.destroyChroot(chrootID) return False if not self.prepareChroot(chrootID): self.logger.error("Unable to build tool chain.") chrUtils.destroyChroot(chrootID) return False pkgUtils=PackageUtils(self.logName,self.logPath) for package in self.listPkgsRequiredToBuildToolchain: rpmPkg=pkgUtils.findRPMFileForGivenPackage(package) if rpmPkg is None: #directly push them to golden repo, no test required returnVal = pkgUtils.buildRPMSForGivenPackage(package, chrootID) if not returnVal: self.logger.error("Stop building toolchain") chrUtils.destroyChroot(chrootID) return False returnVal = pkgUtils.installRPM(package, chrootID, True) if not returnVal: self.logger.error("Stop building toolchain") chrUtils.destroyChroot(chrootID) return False if package == "glibc": if not self.adjustToolChain(chrootID): self.logger.error("Adjusting tool chain failed. Stop building toolchain") chrUtils.destroyChroot(chrootID) return False self.logger.info("Successfully built toolchain") chrUtils.destroyChroot(chrootID) #tool chain should be updated before calling this method def installToolChain(self,chrootID): if not self.prepareChroot(chrootID,"minimal"): self.logger.error("Unable to install tool chain.") return False pkgUtils= PackageUtils(self.logName,self.logPath) for package in self.listPkgsToInstallToolChain: returnVal = pkgUtils.installRPM(package, chrootID, True) if not returnVal: self.logger.error("Error while installing toolchain on chroot:"+chrootID) return False if package == "glibc": if not self.adjustToolChain(chrootID): self.logger.error("Adjusting tool chain failed. Stop building toolchain") return False cmdUtils=CommandUtils() returnVal = cmdUtils.run_command("rm -rf "+ chrootID+"/tools") if not returnVal: self.logger.error("Error while removing toolchain tar from chroot:"+chrootID) return False returnVal = cmdUtils.run_command("rm "+ chrootID+"/"+constants.topDirPath+"/RPMS/x86_64/*") returnVal = cmdUtils.run_command("rm "+ chrootID+"/"+constants.topDirPath+"/RPMS/noarch/*") self.logger.info("Installed tool chain successfully on chroot:"+chrootID) return True def adjustToolChain(self,chrootID): shutil.copy2(self.adjustToolChainScript, chrootID+"/tmp") shutil.copy2(self.localegenScript, chrootID+"/sbin") shutil.copy2(self.localegenConfig, chrootID+"/etc") cmdUtils=CommandUtils() logFile=constants.logPath+"/adjustToolChainScript.log" returnVal = cmdUtils.run_command("/tmp/"+self.adjustToolChainScript,logFile, "./run-in-chroot.sh "+chrootID) return returnVal