#!/usr/bin/python # ostree-buildone-raw: Generic build system wrapper # Copyright 2010, 2011 Colin Walters # Licensed under the new-BSD license (http://www.opensource.org/licenses/bsd-license.php) import os,sys,re,subprocess import tempfile,shutil _devel_regexps = map(re.compile, [r'/usr/include/', r'/usr/share/pkgconfig/', r'/.*lib(?:|(?:32)|(?:64))/pkgconfig/.*\.pc', r'/.*lib(?:|(?:32)|(?:64))/.*\.so$']) def log(msg): fullmsg = 'ostree-buildone: ' + msg + '\n' sys.stdout.write(fullmsg) sys.stdout.flush() tempfiles = [] def do_exit(code): for tmpname in tempfiles: if os.path.isdir(tmpname): shutil.rmtree(tmpname) else: try: os.unlink(tmpname) pass except OSError, e: pass sys.exit(code) def fatal(msg): log(msg) do_exit(1) def run_sync(args, env=None): log("Running: %r" % (args, )) f = open('/dev/null', 'r') proc = subprocess.Popen(args, stdin=f, stdout=sys.stdout, stderr=sys.stderr, close_fds=True, env=env) f.close() returncode = proc.wait() if returncode == 0: func = log else: func = fatal func("pid %d exited with code %d" % (proc.pid, returncode)) basename=os.path.basename(os.getcwd()) artifact_prefix='artifact-%s,%s' % (basename, os.environ['OSBUILD_VERSION']) origdir=os.getcwd() os.chdir('_build') if not os.path.exists('Makefile'): log("No Makefile found") do_exit(1) (fd,fakeroot_temp)=tempfile.mkstemp(prefix='ostree-fakeroot-%s-' % (basename,)) os.close(fd) tempfiles.append(fakeroot_temp) tempdir = tempfile.mkdtemp(prefix='ostree-build-%s-' % (basename,)) tempfiles.append(tempdir) args = ['fakeroot', '-s', fakeroot_temp, 'make', 'install', 'DESTDIR=' + tempdir] run_sync(args) devel_files = set() runtime_files = set() oldpwd=os.getcwd() os.chdir(tempdir) for root, dirs, files in os.walk('.'): for filename in files: path = os.path.join(root, filename) matched = False for r in _devel_regexps: if r.match(path[1:]): devel_files.add(path) matched = True break if not matched: runtime_files.add(path) os.chdir(oldpwd) def make_artifact(name, from_files): artifact_target = '%s-%s.tar.gz' % (artifact_prefix, name) (fd,filelist_temp)=tempfile.mkstemp(prefix='ostree-filelist-%s-%s' % (basename, name)) os.close(fd) tempfiles.append(filelist_temp) f = open(filelist_temp, 'w') for filename in from_files: f.write(filename) f.write('\n') f.close() args = ['fakeroot', '-i', fakeroot_temp, 'tar', '-c', '-z', '-C', tempdir, '-f', artifact_target, '-T', filelist_temp] run_sync(args) if devel_files: make_artifact('devel', devel_files) make_artifact('runtime', runtime_files) do_exit(0)