Last active
November 12, 2015 17:28
-
-
Save lamyj/ae0b2e417d12b948e563 to your computer and use it in GitHub Desktop.
Backport packages required for the compilation of Dopamine
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import glob | |
import logging | |
import os | |
import re | |
import shutil | |
import subprocess | |
import sys | |
import tempfile | |
import urllib | |
import urlparse | |
class Backport(object): | |
def __init__(self, url, build_dependencies, arguments=None, install="all"): | |
self.url = url | |
self.build_dependencies = build_dependencies | |
self.arguments = arguments or [] | |
self.install = install | |
def __call__(self): | |
if self.build_dependencies: | |
logging.debug( | |
"Installing {0}".format( | |
", ".join(self.build_dependencies) | |
) | |
) | |
Backport._check_output( | |
["yum", "-y", "install"]+self.build_dependencies) | |
directory = tempfile.mkdtemp() | |
try: | |
# Fetch source RPM | |
rpm = os.path.join( | |
directory, | |
os.path.basename(urlparse.urlsplit(self.url).path)) | |
logging.debug("Fetching {0} to {1}".format(self.url, rpm)) | |
urllib.urlretrieve(self.url, rpm) | |
# Install it | |
logging.debug("Installing {0}".format(rpm)) | |
Backport._check_output(["rpm", "-i", rpm]) | |
# Build it | |
logging.debug("Building {0}".format(rpm)) | |
files = self._check_output(["rpm", "-ql", "-p", rpm]) | |
spec = os.path.join( | |
os.path.expanduser("~/rpmbuild/SPECS"), | |
[x for x in files.splitlines() if x.endswith(".spec")][0]) | |
logging.debug(".spec file is {0}".format(spec)) | |
build_output = Backport._check_output( | |
["rpmbuild", "-bb", spec]+self.arguments) | |
# Install packages | |
packages = self._get_built_rpms(spec, build_output) | |
logging.debug("Installing {0}".format(", ".join(packages))) | |
Backport._check_output(["rpm", "-i"]+packages) | |
finally: | |
shutil.rmtree(directory) | |
@staticmethod | |
def _check_output(command): | |
process = subprocess.Popen( | |
command, | |
stdout=subprocess.PIPE, stderr=subprocess.STDOUT) | |
output = process.communicate() | |
if process.returncode != 0: | |
raise Exception(output[0]) | |
else: | |
return output[0] | |
@staticmethod | |
def _get_version(spec): | |
version = None | |
with open(spec) as fd: | |
for line in fd.read().splitlines(): | |
match = re.match(r"Version:\s+(.*)", line) | |
if match: | |
version = match.group(1) | |
break | |
if version is None: | |
raise Exception("Could not get version") | |
return version | |
def _get_built_rpms(self, spec, build_output): | |
packages = [] | |
if self.install == "all": | |
for line in build_output.splitlines(): | |
match = re.match(r"Wrote:\s+(.*)$", line) | |
if match: | |
packages.append(match.group(1)) | |
else: | |
version = Backport._get_version(spec) | |
logging.debug("Version is {0}".format(version)) | |
packages = [ | |
glob.glob( | |
os.path.join( | |
os.path.expanduser("~/rpmbuild/RPMS/*"), | |
"{0}-{1}*.rpm".format(package, version)))[0] | |
for package in self.install] | |
return packages | |
def main(): | |
logging.basicConfig(level=logging.DEBUG) | |
source = "ftp://fr2.rpmfind.net/linux/fedora/linux/releases/21/Everything/source/SRPMS" | |
charls = Backport( | |
os.path.join(source, "c", "CharLS-1.0-8.fc21.src.rpm"), | |
["cmake", "dos2unix"]) | |
dcmtk = Backport( | |
os.path.join(source, "d", "dcmtk-3.6.0-18.fc21.src.rpm"), | |
[ | |
"cmake", "libjpeg-devel", "libpng-devel", "libtiff-devel", | |
"libxml2-devel", "openssl-devel", "tcp_wrappers-devel", | |
"zlib-devel", "CharLS-devel", "doxygen" | |
] | |
) | |
cgicc = Backport( | |
"http://download.opensuse.org/repositories/home:/gbvalor/CentOS_5/src/cgicc-3.2.10-2.3.src.rpm", | |
["gcc-c++", "doxygen"], | |
install=["cgicc", "libcgicc5", "cgicc-devel"] | |
) | |
mimetic = Backport( | |
os.path.join(source, "m", "mimetic-0.9.8-2.fc21.src.rpm"), | |
["doxygen"]) | |
boost = Backport( | |
os.path.join(source, "b", "boost-1.55.0-4.fc21.src.rpm"), | |
[ | |
"m4", "libstdc++-devel", "bzip2-devel", "zlib-devel", | |
"python-devel", "libicu-devel", "openmpi-devel", "mpich-devel" | |
], | |
arguments=["--without", "python3"] | |
) | |
libunwind = Backport( | |
os.path.join(source, "l", "libunwind-1.1-7.fc21.src.rpm"), | |
["automake", "libtool", "autoconf"]) | |
gperftools = Backport( | |
os.path.join(source, "g", "gperftools-2.2.1-2.fc21.src.rpm"), | |
["libunwind-devel"], install=["gperftools-libs", "gperftools-devel"]) | |
v8 = Backport( | |
os.path.join(source, "v", "v8-3.14.5.10-14.fc21.src.rpm"), | |
["scons", "readline-devel", "libicu-devel"]) | |
mongodb = Backport( | |
os.path.join(source, "m", "mongodb-2.4.9-8.fc21.src.rpm"), | |
[ | |
"boost-devel", "gperftools-devel", "libpcap-devel", | |
"openssl-devel", "pcre-devel", "python-devel", "readline-devel", | |
"scons", "snappy-devel", "v8-devel" | |
] | |
) | |
backports = [ | |
charls, dcmtk, cgicc, mimetic, boost, libunwind, gperftools, v8,mongodb | |
] | |
for backport in backports: | |
backport() | |
if __name__ == "__main__": | |
sys.exit(main()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment