root/packaging/centuryegg/build-rpms

Revision 12470, 4.6 KB (checked in by build, 16 months ago)

Move all Python versioning to two evironment variables

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:mime-type set to text/python-source
Line 
1#!/usr/bin/env python
2
3import logging
4import os
5import re
6import shutil
7import glob
8try:
9    import subprocess
10except ImportError:
11    from fake_subprocess import subprocess
12import sys
13import ConfigParser
14
15successful_run = True
16script = sys.argv[0]
17script = os.path.abspath(script)
18src_dir = os.path.dirname(script)
19os.chdir(src_dir)
20
21logging.getLogger().setLevel(logging.INFO)
22log_dir = os.path.join(src_dir, "logs")
23packages_dir = os.path.join(src_dir, "packages")
24rpm_dir = os.path.join(src_dir, "rpms")
25tmp_dir = os.path.join(src_dir, "tmp")
26
27for required_dir in [log_dir, packages_dir, rpm_dir, tmp_dir]:
28    if not os.path.exists(required_dir):
29        os.makedirs(required_dir)
30
31os.chdir(tmp_dir)
32if sys.version_info[0] == 2 and sys.version_info[1] < os.environ["MIN_PYTHON_MINOR_VERSION"]:
33    easyinstall = "easy_install-"+os.environ["PYTHON_VERSION"]
34    python = "python"+os.environ["PYTHON_VERSION"]
35else:
36    easyinstall = "easy_install"
37    python = "python"
38
39requirements = sys.argv[1:]
40if not requirements:
41    requirements = [line.strip() for line in open(os.path.join(src_dir, "requirements")) if line.strip() and not line.startswith("#")]
42
43packages = []
44
45for requirement in requirements[:]:
46    package_name = re.compile("^(?P<name>[A-Za-z0-9_-]+) *(?P<versionmatch>[<=>]+.*)? *").match(requirement).group("name")
47    existing_packages = glob.glob("../rpms/%s-*.rpm" % package_name)
48    if existing_packages:
49        logging.info("Not building %s due to existing packages %r - remove these if a rebuild is required" % (requirement, existing_packages))
50        requirements.remove(requirement)
51        continue
52    package_name = package_name.lower()
53    logging.info("Easy-install downloading %s" % (requirement,))
54    package_build_dir = os.path.join(packages_dir, package_name)
55    if os.path.exists(package_build_dir):
56        shutil.rmtree(package_build_dir)
57    packages.append(package_name)
58if not requirements:
59    sys.exit()
60log_filename = os.path.join(log_dir, "fetch-easyinstall.log")
61log_file = open(log_filename, "ab")
62retcode = subprocess.call([easyinstall, "-eUNb", packages_dir] + requirements, stdout=log_file, stderr=log_file)
63if retcode:
64    logging.warning("Error fetching source packages for %s: tail of log file %s follows" % (" ".join(requirements), log_filename))
65    print "".join(open(log_filename, "rb").readlines()[-10:])
66    successful_run = False
67
68# for d in [d_name for d_name in os.listdir(packages_dir) if os.path.isdir(os.path.join(packages_dir, d_name)]:
69for package_name in packages:
70    logging.info("building rpm for %s" % (package_name,))
71    package_subdir = os.path.join(packages_dir, package_name)
72    if not os.path.exists(package_subdir):
73        logging.warning("could not find directory for building: %s" % (package_subdir,))
74        continue
75    os.chdir(package_subdir)
76    if os.path.exists("build"):
77        shutil.rmtree("build")
78    build_config = ConfigParser.ConfigParser()
79    build_config.read('setup.cfg')
80    build_config.has_section('install') or build_config.add_section('install')
81    build_config.set('install', 'compile', '1')
82    build_config.set('install', 'optimize', '1')
83    build_config.write(open('setup.cfg', 'w'))
84    subprocess.call([python, "setup.py", "clean"])
85    if os.path.exists("MANIFEST"):
86        if "setup.cfg\n" not in open("MANIFEST", "r").read():
87            open("MANIFEST", "a").write("\nsetup.cfg\n")
88    # TODO: add a way of customizing particular packages
89    if package_name == "cherrypy":
90        open("MANIFEST.in", "w").write("graft cherrypy/\nsetup.cfg\nsetup.py\n")
91    if package_name == "oursql":
92        setup_code = open("setup.py", "rb").read()
93        setup_code = setup_code.replace("Extension(Extension)", "Extension(Extension, object)")
94        open("setup.py", "wb").write(setup_code)
95        open("MANIFEST.in", "w").write("include README\ninclude setup.cfg\ninclude setup.py\nglobal-include *.c *.h *.pyx *.pxi\ninclude MANIFEST.in\n")
96    log_filename = os.path.join(log_dir, "%s-build-rpm.log" % (package_name,))
97    log_file = open(log_filename, "wb")
98    ret_code = subprocess.call([python, "setup.py", "bdist_rpm", "--python=%s" % python], stdout=log_file, stderr=log_file)
99    if ret_code:
100        logging.warning("build unsuccessful; tailing log file")
101        print "".join(open(log_filename, "rb").readlines()[-10:])
102        successful_run = False
103    if os.path.exists("dist"):
104        for rpm_filename in [filename for filename in os.listdir("dist") if filename.endswith(".rpm")]:
105            shutil.copyfile(os.path.join("dist", rpm_filename), os.path.join(rpm_dir, rpm_filename))
106
107if not successful_run:
108    sys.exit(1)
Note: See TracBrowser for help on using the browser.