| #!/usr/bin/env python |
| |
| ## Copyright (C) 2005, 2006, 2007, 2011 Free Software Foundation |
| ## Written by Gary Benson <gbenson@redhat.com> |
| ## |
| ## This program is free software; you can redistribute it and/or modify |
| ## it under the terms of the GNU General Public License as published by |
| ## the Free Software Foundation; either version 2 of the License, or |
| ## (at your option) any later version. |
| ## |
| ## This program is distributed in the hope that it will be useful, |
| ## but WITHOUT ANY WARRANTY; without even the implied warranty of |
| ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| ## GNU General Public License for more details. |
| |
| import sys |
| sys.path.insert(0, "@python_mod_dir_expanded@") |
| import aotcompile |
| import os |
| |
| def libdir(): |
| cmd = "%s -p" % aotcompile.PATHS["dbtool"] |
| dir = os.path.abspath(os.popen(cmd, "r").readline().rstrip()) |
| dir, base = os.path.split(dir) |
| if base != "classmap.db": |
| raise aotcompile.Error, "%s: unexpected output" % cmd |
| dir, base = os.path.split(dir) |
| if not base.startswith("gcj-"): |
| raise aotcompile.Error, "%s: unexpected output" % cmd |
| return dir |
| |
| def writeSourceList(srcdir, dstpath): |
| def visit(fp, dir, items): |
| for item in items: |
| path = os.path.join(dir, item) |
| if os.path.isfile(path): |
| print >>fp, path |
| dstdir = os.path.dirname(dstpath) |
| if not os.path.isdir(dstdir): |
| os.makedirs(dstdir) |
| os.path.walk(srcdir, visit, open(dstpath, "w")) |
| |
| def copy(srcdir, dstdir, suffix): |
| srcdir = os.path.join(srcdir, suffix.lstrip(os.sep)) |
| dstdir = os.path.join(dstdir, suffix.lstrip(os.sep)) |
| os.makedirs(os.path.dirname(dstdir)) |
| aotcompile.system(("/bin/cp", "-a", srcdir, dstdir)) |
| |
| try: |
| name = os.environ.get("RPM_PACKAGE_NAME") |
| if name is None: |
| raise aotcompile.Error, "not for use outside rpm specfiles" |
| arch = os.environ.get("RPM_ARCH") |
| if arch == "noarch": |
| raise aotcompile.Error, "cannot be used on noarch packages" |
| srcdir = os.environ.get("RPM_BUILD_ROOT") |
| if srcdir in (None, "/"): |
| raise aotcompile.Error, "bad $RPM_BUILD_ROOT" |
| tmpdir = os.path.join(os.getcwd(), "aot-compile-rpm") |
| if os.path.exists(tmpdir): |
| raise aotcompile.Error, "%s exists" % tmpdir |
| dstdir = os.path.join(libdir(), "gcj", name) |
| |
| compiler = aotcompile.Compiler(srcdir, dstdir, tmpdir) |
| compiler.gcjflags[0:0] = os.environ.get("RPM_OPT_FLAGS", "").split() |
| |
| # XXX: This script should not accept options, because having |
| # them it cannot be integrated into rpm. But, gcj cannot |
| # build each and every jarfile yet, so we must be able to |
| # exclude until it can. |
| # XXX --exclude is also used in the jonas rpm to stop |
| # everything being made a subset of the mammoth client |
| # jarfile. Should adjust the subset checker's bias to |
| # favour many small jarfiles over one big one. |
| try: |
| options, exclusions = sys.argv[1:], [] |
| while options: |
| if options.pop(0) != "--exclude": |
| raise ValueError |
| compiler.exclusions.append( |
| os.path.join(srcdir, options.pop(0).lstrip(os.sep))) |
| except: |
| print >>sys.stderr, "usage: %s [--exclude PATH]..." % ( |
| os.path.basename(sys.argv[0])) |
| sys.exit(1) |
| |
| sourcelist = os.path.join(tmpdir, "sources.list") |
| writeSourceList(os.getcwd(), sourcelist) |
| compiler.gcjflags.append("-fsource-filename=" + sourcelist) |
| |
| compiler.compile() |
| copy(tmpdir, srcdir, dstdir) |
| |
| except aotcompile.Error, e: |
| print >>sys.stderr, "%s: error: %s" % ( |
| os.path.basename(sys.argv[0]), e) |
| sys.exit(1) |