Skip to content

Instantly share code, notes, and snippets.

@lamyj
Last active November 12, 2015 17:28
Show Gist options
  • Save lamyj/ae0b2e417d12b948e563 to your computer and use it in GitHub Desktop.
Save lamyj/ae0b2e417d12b948e563 to your computer and use it in GitHub Desktop.
Backport packages required for the compilation of Dopamine
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