[ecj] 01/37: Imported Debian patch 3.2.2-0
Emmanuel Bourg
ebourg-guest at moszumanska.debian.org
Wed Jun 25 23:35:09 UTC 2014
This is an automated email from the git hooks/post-receive script.
ebourg-guest pushed a commit to branch master
in repository ecj.
commit 6a26a4b07a434d875de6805a159c3cc0e5cf1521
Author: Matthias Klose <doko at debian.org>
Date: Sat Mar 3 19:37:46 2007 +0100
Imported Debian patch 3.2.2-0
---
debian/README.Debian | 12 +
debian/aot-compile | 89 ++++
debian/aotcompile.py | 423 +++++++++++++++++++
debian/changelog | 303 ++++++++++++++
debian/classfile.py | 222 ++++++++++
debian/compat | 1 +
debian/control | 45 ++
debian/copyright | 258 ++++++++++++
debian/ecj-gcj.install | 3 +
debian/ecj-gcj.postinst | 7 +
debian/ecj-gcj.postrm | 7 +
debian/ecj.1 | 104 +++++
debian/ecj.install | 2 +
debian/ecj.links | 1 +
debian/ecj.manpages | 1 +
debian/ecj.postinst | 6 +
debian/ecj.prerm | 5 +
debian/patches/ecj-gccmain.diff | 511 +++++++++++++++++++++++
debian/patches/ecj-square-bracket-classpath.diff | 103 +++++
debian/rules | 177 ++++++++
ecj | 31 ++
ecj-bootstrap | 31 ++
22 files changed, 2342 insertions(+)
diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644
index 0000000..e647f71
--- /dev/null
+++ b/debian/README.Debian
@@ -0,0 +1,12 @@
+ecj-bootstrap
+=============
+
+This package is not intended for end users! This is basically to make
+it so that you can sanely bootstrap a port. This high-quality java
+compiler is buildable with just gcj-4, which in turn is built in C.
+
+In particular, this doesn't include support for ant - When compiling
+with this version of ecj, ant will spawn a new VM instance and shell
+out to it to compile. This means significantly higher memory costs,
+and slower compiles.
+
diff --git a/debian/aot-compile b/debian/aot-compile
new file mode 100644
index 0000000..2caf8f4
--- /dev/null
+++ b/debian/aot-compile
@@ -0,0 +1,89 @@
+#! /usr/bin/python
+
+## Copyright (C) 2006 Red Hat, Inc.
+## Written by Gary Benson <gbenson at 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 aotcompile
+import getopt
+import os
+import sys
+
+usage = """\
+Usage: %s [OPTION...] SRCDIR DSTDIR
+AOT-compile all Java bytecode in SRCDIR into DSTDIR.
+Note that DSTDIR must be within SRCDIR.
+
+Options:
+ -M, --make=PATH make executable to use (%s)
+ -C, --gcj=PATH gcj executable to use (%s)
+ -D, --dbtool=PATH gcj-dbtool executable to use (%s)
+ -m, --makeflags=FLAGS flags to pass to make during build
+ -c, --gcjflags=FLAGS flags to pass to gcj during compilation
+ in addition to %s
+ -l, --ldflags=FLAGS flags to pass to gcj during linking
+ in addition to %s
+ -e, --exclude=PATH do not compile PATH
+ -L, --libdir=DIR overwrite destination directory
+
+Extra flags may also be passed using the AOT_MAKEFLAGS, AOT_GCJFLAGS
+and AOT_LDFLAGS environment variables.""" % (
+ os.path.basename(sys.argv[0]),
+ aotcompile.PATHS["make"],
+ aotcompile.PATHS["gcj"],
+ aotcompile.PATHS["dbtool"],
+ repr(" ".join(aotcompile.GCJFLAGS)),
+ repr(" ".join(aotcompile.LDFLAGS)))
+
+try:
+ if os.environ.has_key("RPM_PACKAGE_NAME"):
+ raise aotcompile.Error, "not for use within rpm specfiles"
+
+ try:
+ opts, args = getopt.getopt(
+ sys.argv[1:],
+ "C:c:l:D:e:L:",
+ ["gcj=", "dbtool=", "gcjflags=", "ldflags=", "exclude=", "libdir="])
+ srcdir, dstdir = args
+ except:
+ print >>sys.stderr, usage
+ sys.exit(1)
+
+ compiler = aotcompile.Compiler(srcdir, dstdir)
+ for o, a in opts:
+ if o in ("-M", "--make"):
+ aotcompile.PATHS["make"] = a
+ if o in ("-C", "--gcj"):
+ aotcompile.PATHS["gcj"] = a
+ if o in ("-D", "--dbtool"):
+ aotcompile.PATHS["dbtool"] = a
+ if o in ("-m", "--makeflags"):
+ compiler.makeflags[0:0] = a.split()
+ if o in ("-c", "--gcjflags"):
+ compiler.gcjflags[0:0] = a.split()
+ if o in ("-l", "--ldflags"):
+ compiler.ldflags[0:0] = a.split()
+ if o in ("-e", "--exclude"):
+ compiler.exclusions.append(a)
+ if o in ("-L", "--libdir"):
+ compiler.libdir = a
+
+ compiler.makeflags[0:0] = os.environ.get("AOT_MAKEFLAGS", "").split()
+ compiler.gcjflags[0:0] = os.environ.get("AOT_GCJFLAGS", "").split()
+ compiler.ldflags[0:0] = os.environ.get("AOT_LDFLAGS", "").split()
+
+ compiler.compile()
+
+except aotcompile.Error, e:
+ print >>sys.stderr, "%s: error: %s" % (
+ os.path.basename(sys.argv[0]), e)
+ sys.exit(1)
diff --git a/debian/aotcompile.py b/debian/aotcompile.py
new file mode 100644
index 0000000..1793b79
--- /dev/null
+++ b/debian/aotcompile.py
@@ -0,0 +1,423 @@
+
+# -*- python -*-
+
+## Copyright (C) 2005, 2006 Red Hat, Inc.
+## Written by Gary Benson <gbenson at 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 classfile
+import copy
+import md5
+import operator
+import os
+import sys
+import cStringIO as StringIO
+import zipfile
+
+PATHS = {"make": "/usr/bin/make",
+ "gcj": "/usr/bin/gcj-4.1",
+ "dbtool": "/usr/bin/gcj-dbtool-4.1"}
+
+MAKEFLAGS = []
+GCJFLAGS = ["-g", "-O2", "-fPIC", "-findirect-dispatch", "-fjni"]
+LDFLAGS = ["-Wl,-Bsymbolic"]
+
+MAX_CLASSES_PER_JAR = 1024
+MAX_BYTES_PER_JAR = 1048576
+
+try:
+ for line in file('/proc/meminfo'):
+ if line.startswith('MemTotal:'):
+ memtotal = int(line.split()[1])
+ if memtotal < 270000:
+ MAX_CLASSES_PER_JAR = 512
+ MAX_BYTES_PER_JAR = 524288
+ if memtotal < 140000:
+ MAX_CLASSES_PER_JAR = 256
+ MAX_BYTES_PER_JAR = 262144
+except:
+ pass
+
+MAKEFILE = "Makefile"
+
+MAKEFILE_HEADER = '''\
+GCJ = %(gcj)s
+DBTOOL = %(dbtool)s
+GCJFLAGS = %(gcjflags)s
+LDFLAGS = %(ldflags)s
+
+%%.o: %%.jar
+ $(GCJ) -c $(GCJFLAGS) $< -o $@
+
+TARGETS = \\
+%(targets)s
+
+all: $(TARGETS)'''
+
+MAKEFILE_JOB = '''
+%(base)s_SOURCES = \\
+%(jars)s
+
+%(base)s_OBJECTS = \\
+$(%(base)s_SOURCES:.jar=.o)
+
+%(dso)s: $(%(base)s_OBJECTS)
+ $(GCJ) -shared $(GCJFLAGS) $(LDFLAGS) $^ -o $@
+
+%(db)s: $(%(base)s_SOURCES)
+ $(DBTOOL) -n $@ 64
+ for jar in $^; do \\
+ $(DBTOOL) -f $@ $$jar \\
+ %(libdir)s/%(dso)s; \\
+ done'''
+
+ZIPMAGIC, CLASSMAGIC = "PK\x03\x04", "\xca\xfe\xba\xbe"
+
+class Error(Exception):
+ pass
+
+class Compiler:
+ def __init__(self, srcdir, dstdir):
+ self.srcdir = os.path.abspath(srcdir)
+ self.dstdir = os.path.abspath(dstdir)
+ if not self.dstdir.startswith(self.srcdir):
+ raise Error, "dstdir must be within srcdir"
+ self.libdir = dstdir[len(self.srcdir):]
+
+ # Calling code may modify these parameters
+ self.gcjflags = copy.copy(GCJFLAGS)
+ self.ldflags = copy.copy(LDFLAGS)
+ self.makeflags = copy.copy(MAKEFLAGS)
+ self.exclusions = []
+
+ def compile(self):
+ """Search srcdir for classes and jarfiles, then generate
+ solibs and mappings databases for them all in libdir."""
+ if not os.path.isdir(self.dstdir):
+ os.makedirs(self.dstdir)
+ oldcwd = os.getcwd()
+ os.chdir(self.dstdir)
+ try:
+ jobs = self.getJobList()
+ self.writeMakefile(MAKEFILE, jobs)
+ for job in jobs:
+ job.writeJars()
+ system([PATHS["make"]] + self.makeflags)
+ for job in jobs:
+ job.clean()
+ os.unlink(MAKEFILE)
+ finally:
+ os.chdir(oldcwd)
+
+ def getJobList(self):
+ """Return all jarfiles and class collections in srcdir."""
+ jobs = weed_jobs(find_jobs(self.srcdir, self.exclusions))
+ set_basenames(jobs)
+ return jobs
+
+ def writeMakefile(self, path, jobs):
+ """Generate a makefile to build the solibs and mappings
+ databases for the specified list of jobs."""
+ fp = open(path, "w")
+ print >>fp, MAKEFILE_HEADER % {
+ "gcj": PATHS["gcj"],
+ "dbtool": PATHS["dbtool"],
+ "gcjflags": " ".join(self.gcjflags),
+ "ldflags": " ".join(self.ldflags),
+ "targets": " \\\n".join(reduce(operator.add, [
+ (job.dsoName(), job.dbName()) for job in jobs]))}
+ for job in jobs:
+ values = job.ruleArguments()
+ values["libdir"] = self.libdir
+ print >>fp, MAKEFILE_JOB % values
+ fp.close()
+
+def find_jobs(dir, exclusions = ()):
+ """Scan a directory and find things to compile: jarfiles (zips,
+ wars, ears, rars, etc: we go by magic rather than file extension)
+ and directories of classes."""
+ def visit((classes, zips), dir, items):
+ for item in items:
+ path = os.path.join(dir, item)
+ if os.path.islink(path) or not os.path.isfile(path):
+ continue
+ magic = open(path, "r").read(4)
+ if magic == ZIPMAGIC:
+ zips.append(path)
+ elif magic == CLASSMAGIC:
+ classes.append(path)
+ classes, paths = [], []
+ os.path.walk(dir, visit, (classes, paths))
+ # Convert the list of classes into a list of directories
+ while classes:
+ # XXX this requires the class to be correctly located in its heirachy.
+ path = classes[0][:-len(os.sep + classname(classes[0]) + ".class")]
+ paths.append(path)
+ classes = [cls for cls in classes if not cls.startswith(path)]
+ # Handle exclusions. We're really strict about them because the
+ # option is temporary in aot-compile-rpm and dead options left in
+ # specfiles will hinder its removal.
+ for path in exclusions:
+ if path in paths:
+ paths.remove(path)
+ else:
+ raise Error, "%s: path does not exist or is not a job" % path
+ # Build the list of jobs
+ jobs = []
+ paths.sort()
+ for path in paths:
+ if os.path.isfile(path):
+ job = JarJob(path)
+ else:
+ job = DirJob(path)
+ if len(job.classes):
+ jobs.append(job)
+ return jobs
+
+class Job:
+ """A collection of classes that will be compiled as a unit."""
+
+ def __init__(self, path):
+ self.path, self.classes, self.blocks = path, {}, None
+
+ def addClass(self, bytes):
+ """Subclasses call this from their __init__ method for
+ every class they find."""
+ self.classes[md5.new(bytes).digest()] = bytes
+
+ def __makeBlocks(self):
+ """Split self.classes into chunks that can be compiled to
+ native code by gcj. In the majority of cases this is not
+ necessary -- the job will have come from a jarfile which will
+ be equivalent to the one we generate -- but this only happens
+ _if_ the job was a jarfile and _if_ the jarfile isn't too big
+ and _if_ the jarfile has the correct extension and _if_ all
+ classes are correctly named and _if_ the jarfile has no
+ embedded jarfiles. Fitting a special case around all these
+ conditions is tricky to say the least.
+
+ Note that this could be called at the end of each subclass's
+ __init__ method. The reason this is not done is because we
+ need to parse every class file. This is slow, and unnecessary
+ if the job is subsetted."""
+ names = {}
+ for hash, bytes in self.classes.items():
+ name = classname(bytes)
+ if not names.has_key(name):
+ names[name] = []
+ names[name].append(hash)
+ names = names.items()
+ # We have to sort somehow, or the jars we generate
+ # We sort by name in a simplistic attempt to keep related
+ # classes together so inter-class optimisation can happen.
+ names.sort()
+ self.blocks, bytes = [[]], 0
+ for name, hashes in names:
+ for hash in hashes:
+ if len(self.blocks[-1]) >= MAX_CLASSES_PER_JAR \
+ or bytes >= MAX_BYTES_PER_JAR:
+ self.blocks.append([])
+ bytes = 0
+ self.blocks[-1].append((name, hash))
+ bytes += len(self.classes[hash])
+
+ # From Archit Shah:
+ # The implementation and the documentation don't seem to match.
+ #
+ # [a, b].isSubsetOf([a]) => True
+ #
+ # Identical copies of all classes this collection do not exist
+ # in the other. I think the method should be named isSupersetOf
+ # and the documentation should swap uses of "this" and "other"
+ #
+ # XXX think about this when I've had more sleep...
+ def isSubsetOf(self, other):
+ """Returns True if identical copies of all classes in this
+ collection exist in the other."""
+ for item in other.classes.keys():
+ if not self.classes.has_key(item):
+ return False
+ return True
+
+ def __targetName(self, ext):
+ return self.basename + ext
+
+ def tempJarName(self, num):
+ return self.__targetName(".%d.jar" % (num + 1))
+
+ def tempObjName(self, num):
+ return self.__targetName(".%d.o" % (num + 1))
+
+ def dsoName(self):
+ """Return the filename of the shared library that will be
+ built from this job."""
+ return self.__targetName(".so")
+
+ def dbName(self):
+ """Return the filename of the mapping database that will be
+ built from this job."""
+ return self.__targetName(".db")
+
+ def ruleArguments(self):
+ """Return a dictionary of values that when substituted
+ into MAKEFILE_JOB will create the rules required to build
+ the shared library and mapping database for this job."""
+ if self.blocks is None:
+ self.__makeBlocks()
+ return {
+ "base": "".join(
+ [c.isalnum() and c or "_" for c in self.dsoName()]),
+ "jars": " \\\n".join(
+ [self.tempJarName(i) for i in xrange(len(self.blocks))]),
+ "dso": self.dsoName(),
+ "db": self.dbName()}
+
+ def writeJars(self):
+ """Generate jarfiles that can be native compiled by gcj."""
+ if self.blocks is None:
+ self.__makeBlocks()
+ for block, i in zip(self.blocks, xrange(len(self.blocks))):
+ jar = zipfile.ZipFile(self.tempJarName(i), "w", zipfile.ZIP_STORED)
+ for name, hash in block:
+ jar.writestr(
+ zipfile.ZipInfo("%s.class" % name), self.classes[hash])
+ jar.close()
+
+ def clean(self):
+ """Delete all temporary files created during this job's build."""
+ if self.blocks is None:
+ self.__makeBlocks()
+ for i in xrange(len(self.blocks)):
+ os.unlink(self.tempJarName(i))
+ os.unlink(self.tempObjName(i))
+
+class JarJob(Job):
+ """A Job whose origin was a jarfile."""
+
+ def __init__(self, path):
+ Job.__init__(self, path)
+ self._walk(zipfile.ZipFile(path, "r"))
+
+ def _walk(self, zf):
+ for name in zf.namelist():
+ bytes = zf.read(name)
+ if bytes.startswith(ZIPMAGIC):
+ self._walk(zipfile.ZipFile(StringIO.StringIO(bytes)))
+ elif bytes.startswith(CLASSMAGIC):
+ self.addClass(bytes)
+
+class DirJob(Job):
+ """A Job whose origin was a directory of classfiles."""
+
+ def __init__(self, path):
+ Job.__init__(self, path)
+ os.path.walk(path, DirJob._visit, self)
+
+ def _visit(self, dir, items):
+ for item in items:
+ path = os.path.join(dir, item)
+ if os.path.islink(path) or not os.path.isfile(path):
+ continue
+ fp = open(path, "r")
+ magic = fp.read(4)
+ if magic == CLASSMAGIC:
+ self.addClass(magic + fp.read())
+
+def weed_jobs(jobs):
+ """Remove any jarfiles that are completely contained within
+ another. This is more common than you'd think, and we only
+ need one nativified copy of each class after all."""
+ jobs = copy.copy(jobs)
+ while True:
+ for job1 in jobs:
+ for job2 in jobs:
+ if job1 is job2:
+ continue
+ if job1.isSubsetOf(job2):
+ msg = "subsetted %s" % job2.path
+ if job2.isSubsetOf(job1):
+ if (isinstance(job1, DirJob) and
+ isinstance(job2, JarJob)):
+ # In the braindead case where a package
+ # contains an expanded copy of a jarfile
+ # the jarfile takes precedence.
+ continue
+ msg += " (identical)"
+ warn(msg)
+ jobs.remove(job2)
+ break
+ else:
+ continue
+ break
+ else:
+ break
+ continue
+ return jobs
+
+def set_basenames(jobs):
+ """Ensure that each jarfile has a different basename."""
+ names = {}
+ for job in jobs:
+ name = os.path.basename(job.path)
+ if not names.has_key(name):
+ names[name] = []
+ names[name].append(job)
+ for name, set in names.items():
+ if len(set) == 1:
+ set[0].basename = name
+ continue
+ # prefix the jar filenames to make them unique
+ # XXX will not work in most cases -- needs generalising
+ set = [(job.path.split(os.sep), job) for job in set]
+ minlen = min([len(bits) for bits, job in set])
+ set = [(bits[-minlen:], job) for bits, job in set]
+ bits = apply(zip, [bits for bits, job in set])
+ while True:
+ row = bits[-2]
+ for bit in row[1:]:
+ if bit != row[0]:
+ break
+ else:
+ del bits[-2]
+ continue
+ break
+ set = zip(
+ ["_".join(name) for name in apply(zip, bits[-2:])],
+ [job for bits, job in set])
+ for name, job in set:
+ warn("building %s as %s" % (job.path, name))
+ job.basename = name
+ # XXX keep this check until we're properly general
+ names = {}
+ for job in jobs:
+ name = job.basename
+ if names.has_key(name):
+ raise Error, "%s: duplicate jobname" % name
+ names[name] = 1
+
+def system(command):
+ """Execute a command."""
+ status = os.spawnv(os.P_WAIT, command[0], command)
+ if status > 0:
+ raise Error, "%s exited with code %d" % (command[0], status)
+ elif status < 0:
+ raise Error, "%s killed by signal %d" % (command[0], -status)
+
+def warn(msg):
+ """Print a warning message."""
+ print >>sys.stderr, "%s: warning: %s" % (
+ os.path.basename(sys.argv[0]), msg)
+
+def classname(bytes):
+ """Extract the class name from the bytes of a class file."""
+ klass = classfile.Class(bytes)
+ return klass.constants[klass.constants[klass.name][1]][1]
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..313a9e0
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,303 @@
+ecj (3.2.2-0) experimental; urgency=low
+
+ * New upstream version.
+ - Update patches.
+ * (Build-)depend on gcj generics backport.
+ * Build-Conflicts with ecj-bootstrap-gcj (<< 3.2.2).
+ * Merge from Ubuntu:
+ - Split out patches.
+ - Add ecj-square-bracket-classpath.diff.
+ - ecj-bootstrap: Add compatibilty script ecj-bootstrap.
+ - Install the jar as eclipse-ecj.jar, provide an ecj.jar symlink.
+ - Rename source and binary package to ecj.
+ - Pass gcj and gcj-dbtool versions to aot-compile.
+
+ -- Matthias Klose <doko at debian.org> Sat, 3 Mar 2007 19:37:46 +0100
+
+ecj-bootstrap (3.2.1-6) unstable; urgency=low
+
+ * Fix PR java/30585 (-Werror and -Wall not working). Taken from the rhug
+ repository.
+
+ -- Matthias Klose <doko at debian.org> Sat, 3 Feb 2007 14:16:47 +0100
+
+ecj-bootstrap (3.2.1-5) unstable; urgency=low
+
+ * debian/control: Call it a "standalone" version, not a "bootstrap"
+ version. The package is used as the compiler in java-gcj-compat-dev
+ as well. See also #396170.
+
+ -- Matthias Klose <doko at debian.org> Thu, 11 Jan 2007 20:44:40 +0100
+
+ecj-bootstrap (3.2.1-4) unstable; urgency=medium
+
+ * Refactor batch/org/eclipse/jdt/internal/compiler/batch/Main.java,
+ add batch/org/eclipse/jdt/internal/compiler/batch/GCCMain.java,
+ needed to bootstrap GCC-4.3.
+
+ -- Matthias Klose <doko at debian.org> Tue, 9 Jan 2007 00:09:22 +0100
+
+ecj-bootstrap (3.2.1-3) unstable; urgency=low
+
+ * Add missing build dependency.
+
+ -- Matthias Klose <doko at debian.org> Sun, 8 Oct 2006 01:40:00 +0200
+
+ecj-bootstrap (3.2.1-2) unstable; urgency=low
+
+ * Add 1.6 compatibility in package description.
+ * Use own copy of aot-compile to build with less memory resources
+ on arm and m68k.
+ * Build the standalone binary without -fjni -findirect-dispatch.
+
+ -- Matthias Klose <doko at debian.org> Sat, 7 Oct 2006 23:38:47 +0200
+
+ecj-bootstrap (3.2.1-1) unstable; urgency=medium
+
+ * New upstream version.
+ * ecj-bootstrap-gcj: Add postrm script.
+
+ -- Matthias Klose <doko at debian.org> Tue, 3 Oct 2006 09:35:39 +0200
+
+ecj-bootstrap (3.2-3) unstable; urgency=low
+
+ * Install classmap db in /usr/share/gcj/classmap.db, install jar.so
+ in /usr/lib/gcj.
+ * ecj-bootstrap-gcj.postinst: Use rebuild-gcj-db.
+ * Build depend on gcj-4.1 (>= 4.1.1-13).
+
+ -- Matthias Klose <doko at debian.org> Sat, 2 Sep 2006 13:55:21 +0000
+
+ ecj-bootstrap (3.2-2) experimental; urgency=low
+
+ * Build using the gcj backport from experimental.
+ * Do not build the binary ecj.
+
+ -- Matthias Klose <doko at debian.org> Sun, 13 Aug 2006 13:01:45 +0200
+
+ecj-bootstrap (3.2-1) unstable; urgency=low
+
+ * New upstream version.
+
+ -- Matthias Klose <doko at debian.org> Mon, 31 Jul 2006 18:16:52 +0000
+
+ecj-bootstrap (3.1.2-6) unstable; urgency=low
+
+ * ecj-bootstrap-gcj: Do not register an alternative for ecj.
+ * ecj-bootstrap: Use ecj-bootstrap-gcj, if available.
+ * The above changes set the bootclasspath to /usr/share/java/libgcj-4.1.jar,
+ if no bootclasspath is set. Closes: #361608, #361806.
+ * Do not try to rebuild the jar file using the gij on arm and m68k.
+
+ -- Matthias Klose <doko at debian.org> Thu, 1 Jun 2006 22:55:00 +0200
+
+ecj-bootstrap (3.1.2-5) unstable; urgency=low
+
+ * Updated Standards-Version to 3.7.2. No changes needed.
+
+ -- Michael Koch <konqueror at gmx.de> Sat, 6 May 2006 16:25:40 +0000
+
+ecj-bootstrap (3.1.2-4) unstable; urgency=low
+
+ * Build using gij-4.1/gcj-4.1.
+ * Rebuild using ecj on all architectures.
+ * Remove conflict on virtual package ecj.
+
+ -- Matthias Klose <doko at debian.org> Sat, 1 Apr 2006 11:29:03 +0000
+
+ecj-bootstrap (3.1.2-3) experimental; urgency=low
+
+ * Build using gcj-4.1, upload to experimental.
+
+ -- Matthias Klose <doko at debian.org> Sat, 28 Jan 2006 08:35:09 +0000
+
+ecj-bootstrap (3.1.2-2ubuntu3) dapper; urgency=low
+
+ * Use gij-4.1 in the package scripts.
+
+ -- Matthias Klose <doko at ubuntu.com> Sun, 26 Feb 2006 21:00:44 +0000
+
+ecj-bootstrap (3.1.2-2ubuntu2) dapper; urgency=low
+
+ * Build using gcj-4.1.
+
+ -- Matthias Klose <doko at ubuntu.com> Sun, 19 Feb 2006 01:07:40 +0000
+
+ecj-bootstrap (3.1.2-2build1) dapper; urgency=low
+
+ * Require gcj-4.0.2-9 to build.
+
+ -- Matthias Klose <doko at ubuntu.com> Thu, 16 Feb 2006 03:18:22 +0000
+
+ecj-bootstrap (3.1.2-2) unstable; urgency=low
+
+ * Set the bootclasspath to /usr/share/java/libgcj-4.0.jar, if not called
+ with the -bootclasspath and /usr/lib/jvm/java-gcj/jre/lib/rt.jar does
+ not exist (java-gcj-compat not installed). Closes: #350542.
+
+ -- Matthias Klose <doko at debian.org> Thu, 9 Feb 2006 16:33:45 +0000
+
+ecj-bootstrap (3.1.2-1) unstable; urgency=low
+
+ * New upstream version.
+
+ -- Matthias Klose <doko at debian.org> Sat, 28 Jan 2006 08:09:25 +0000
+
+ecj-bootstrap (3.1.1-4) unstable; urgency=low
+
+ * Depend on libgcj6-jar instead of libgcj6-common.
+
+ -- Matthias Klose <doko at debian.org> Thu, 5 Jan 2006 19:14:49 +0000
+
+ecj-bootstrap (3.1.1-3.1) unstable; urgency=low
+
+ [ Arnaud Fontaine ]
+ * NMU: added a backslash at the end of the first line of
+ 'debian/ecj-bootstrap-gcj.postinst'. Closes: #335031.
+
+ -- Christoph Berg <myon at debian.org> Sat, 29 Oct 2005 12:09:06 +0200
+
+ecj-bootstrap (3.1.1-3) unstable; urgency=low
+
+ * On arm and hppa, don't rebuild ecj using gij.
+
+ -- Matthias Klose <doko at debian.org> Thu, 20 Oct 2005 19:08:20 +0000
+
+ecj-bootstrap (3.1.1-2) unstable; urgency=low
+
+ * Add a javac alternative (priority higher than gcj).
+ * ecj-bootstrap-gcj: Add slave alternative for the man page.
+ Addresses #328743.
+
+ -- Matthias Klose <doko at debian.org> Thu, 20 Oct 2005 00:11:27 +0200
+
+ecj-bootstrap (3.1.1-1) unstable; urgency=low
+
+ * New upstream version.
+ * Remove bootstrap workaround, tighten build dependency to gcj-4.0.2.
+ * Fix symlink to manpage (closes: #330080).
+
+ -- Matthias Klose <doko at debian.org> Sat, 1 Oct 2005 18:32:05 +0200
+
+ecj-bootstrap (3.0.93-1) unstable; urgency=low
+
+ * New upstream version (3.1rc3). Taken from the eclipse-3.1 package,
+ file ecj.zip.
+
+ -- Matthias Klose <doko at debian.org> Wed, 14 Sep 2005 12:54:56 +0000
+
+ecj-bootstrap (3.0.1-4ubuntu6) breezy; urgency=low
+
+ * Only build one java file per gcj call, ignore errors on first
+ build. Closes: #327161, Ubuntu 14938.
+ * Add more error checking in debian/rules.
+ * Install manual page for ecj alternative as well.
+
+ -- Matthias Klose <doko at ubuntu.com> Wed, 14 Sep 2005 14:19:57 +0200
+
+ecj-bootstrap (3.0.1-4ubuntu5) breezy; urgency=low
+
+ * Reenable ecj-bootstrap-gcj. (Build-)depend on fixed gcj-4.0.
+
+ -- Matthias Klose <doko at ubuntu.com> Sat, 2 Jul 2005 08:25:02 +0000
+
+ecj-bootstrap (3.0.1-4ubuntu4) breezy; urgency=low
+
+ * Temporarily disable building ecj-bootstrap-gcj. FTBFS on amd64. Unbreak
+ ant's dependency on ecj (>= 3.0.1-4ubuntu2).
+
+ -- Matthias Klose <doko at ubuntu.com> Thu, 30 Jun 2005 09:59:20 +0000
+
+ecj-bootstrap (3.0.1-4ubuntu3) breezy; urgency=low
+
+ * Include manpages for ecj-bootstrap and ecj-bootstrap-gcj (closes: #316641).
+
+ -- Jeff Bailey <jbailey at ubuntu.com> Wed, 29 Jun 2005 14:52:57 +0000
+
+ecj-bootstrap (3.0.1-4ubuntu2) breezy; urgency=low
+
+ * Merged ecj-adapter.jar into ecj.jar in preparation for Eclipse 3.1
+ upgrade. Upstream has laid out ecj in this fashion.
+ * Removed java-gcj-compat bits which were unneccassary.
+ * Added native versions of the ecj binary and ecj.jar in a new package
+ named ecj-bootstrap-gcj. This increases the compilation speed of
+ packages built with this copy of ecj.
+ * Added new alternatives for /usr/bin/ecj for the native version.
+ * First package successfully creating a classmap.db.
+
+ -- Jerry Haltom <wasabi at larvalstage.net> Tue, 14 Jun 2005 21:38:29 -0500
+
+ecj-bootstrap (3.0.1-4ubuntu1) breezy; urgency=low
+
+ * Add a /usr/bin/ecj binary.
+
+ -- Matthias Klose <doko at ubuntu.com> Sat, 11 Jun 2005 16:57:27 +0000
+
+ecj-bootstrap (3.0.1-3) experimental; urgency=low
+
+ * Synchronize.
+
+ -- Matthias Klose <doko at debian.org> Wed, 1 Jun 2005 23:24:48 +0200
+
+ecj-bootstrap (3.0.1-1ubuntu6) breezy; urgency=low
+
+ * Now provides 'ecj' which will also be provided by the future
+ eclipse-ecj package built from full Eclipse source.
+ * Removed universe/ from Section.
+ * Now refering to libgcj-4.0.jar instead of 4.0.0.jar to handle
+ changing versions better.
+
+ -- Jerry Haltom <wasabi at larvalstage.net> Wed, 1 Jun 2005 14:12:16 -0500
+
+ecj-bootstrap (3.0.1-2) experimental; urgency=low
+
+ * Upload to experimental, set maintainer to Debian Java Matainers,
+ request by Michael Koch.
+
+ -- Matthias Klose <doko at debian.org> Sun, 22 May 2005 15:53:07 +0000
+
+ecj-bootstrap (3.0.1-1ubuntu5) hoary; urgency=low
+
+ * Fixed path to ant.jar.
+
+ -- Jerry Haltom <wasabi at larvalstage.net> Mon, 28 Mar 2005 20:17:03 -0600
+
+ecj-bootstrap (3.0.1-1ubuntu4) hoary; urgency=low
+
+ * Added build of Ant adapter. This introduces a circular dependency
+ on ecj-bootstrap and Ant.
+
+ -- Jerry Haltom <wasabi at larvalstage.net> Sun, 27 Mar 2005 22:51:13 -0600
+
+ecj-bootstrap (3.0.1-1ubuntu3) hoary; urgency=low
+
+ * Added missing dependency on libgcj6-common.
+
+ -- Jerry Haltom <wasabi at larvalstage.net> Wed, 23 Feb 2005 22:45:00 -0600
+
+ecj-bootstrap (3.0.1-1ubuntu2) hoary; urgency=low
+
+ * Removed argument modification from ecj and moved it to ecj-wrapper in the
+ style of gcj-wrapper.
+ * Jeff Bailey corrected the Posix-compliant argument expansion in
+ ecj-wrapper with the help of David Weinehall.
+ * ecj now rebuilds with itself as a sanity test.
+
+ -- Jerry Haltom <wasabi at larvalstage.net> Mon, 14 Feb 2005 20:34:25 -0600
+
+ecj-bootstrap (3.0.1-1ubuntu1) hoary; urgency=low
+
+ * First upload to Ubuntu.
+
+ * Tighten build deps. Use "ecj" instead of "ecj-bootstrap" to
+ allow ant to depend on ecj | ecj-bootstrap.
+
+ * Posixify wrapper
+
+ -- Jeff Bailey <jbailey at ubuntu.com> Fri, 11 Feb 2005 20:37:21 +0000
+
+ecj-bootstrap (3.0.1-0) unstable; urgency=low
+
+ * Initial release.
+
+ -- Jerry Haltom <wasabi at larvalstage.net> Wed, 09 Feb 2005 19:36:07 -0600
diff --git a/debian/classfile.py b/debian/classfile.py
new file mode 100644
index 0000000..d7e7d7e
--- /dev/null
+++ b/debian/classfile.py
@@ -0,0 +1,222 @@
+
+## Copyright (C) 2004, 2005 Red Hat, Inc.
+## Written by Gary Benson <gbenson at 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.
+
+"""Read Java(TM) class files."""
+
+import cStringIO as StringIO
+import struct
+
+class Class:
+ def __init__(self, arg):
+ if hasattr(arg, "read"):
+ self.fp = arg
+ elif type(arg) == type(""):
+ if arg.startswith("\xca\xfe\xba\xbe"):
+ self.fp = StringIO.StringIO(arg)
+ else:
+ self.fp = open(arg, "r")
+ else:
+ raise TypeError, type(arg)
+
+ magic = self._read_int()
+ assert magic == 0xcafebabeL
+ minor, major = self._read(">HH")
+ self.version = (major, minor)
+
+ self.pool_integrity_checks = None
+ try:
+ assert False
+ except AssertionError:
+ self.pool_integrity_checks = []
+
+ self._read_constants_pool()
+
+ self.access_flags = self._read_short()
+ self.name = self._read_reference_Class()
+ self.super = self._read_reference_Class()
+
+ self.interfaces = self._read_interfaces()
+ self.fields = self._read_fieldsormethods()
+ self.methods = self._read_fieldsormethods()
+ self.attributes = self._read_attributes()
+
+ if self.pool_integrity_checks is not None:
+ for index, tag in self.pool_integrity_checks:
+ assert self.constants[index][0] == tag
+
+ del self.fp, self.pool_integrity_checks
+
+ def __repr__(self):
+ result = []
+ attrs = [attr for attr in dir(self)
+ if not attr.startswith("_") and attr != "Member"]
+ attrs.sort()
+ for attr in attrs:
+ result.append("%-13s %s" % (
+ attr + ":", attr == "constants" and
+ "<ELIDED>" or repr(getattr(self, attr))))
+ return "\n".join(result)
+
+ def _read_constants_pool(self):
+ self.constants = {}
+ skip = False
+ for i in xrange(1, self._read_short()):
+ if skip:
+ skip = False
+ continue
+ tag = {
+ 1: "Utf8", 3: "Integer", 4: "Float", 5: "Long",
+ 6: "Double", 7: "Class", 8: "String", 9: "Fieldref",
+ 10: "Methodref", 11: "InterfaceMethodref",
+ 12: "NameAndType"}[self._read_byte()]
+ skip = tag in ("Long", "Double") # crack crack crack!
+ self.constants[i] = (tag, getattr(self, "_read_constant_" + tag)())
+
+ def _read_interfaces(self):
+ result = []
+ for i in xrange(self._read_short()):
+ result.append(self._read_reference_Class())
+ return result
+
+ def _read_fieldsormethods(self):
+ result = []
+ for i in xrange(self._read_short()):
+ result.append(self.Member(self))
+ return result
+
+ class Member:
+ def __init__(self, source):
+ self.access_flags = source._read_short()
+ self.name = source._read_reference_Utf8()
+ self.descriptor = source._read_reference_Utf8()
+ self.attributes = source._read_attributes()
+
+ def __repr__(self):
+ result = []
+ attrs = [attr for attr in dir(self) if not attr.startswith("_")]
+ attrs.sort()
+ for attr in attrs:
+ value = getattr(self, attr)
+ if attr == "attributes" and value.has_key("Code"):
+ value = value.copy()
+ value.update({"Code": "<ELIDED>"})
+ result.append("%-13s %s" % (
+ attr + ":", repr(value).replace(
+ "'Code': '<ELIDED>'", "'Code': <ELIDED>")))
+ return ("\n%s" % (15 * " ")).join(result)
+
+ def _read_attributes(self):
+ result = {}
+ for i in xrange(self._read_short()):
+ name = self._read_reference_Utf8()
+ data = self.fp.read(self._read_int())
+ assert not result.has_key(name)
+ result[name] = data
+ return result
+
+ # Constants pool reference reader convenience functions
+
+ def _read_reference_Utf8(self):
+ return self._read_references("Utf8")[0]
+
+ def _read_reference_Class(self):
+ return self._read_references("Class")[0]
+
+ def _read_reference_Class_NameAndType(self):
+ return self._read_references("Class", "NameAndType")
+
+ def _read_references(self, *args):
+ result = []
+ for arg in args:
+ index = self._read_short()
+ if self.pool_integrity_checks is not None:
+ self.pool_integrity_checks.append((index, arg))
+ result.append(index)
+ return result
+
+ # Constants pool constant reader functions
+
+ def _read_constant_Utf8(self):
+ constant = self.fp.read(self._read_short())
+ try:
+ constant = constant.decode("utf-8")
+ except UnicodeError:
+ constant = _bork_utf8_decode(constant)
+ try:
+ constant = constant.encode("us-ascii")
+ except UnicodeError:
+ pass
+ return constant
+
+ def _read_constant_Integer(self):
+ return self._read_int()
+
+ def _read_constant_Float(self):
+ return self._read(">f")[0]
+
+ def _read_constant_Long(self):
+ return self._read(">q")[0]
+
+ def _read_constant_Double(self):
+ return self._read(">d")[0]
+
+ _read_constant_Class = _read_reference_Utf8
+ _read_constant_String = _read_reference_Utf8
+ _read_constant_Fieldref = _read_reference_Class_NameAndType
+ _read_constant_Methodref = _read_reference_Class_NameAndType
+ _read_constant_InterfaceMethodref = _read_reference_Class_NameAndType
+
+ def _read_constant_NameAndType(self):
+ return self._read_reference_Utf8(), self._read_reference_Utf8()
+
+ # Generic reader functions
+
+ def _read_int(self):
+ # XXX how else to read 32 bits on a 64-bit box?
+ h, l = map(long, self._read(">HH"))
+ return (h << 16) + l
+
+ def _read_short(self):
+ return self._read(">H")[0]
+
+ def _read_byte(self):
+ return self._read("B")[0]
+
+ def _read(self, fmt):
+ return struct.unpack(fmt, self.fp.read(struct.calcsize(fmt)))
+
+def _bork_utf8_decode(data):
+ # more crack!
+ bytes, unicode = map(ord, data), ""
+ while bytes:
+ b1 = bytes.pop(0)
+ if b1 & 0x80:
+ assert b1 & 0x40
+ b2 = bytes.pop(0)
+ assert b2 & 0xC0 == 0x80
+ if b1 & 0x20:
+ assert not b1 & 0x10
+ b3 = bytes.pop(0)
+ assert b3 & 0xC0 == 0x80
+ unicode += unichr(
+ ((b1 & 0x0f) << 12) + ((b2 & 0x3f) << 6) + (b3 & 0x3f))
+ else:
+ unicode += unichr(((b1 & 0x1f) << 6) + (b2 & 0x3f))
+ else:
+ unicode += unichr(b1)
+ return unicode
+
+if __name__ == "__main__":
+ print Class("/usr/share/katana/build/ListDependentClasses.class")
+
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..b8626c4
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+4
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..726a0f3
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,45 @@
+Source: ecj
+Section: devel
+Priority: optional
+Maintainer: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
+Uploaders: Jerry Haltom <wasabi at larvalstage.net>, Michael Koch <konqueror at gmx.de>, Matthias Klose <doko at debian.org>
+Build-Depends: cdbs (>= 0.4.26), debhelper (>= 5), gcj-4.1 (>= 4.1.2-1), libgcj-bc (>= 4.1.2-1), fastjar, ant, zip, dpkg (>= 1.13.19), python, time
+Build-Conflicts: ecj-bootstrap-gcj (<< 3.2.2)
+Standards-Version: 3.7.2
+
+Package: ecj
+Architecture: all
+Depends: gij-4.1 (>= 4.1.2-1), libgcj7-jar (>= 4.1.2-1), java-common (>= 0.23)
+Recommends: ecj-gcj
+Conflicts: ecj-bootstrap (<< 3.2.2)
+Replaces: ecj-bootstrap (<< 3.2.2)
+Suggests: ant
+Description: standalone version of the Eclipse Java compiler
+ This package provides a standalone version of the Eclipse JDT compiler which
+ is distributed as part of Eclipse. It passes the JCK (Java Compatibility Kit)
+ and is compatible with Java 1.3, 1.4, 1.5 and 1.6.
+
+Package: ecj-gcj
+Architecture: any
+Depends: ecj (>= ${source:Version}), ${shlibs:Depends}
+Recommends: java-gcj-compat (>= 1.0.69)
+Replaces: ecj-bootstrap-gcj (<< 3.2.2)
+Description: standalone version of the Eclipse Java compiler (native version)
+ This package provides a standalone version of the Eclipse JDT compiler which
+ is distributed as part of Eclipse. It passes the JCK (Java Compatibility Kit)
+ and is compatible with Java 1.3, 1.4, 1.5 and 1.6.
+ .
+ This package contains a native version of ecj built using gcj.
+
+Package: ecj-bootstrap
+Architecture: all
+Depends: ecj
+Recommends: ecj-bootstrap-gcj
+Description: standalone version of the Eclipse Java compiler (transitional package)
+ This is a transitional package; it can safely be removed.
+
+Package: ecj-bootstrap-gcj
+Architecture: all
+Depends: ecj-bootstrap (>= ${source:Version}), ecj-gcj (>= ${source:Version})
+Description: standalone version of the Eclipse Java compiler (transitional package)
+ This is a transitional package; it can safely be removed.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..5efc60d
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,258 @@
+This package was debianized by Jerry Haltom <wasabi at larvalstage.net> on
+Thu, 10 Feb 2005 14:47:15 -0600
+
+It was downloaded from dev.eclipse.org cvs.
+
+This software is copyright (c) 2000, 2004 IBM Corporation and others,
+licensed under the Common Public License - v 1.0.
+
+The ecj script is Copyright (C) 2004 Red Hat, licensed under the GPL with
+a special exception. The full text of the GPL can be found in
+/usr/share/common-licenses/GPL-2. The full text of the exception is stated
+below.
+
+Copyright:
+
+Common Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
+THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+ a) in the case of the initial Contributor, the initial code and
+documentation distributed under this Agreement, and
+ b) in the case of each subsequent Contributor:
+
+ i) changes to the Program, and
+
+ ii) additions to the Program;
+
+ where such changes and/or additions to the Program originate from
+and are distributed by that particular Contributor. A Contribution
+'originates' from a Contributor if it was added to the Program by such
+Contributor itself or anyone acting on such Contributor's behalf.
+Contributions do not include additions to the Program which: (i) are
+separate modules of software distributed in conjunction with the Program
+under their own license agreement, and (ii) are not derivative works of
+the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents " mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+2. GRANT OF RIGHTS
+
+ a) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free copyright
+license to reproduce, prepare derivative works of, publicly display,
+publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and
+object code form.
+
+ b) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free patent license
+under Licensed Patents to make, use, sell, offer to sell, import and
+otherwise transfer the Contribution of such Contributor, if any, in
+source code and object code form. This patent license shall apply to the
+combination of the Contribution and the Program if, at the time the
+Contribution is added by the Contributor, such addition of the
+Contribution causes such combination to be covered by the Licensed
+Patents. The patent license shall not apply to any other combinations
+which include the Contribution. No hardware per se is licensed
+hereunder.
+
+ c) Recipient understands that although each Contributor grants the
+licenses to its Contributions set forth herein, no assurances are
+provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.
+
+ d) Each Contributor represents that to its knowledge it has
+sufficient copyright rights in its Contribution, if any, to grant the
+copyright license set forth in this Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form
+under its own license agreement, provided that:
+
+ a) it complies with the terms and conditions of this Agreement;
+and
+
+ b) its license agreement:
+
+ i) effectively disclaims on behalf of all Contributors all
+warranties and conditions, express and implied, including warranties or
+conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;
+
+ ii) effectively excludes on behalf of all Contributors all
+liability for damages, including direct, indirect, special, incidental
+and consequential damages, such as lost profits;
+
+ iii) states that any provisions which differ from this Agreement
+are offered by that Contributor alone and not by any other party; and
+
+ iv) states that source code for the Program is available from such
+Contributor, and informs licensees how to obtain it in a reasonable
+manner on or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+ a) it must be made available under this Agreement; and
+
+ b) a copy of this Agreement must be included with each copy of the
+Program.
+
+Contributors may not remove or alter any copyright notices contained
+within the Program.
+
+Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program, the
+Contributor who includes the Program in a commercial product offering
+should do so in a manner which does not create potential liability for
+other Contributors. Therefore, if a Contributor includes the Program in
+a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the
+Program in a commercial product offering. The obligations in this
+section do not apply to any claims or Losses relating to any actual or
+alleged intellectual property infringement. In order to qualify, an
+Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial
+Contributor to control, and cooperate with the Commercial Contributor
+in, the defense and any related settlement negotiations. The Indemnified
+Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
+ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES
+OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
+A PARTICULAR PURPOSE. Each Recipient is solely responsible for
+determining the appropriateness of using and distributing the Program
+and assumes all risks associated with its exercise of rights under this
+Agreement, including but not limited to the risks and costs of program
+errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against a Contributor with
+respect to a patent applicable to software (including a cross-claim or
+counterclaim in a lawsuit), then any patent licenses granted by that
+Contributor to such Recipient under this Agreement shall terminate as of
+the date such litigation is filed. In addition, if Recipient institutes
+patent litigation against any entity (including a cross-claim or
+counterclaim in a lawsuit) alleging that the Program itself (excluding
+combinations of the Program with other software or hardware) infringes
+such Recipient's patent(s), then such Recipient's rights granted under
+Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails
+to comply with any of the material terms or conditions of this Agreement
+and does not cure such failure in a reasonable period of time after
+becoming aware of such noncompliance. If all Recipient's rights under
+this Agreement terminate, Recipient agrees to cease use and distribution
+of the Program as soon as reasonably practicable. However, Recipient's
+obligations under this Agreement and any licenses granted by Recipient
+relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and may
+only be modified in the following manner. The Agreement Steward reserves
+the right to publish new versions (including revisions) of this
+Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. IBM is the initial Agreement
+Steward. IBM may assign the responsibility to serve as the Agreement
+Steward to a suitable separate entity. Each new version of the Agreement
+will be given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to
+this Agreement will bring a legal action under this Agreement more than
+one year after the cause of action arose. Each party waives its rights
+to a jury trial in any resulting litigation.
+
+
+Linking Exception clause for GPL
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version.
diff --git a/debian/ecj-gcj.install b/debian/ecj-gcj.install
new file mode 100644
index 0000000..5ba8567
--- /dev/null
+++ b/debian/ecj-gcj.install
@@ -0,0 +1,3 @@
+debian/tmp/usr/bin/ecj-gcj
+debian/tmp/usr/lib/gcj/eclipse-ecj.jar.so
+debian/tmp/usr/share/gcj
diff --git a/debian/ecj-gcj.postinst b/debian/ecj-gcj.postinst
new file mode 100644
index 0000000..6901eaa
--- /dev/null
+++ b/debian/ecj-gcj.postinst
@@ -0,0 +1,7 @@
+#! /bin/sh -e
+
+if [ "$1" = configure ] && [ -x /usr/bin/rebuild-gcj-db ]; then
+ /usr/bin/rebuild-gcj-db
+fi
+
+#DEBHELPER#
diff --git a/debian/ecj-gcj.postrm b/debian/ecj-gcj.postrm
new file mode 100644
index 0000000..e6c5b04
--- /dev/null
+++ b/debian/ecj-gcj.postrm
@@ -0,0 +1,7 @@
+#! /bin/sh -e
+
+if [ "$1" = remove ] && [ -x /usr/bin/rebuild-gcj-db ]; then
+ /usr/bin/rebuild-gcj-db
+fi
+
+#DEBHELPER#
diff --git a/debian/ecj.1 b/debian/ecj.1
new file mode 100644
index 0000000..68d6c57
--- /dev/null
+++ b/debian/ecj.1
@@ -0,0 +1,104 @@
+.TH JDTC "1" "October 2002"
+.SH NAME
+ejdtc \- manual page for JDT Compiler
+.SH SYNOPSIS
+.B jdtc <options> <source files>\fR
+.SH DESCRIPTION
+JDT Compiler is command version of Java compiler for eclipse. jdtc
+has basic java compiler options like SUN's javac.
+.PP
+Note: this manual page is out of date; please call the compiler with
+\fB\-help\fR for the current documentation.
+.SH OPTIONS
+.TP
+\fB\-help\fR display a help message
+.TP
+\fB\-version\fR compiler version number
+.TP
+\fB\-classpath\fR <dir 1>;<dir 2>;...;<dir P>
+.TP
+\fB\-d\fR <dir> destination directory (if omitted no package directory structure is created)
+.TP
+\fB\-d\fR none
+no classfile is generated
+.PP
+\fB\-target\fR <ver> classfile target setting (1.1 or 1.2, default is 1.1)
+.TP
+\fB\-1.3\fR set compliance level to 1.3
+.TP
+\fB\-1.4\fR set compliance level to 1.4 (default)
+.TP
+\fB\-1.5\fR set compliance level to 1.5
+.TP
+\fB\-1.6\fR set compliance level to 1.6
+.TP
+\fB\-source\fR <ver> assertions toggle (1.3 or 1.4, default is 1.3 in -1.3 mode and 1.4 in -1.4 mode)
+.TP
+\fB\-nowarn\fR no warning (equivalent to '\-warn:none')
+.TP
+\fB\-warn\fR: <level> set warning level (e.g. '\-warn:unusedLocals,deprecation')
+.TP
+constructorName
+warn method with constructor name
+.TP
+packageDefaultMethod
+warn attempt to override package-default method
+.TP
+deprecation
+warn usage of deprecated type or member
+.TP
+maskedCatchBlocks
+warn hidden catch block
+.TP
+unusedLocals
+warn on unused local variable (never read)
+.TP
+unusedArguments
+warn on unused method argument (never read)
+.TP
+unusedImports
+warn on unused imports
+.TP
+syntheticAccess
+warn when performing synthetic access for innerclass
+.TP
+assertIdentifier
+warn occurrence of 'assert' used as identifier
+.PP
+\fB\-deprecation\fR equivalent to \fB\-warn\fR:deprecation.
+\fB\-g[\fR:<level>] debug attributes level
+.TP
+\fB\-g\fR
+all debug info ('\-g:lines,vars,source')
+.TP
+\fB\-g\fR:none
+no debug info
+.TP
+\fB\-g\fR:[lines,vars,source]
+selective debug info
+.PP
+\fB\-preserveAllLocals\fR code gen preserve all local variables (for debug purpose)
+.TP
+\fB\-noImportError\fR no errors for unresolved imports
+.TP
+\fB\-encoding\fR specify default source encoding format (custom encoding can also be specifed on a per file basis by suffixing each input source file/folder name with '[encoding]')
+.PP
+\fB\-log\fR <filename> specify a log file
+.TP
+\fB\-proceedOnError\fR keep compiling when error, dumping class files with problem methods
+.TP
+\fB\-verbose\fR print accessed\/processed compilation units
+.TP
+\fB\-referenceInfo\fR compute reference info
+.TP
+\fB\-progress\fR show progress (only in \fB\-log\fR mode)
+.TP
+\fB\-time\fR display speed information
+.TP
+\fB\-noExit\fR do not call System.exit(n) at end of compilation (n=0 if no error)
+.TP
+\fB\-repeat\fR <n> repeat compilation process <n> times (perf analysis)
+.PP
+.SH AUTHOR
+This manual page was written by Takshi Okamoto and Jan Schulz
+<debian at katzien.de>.
diff --git a/debian/ecj.install b/debian/ecj.install
new file mode 100644
index 0000000..5c694a7
--- /dev/null
+++ b/debian/ecj.install
@@ -0,0 +1,2 @@
+debian/tmp/usr/bin/ecj
+debian/tmp/usr/share/java/eclipse-ecj.jar
diff --git a/debian/ecj.links b/debian/ecj.links
new file mode 100644
index 0000000..f6a8ada
--- /dev/null
+++ b/debian/ecj.links
@@ -0,0 +1 @@
+/usr/share/java/eclipse-ecj.jar /usr/share/java/ecj.jar
diff --git a/debian/ecj.manpages b/debian/ecj.manpages
new file mode 100644
index 0000000..bd1e496
--- /dev/null
+++ b/debian/ecj.manpages
@@ -0,0 +1 @@
+debian/ecj.1
diff --git a/debian/ecj.postinst b/debian/ecj.postinst
new file mode 100644
index 0000000..b2f1b68
--- /dev/null
+++ b/debian/ecj.postinst
@@ -0,0 +1,6 @@
+#! /bin/sh -e
+
+update-alternatives --quiet --install /usr/bin/javac javac /usr/bin/ecj 143 \
+ --slave /usr/share/man/man1/javac.1.gz javac.1.gz /usr/share/man/man1/ecj.1.gz
+
+#DEBHELPER#
diff --git a/debian/ecj.prerm b/debian/ecj.prerm
new file mode 100644
index 0000000..b7920e1
--- /dev/null
+++ b/debian/ecj.prerm
@@ -0,0 +1,5 @@
+#! /bin/sh -e
+
+update-alternatives --quiet --remove javac /usr/bin/ecj
+
+#DEBHELPER#
diff --git a/debian/patches/ecj-gccmain.diff b/debian/patches/ecj-gccmain.diff
new file mode 100644
index 0000000..f4efeea
--- /dev/null
+++ b/debian/patches/ecj-gccmain.diff
@@ -0,0 +1,511 @@
+diff -urN ./src~/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/GCCMain.java ./src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/GCCMain.java
+--- ./src~/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/GCCMain.java 1970-01-01 01:00:00.000000000 +0100
++++ ./src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/GCCMain.java 2007-03-03 19:55:20.000000000 +0100
+@@ -0,0 +1,495 @@
++/**
++ *
++ */
++package org.eclipse.jdt.internal.compiler.batch;
++
++import java.io.BufferedOutputStream;
++import java.io.BufferedReader;
++import java.io.ByteArrayInputStream;
++import java.io.File;
++import java.io.FileOutputStream;
++import java.io.FileReader;
++import java.io.IOException;
++import java.io.InputStreamReader;
++import java.io.OutputStream;
++import java.io.PrintWriter;
++import java.io.UnsupportedEncodingException;
++import java.util.ArrayList;
++import java.util.HashSet;
++import java.util.Iterator;
++import java.util.Map;
++import java.util.StringTokenizer;
++import java.util.zip.CRC32;
++import java.util.zip.ZipEntry;
++import java.util.zip.ZipOutputStream;
++
++import org.eclipse.jdt.core.compiler.InvalidInputException;
++import org.eclipse.jdt.internal.compiler.ClassFile;
++import org.eclipse.jdt.internal.compiler.CompilationResult;
++import org.eclipse.jdt.internal.compiler.env.AccessRule;
++import org.eclipse.jdt.internal.compiler.env.AccessRuleSet;
++import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
++import org.eclipse.jdt.internal.compiler.util.Messages;
++import org.eclipse.jdt.internal.compiler.util.SuffixConstants;
++
++/**
++ * This is an alternate entry point for the command-line compiler which
++ * is simpler to integrate into GCC. In particular the option processing
++ * is more GNU-like and the recognized options are similar to those supported
++ * by other GCC front ends.
++ */
++public class GCCMain extends Main {
++
++ // All the compilation units specified on the command line.
++ private HashSet commandLineCompilationUnits = new HashSet();
++ // True if we are only checking syntax.
++ private boolean syntaxOnly;
++ // If not null, the name of the output zip file.
++ // If null, we are generating class files in the file system,
++ // not a zip file.
++ private String zipDestination;
++ // The zip stream to which we're writing, or null if it hasn't been opened.
++ private ZipOutputStream zipStream;
++
++ // If not null, the name of the zip file to which dependency class files
++ // should be written.
++ private String zipDependencyDestination;
++ // The zip stream to which dependency files should be written.
++ private ZipOutputStream zipDependencyStream;
++
++ public GCCMain(PrintWriter outWriter, PrintWriter errWriter,
++ boolean systemExitWhenFinished) {
++ super(outWriter, errWriter, systemExitWhenFinished);
++ this.logger.setEmacs();
++ }
++
++ public GCCMain(PrintWriter outWriter, PrintWriter errWriter,
++ boolean systemExitWhenFinished, Map customDefaultOptions) {
++ super(outWriter, errWriter, systemExitWhenFinished,
++ customDefaultOptions);
++ this.logger.setEmacs();
++ }
++
++ private void fail(Exception t) {
++ this.logger.logException(t);
++ System.exit(1);
++ }
++
++ public CompilationUnit[] getCompilationUnits() throws InvalidInputException {
++ CompilationUnit[] units = super.getCompilationUnits();
++ for (int i = 0; i < units.length; ++i)
++ this.commandLineCompilationUnits.add(units[i]);
++ return units;
++ }
++
++ private String combine(char[] one, char[] two) {
++ StringBuffer b = new StringBuffer();
++ b.append(one);
++ b.append(two);
++ return b.toString();
++ }
++
++ private ZipOutputStream getZipOutput() throws IOException {
++ if (this.zipDestination != null && this.zipStream == null) {
++ OutputStream os;
++ if ("-".equals(this.zipDestination)) { //$NON-NLS-1$
++ os = System.out;
++ } else {
++ os = new FileOutputStream(this.zipDestination);
++ }
++ zipStream = new ZipOutputStream(new BufferedOutputStream(os));
++ zipStream.setMethod(ZipOutputStream.STORED);
++ }
++ return zipStream;
++ }
++
++ private ZipOutputStream getDependencyOutput() throws IOException {
++ if (this.zipDependencyDestination != null && this.zipDependencyStream == null) {
++ OutputStream os = new FileOutputStream(zipDependencyDestination);
++ zipDependencyStream = new ZipOutputStream(new BufferedOutputStream(os));
++ zipDependencyStream.setMethod(ZipOutputStream.STORED);
++ }
++ return zipDependencyStream;
++ }
++
++ public void outputClassFiles(CompilationResult unitResult) {
++ if (this.syntaxOnly) {
++ return;
++ }
++ if (this.zipDestination == null) {
++ // Nothing special to do here.
++ super.outputClassFiles(unitResult);
++ return;
++ }
++ if (unitResult == null || unitResult.hasErrors()) {
++ return;
++ }
++
++ // If we are compiling with indirect dispatch, we don't need
++ // any dependent classes. If we are using the C++ ABI, then we
++ // do need the dependencies in order to do proper layout.
++ boolean gcjCompile = this.commandLineCompilationUnits.contains(unitResult.getCompilationUnit());
++ if (this.zipDependencyDestination == null && !gcjCompile) {
++ return;
++ }
++
++ try {
++ ZipOutputStream dest = gcjCompile ? getZipOutput() : getDependencyOutput();
++ ClassFile[] classFiles = unitResult.getClassFiles();
++ for (int i = 0; i < classFiles.length; ++i) {
++ ClassFile classFile = classFiles[i];
++ String filename = combine(classFile.fileName(), SuffixConstants.SUFFIX_class);
++ if (this.verbose)
++ this.out.println(
++ Messages.bind(
++ Messages.compilation_write,
++ new String[] {
++ String.valueOf(this.exportedClassFilesCounter+1),
++ filename
++ }));
++ ZipEntry entry = new ZipEntry(filename);
++ byte[] contents = classFile.getBytes();
++ CRC32 crc = new CRC32();
++ crc.update(contents);
++ entry.setSize(contents.length);
++ entry.setCrc(crc.getValue());
++ dest.putNextEntry(entry);
++ dest.write(contents);
++ dest.closeEntry();
++ }
++ } catch (IOException err) {
++ fail(err);
++ }
++ }
++
++ private String getArgument(String option) {
++ int index = option.indexOf('=');
++ return option.substring(index + 1);
++ }
++
++ private void addPath(ArrayList result, String currentClasspathName) {
++ String customEncoding = null;
++ AccessRule[] accessRules = new AccessRule[0];
++ String templates[] = new String[AccessRuleSet.MESSAGE_TEMPLATES_LENGTH];
++ templates[0] = this.bind(
++ "template.restrictedAccess.type", //$NON-NLS-1$
++ new String[] {"{0}", currentClasspathName}); //$NON-NLS-1$
++ templates[1] = this.bind(
++ "template.restrictedAccess.constructor", //$NON-NLS-1$
++ new String[] {"{0}", currentClasspathName}); //$NON-NLS-1$
++ templates[2] = this.bind(
++ "template.restrictedAccess.method", //$NON-NLS-1$
++ new String[] {"{0}", "{1}", currentClasspathName}); //$NON-NLS-1$ //$NON-NLS-2$
++ templates[3] = this.bind(
++ "template.restrictedAccess.field", //$NON-NLS-1$
++ new String[] {"{0}", "{1}", currentClasspathName}); //$NON-NLS-1$ //$NON-NLS-2$
++ AccessRuleSet accessRuleSet = new AccessRuleSet(accessRules, templates);
++ FileSystem.Classpath currentClasspath = FileSystem
++ .getClasspath(currentClasspathName,
++ customEncoding, accessRuleSet);
++ if (currentClasspath != null) {
++ result.add(currentClasspath);
++ }
++ }
++
++ private void parsePath(ArrayList result, String path) {
++ StringTokenizer iter = new StringTokenizer(path, File.pathSeparator);
++ while (iter.hasMoreTokens()) {
++ addPath(result, iter.nextToken());
++ }
++ }
++
++ protected void handleWarningToken(String token, boolean isEnabling,
++ boolean useEnableJavadoc) throws InvalidInputException {
++ // Recognize this for compatibility with older versions of gcj.
++ if ("deprecated".equals(token)) //$NON-NLS-1$
++ token = "deprecation"; //$NON-NLS-1$
++ else if ("static-access".equals(token) //$NON-NLS-1$
++ || "dep-ann".equals(token) //$NON-NLS-1$
++ || "over-ann".equals(token)) { //$NON-NLS-1$
++ // Some exceptions to the warning naming rule.
++ } else if ("extraneous-semicolon".equals(token)) { //$NON-NLS-1$
++ // Compatibility with earlier versions of gcj.
++ token = "semicolon"; //$NON-NLS-1$
++ } else {
++ // Turn "foo-bar-baz" into eclipse-style "fooBarBaz".
++ StringBuffer newToken = new StringBuffer(token.length());
++ StringTokenizer t = new StringTokenizer(token, "-"); //$NON-NLS-1$
++ boolean first = true;
++ while (t.hasMoreTokens()) {
++ String next = t.nextToken();
++ if (first) {
++ newToken.append(next);
++ first = false;
++ } else {
++ newToken.append(Character.toUpperCase(next.charAt(0)));
++ newToken.append(next.substring(1));
++ }
++ }
++ token = newToken.toString();
++ }
++ super.handleWarningToken(token, isEnabling, useEnableJavadoc);
++ }
++
++ private void turnWarningsToErrors() {
++ Object[] entries = this.options.entrySet().toArray();
++ for (int i = 0, max = entries.length; i < max; i++) {
++ Map.Entry entry = (Map.Entry) entries[i];
++ if (!(entry.getKey() instanceof String))
++ continue;
++ if (!(entry.getValue() instanceof String))
++ continue;
++ if (((String) entry.getValue()).equals(CompilerOptions.WARNING)) {
++ this.options.put(entry.getKey(), CompilerOptions.ERROR);
++ }
++ }
++ }
++
++ /**
++ * Set the debug level to the indicated value. The level should be
++ * between 0 and 2, inclusive, but this is not checked.
++ * @param level the debug level
++ */
++ private void setDebugLevel(int level) {
++ this.options.put(
++ CompilerOptions.OPTION_LocalVariableAttribute,
++ level > 1 ? CompilerOptions.GENERATE : CompilerOptions.DO_NOT_GENERATE);
++ this.options.put(
++ CompilerOptions.OPTION_LineNumberAttribute,
++ level > 0 ? CompilerOptions.GENERATE : CompilerOptions.DO_NOT_GENERATE);
++ this.options.put(
++ CompilerOptions.OPTION_SourceFileAttribute,
++ CompilerOptions.GENERATE);
++ }
++
++ private void readFileList(String file, ArrayList result) {
++ try {
++ BufferedReader b = new BufferedReader(new FileReader(file));
++ String line;
++ while ((line = b.readLine()) != null) {
++ if (line.endsWith(SUFFIX_STRING_java))
++ result.add(line);
++ }
++ b.close();
++ } catch (IOException err) {
++ fail(err);
++ }
++ }
++
++ private void readAllFileListFiles(ArrayList fileList, ArrayList result) {
++ Iterator it = fileList.iterator();
++ while (it.hasNext()) {
++ readFileList((String) it.next(), result);
++ }
++ }
++
++ private void handleWall(boolean enable) throws InvalidInputException {
++ // A somewhat arbitrary list. We use the GCC names
++ // here, and the local handleWarningToken translates
++ // for us.
++ handleWarningToken("constructor-name", enable, false);
++ handleWarningToken("pkg-default-method", enable, false);
++ handleWarningToken("masked-catch-block", enable, false);
++ handleWarningToken("all-deprecation", enable, false);
++ handleWarningToken("unused-local", enable, false);
++ handleWarningToken("unused-label", enable, false);
++ handleWarningToken("static-receiver", enable, false);
++ handleWarningToken("indirect-static", enable, false);
++ handleWarningToken("no-effect-assign", enable, false);
++ handleWarningToken("char-concat", enable, false);
++ handleWarningToken("useless-type-check", enable, false);
++ handleWarningToken("final-bound", enable, false);
++ handleWarningToken("assert-identifier", enable, false);
++ handleWarningToken("enum-identifier", enable, false);
++ handleWarningToken("finally", enable, false);
++ handleWarningToken("varargs-cast", enable, false);
++ handleWarningToken("unused", enable, false);
++ handleWarningToken("forbidden", enable, false);
++ }
++
++ public void configure(String[] argv) throws InvalidInputException {
++ if ((argv == null) || (argv.length == 0)) {
++ // This is a "can't happen".
++ System.exit(1);
++ }
++
++ ArrayList files = new ArrayList();
++ ArrayList otherFiles = new ArrayList();
++ String classpath = null;
++ boolean haveFileList = false;
++ boolean inhibitAllWarnings = false;
++ boolean treatWarningsAsErrors = false;
++
++ for (int i = 0; i < argv.length; ++i) {
++ String currentArg = argv[i];
++
++ if (currentArg.startsWith("-fencoding=")) { //$NON-NLS-1$
++ // Simply accept the last one.
++ String encoding = getArgument(currentArg);
++ try { // ensure encoding is supported
++ new InputStreamReader(new ByteArrayInputStream(new byte[0]), encoding);
++ } catch (UnsupportedEncodingException e) {
++ throw new InvalidInputException(
++ this.bind("configure.unsupportedEncoding", encoding)); //$NON-NLS-1$
++ }
++ this.options.put(CompilerOptions.OPTION_Encoding, encoding);
++ } else if (currentArg.startsWith("-foutput-class-dir=")) { //$NON-NLS-1$
++ String arg = getArgument(currentArg);
++ if (this.destinationPath != null) {
++ StringBuffer errorMessage = new StringBuffer();
++ errorMessage.append("-d"); //$NON-NLS-1$
++ errorMessage.append(' ');
++ errorMessage.append(arg);
++ throw new InvalidInputException(
++ this.bind("configure.duplicateOutputPath", errorMessage.toString())); //$NON-NLS-1$
++ }
++ this.destinationPath = arg;
++ this.generatePackagesStructure = true;
++ } else if (currentArg.startsWith("-fbootclasspath=")) { //$NON-NLS-1$
++ classpath = getArgument(currentArg);
++ } else if (currentArg.equals("-fzip-target")) { //$NON-NLS-1$
++ ++i;
++ if (i >= argv.length)
++ throw new InvalidInputException(this.bind("gcc.zipArg")); //$NON-NLS-1$
++ this.zipDestination = argv[i];
++ } else if (currentArg.equals("-fzip-dependency")) { //$NON-NLS-1$
++ ++i;
++ if (i >= argv.length)
++ throw new InvalidInputException(this.bind("gcc.zipDepArg")); //$NON-NLS-1$
++ this.zipDependencyDestination = argv[i];
++ } else if (currentArg.startsWith("-g")) { //$NON-NLS-1$
++ if (currentArg.equals("-g0")) { //$NON-NLS-1$
++ setDebugLevel(0);
++ } else if (currentArg.equals("-g2") || currentArg.equals("-g3") //$NON-NLS-1$ //$NON-NLS-2$
++ || currentArg.equals("-g")) { //$NON-NLS-1$
++ setDebugLevel(2);
++ } else {
++ // Handle -g1 but also things like -gstabs.
++ setDebugLevel(1);
++ }
++ } else if (currentArg.equals("-Werror")) { //$NON-NLS-1$
++ treatWarningsAsErrors = true;
++ } else if (currentArg.equals("-Wno-error")) { //$NON-NLS-1$
++ treatWarningsAsErrors = false;
++ } else if (currentArg.equals("-Wall")) { //$NON-NLS-1$
++ handleWall(true);
++ } else if (currentArg.equals("-Wno-all")) { //$NON-NLS-1$
++ handleWall(false);
++ } else if (currentArg.startsWith("-Wno-")) { //$NON-NLS-1$
++ handleWarningToken(currentArg.substring(5), false, false);
++ } else if (currentArg.startsWith("-W")) { //$NON-NLS-1$
++ handleWarningToken(currentArg.substring(2), true, false);
++ } else if (currentArg.equals("-w")) { //$NON-NLS-1$
++ inhibitAllWarnings = true;
++ } else if (currentArg.startsWith("-O")) { //$NON-NLS-1$
++ // Ignore.
++ } else if (currentArg.equals("-v")) { //$NON-NLS-1$
++ this.verbose = true;
++ } else if (currentArg.equals("-fsyntax-only")) { //$NON-NLS-1$
++ this.syntaxOnly = true;
++ } else if (currentArg.startsWith("-fsource=")) { //$NON-NLS-1$
++ currentArg = getArgument(currentArg);
++ if (currentArg.equals("1.3")) { //$NON-NLS-1$
++ this.options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_3);
++ } else if (currentArg.equals("1.4")) { //$NON-NLS-1$
++ this.options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_4);
++ } else if (currentArg.equals("1.5") || currentArg.equals("5") || currentArg.equals("5.0")) { //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
++ this.options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_5);
++ } else if (currentArg.equals("1.6") || currentArg.equals("6") || currentArg.equals("6.0")) { //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
++ this.options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_6);
++ } else {
++ throw new InvalidInputException(this.bind("configure.source", currentArg)); //$NON-NLS-1$
++ }
++ } else if (currentArg.startsWith("-ftarget=")) { //$NON-NLS-1$
++ currentArg = getArgument(currentArg);
++ if (currentArg.equals("1.1")) { //$NON-NLS-1$
++ this.options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_1);
++ } else if (currentArg.equals("1.2")) { //$NON-NLS-1$
++ this.options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_2);
++ } else if (currentArg.equals("1.3")) { //$NON-NLS-1$
++ this.options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_3);
++ } else if (currentArg.equals("1.4")) { //$NON-NLS-1$
++ this.options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_4);
++ } else if (currentArg.equals("1.5") || currentArg.equals("5") || currentArg.equals("5.0")) { //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
++ this.options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_5);
++ } else if (currentArg.equals("1.6") || currentArg.equals("6") || currentArg.equals("6.0")) { //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
++ this.options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_6);
++ } else if (currentArg.equals("jsr14")) { //$NON-NLS-1$
++ this.options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_JSR14);
++ } else {
++ throw new InvalidInputException(this.bind("configure.targetJDK", currentArg)); //$NON-NLS-1$
++ }
++ } else if (currentArg.equals("-ffilelist-file")) { //$NON-NLS-1$
++ haveFileList = true;
++ } else if (currentArg.endsWith(SuffixConstants.SUFFIX_STRING_java)) {
++ files.add(currentArg);
++ } else if (currentArg.charAt(0) == '-'){
++ // FIXME: error if not a file?
++ } else {
++ otherFiles.add(currentArg);
++ }
++ }
++
++ // Read the file list file. We read them all, but really there
++ // will only be one.
++ if (haveFileList)
++ readAllFileListFiles(otherFiles, files);
++
++ this.filenames = (String[]) files.toArray(new String[0]);
++ this.encodings = new String[this.filenames.length];
++ this.destinationPaths = new String[this.filenames.length];
++ for (int i = 0; i < this.filenames.length; ++i)
++ this.destinationPaths[i] = this.destinationPath;
++
++ // Classpath processing.
++ ArrayList result = new ArrayList();
++ if (classpath == null)
++ throw new InvalidInputException(this.bind("gcc.noClasspath")); //$NON-NLS-1$
++ parsePath(result, classpath);
++
++ // We must always create both output files, even if one is not used.
++ // That way we will always pass valid zip file on to jc1.
++ try {
++ getZipOutput();
++ getDependencyOutput();
++ } catch (IOException err) {
++ fail(err);
++ }
++
++ if (inhibitAllWarnings)
++ disableWarnings();
++ if (treatWarningsAsErrors)
++ turnWarningsToErrors();
++
++ this.checkedClasspaths = new FileSystem.Classpath[result.size()];
++ result.toArray(this.checkedClasspaths);
++
++ this.logger.logCommandLineArguments(argv);
++ this.logger.logOptions(this.options);
++ this.logger.logClasspath(this.checkedClasspaths);
++
++ this.repetitions = 1;
++ }
++
++ public boolean compile(String[] argv) {
++ boolean result = super.compile(argv);
++ try {
++ if (zipStream != null) {
++ zipStream.finish();
++ zipStream.close();
++ }
++ if (zipDependencyStream != null) {
++ zipDependencyStream.finish();
++ zipDependencyStream.close();
++ }
++ } catch (IOException err) {
++ fail(err);
++ }
++ return result;
++ }
++
++ public static void main(String[] argv) {
++ boolean result = new GCCMain(new PrintWriter(System.out), new PrintWriter(System.err), false).compile(argv);
++ System.exit(result ? 0 : 1);
++ }
++}
+diff -urN ./src~/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/messages.properties ./src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/messages.properties
+--- ./src~/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/messages.properties 2007-02-12 19:46:33.000000000 +0100
++++ ./src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/messages.properties 2007-03-03 19:55:20.000000000 +0100
+@@ -249,3 +249,8 @@
+ template.restrictedAccess.constructor = The constructor {0} is not accessible due to restriction on classpath entry {1}
+ template.restrictedAccess.field = The field {0} from the type {1} is not accessible due to restriction on classpath entry {2}
+ template.restrictedAccess.method = The method {0} from the type {1} is not accessible due to restriction on classpath entry {2}
++
++# GCCMain messages.
++gcc.zipArg=-fzip-target requires argument
++gcc.zipDepArg=-fzip-dependency requires argument
++gcc.noClasspath=no classpath specified
diff --git a/debian/patches/ecj-square-bracket-classpath.diff b/debian/patches/ecj-square-bracket-classpath.diff
new file mode 100644
index 0000000..8f92877
--- /dev/null
+++ b/debian/patches/ecj-square-bracket-classpath.diff
@@ -0,0 +1,103 @@
+diff -urN ./src~/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/Main.java ./src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/Main.java
+--- ./src~/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/Main.java 2007-02-12 19:46:45.000000000 +0100
++++ ./src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/Main.java 2007-03-03 19:56:45.000000000 +0100
+@@ -2723,6 +2723,10 @@
+ ArrayList currentRuleSpecs = new ArrayList(defaultSize);
+ StringTokenizer tokenizer = new StringTokenizer(currentPath,
+ File.pathSeparator + "[]", true); //$NON-NLS-1$
++ ArrayList tokens = new ArrayList();
++ while (tokenizer.hasMoreTokens()) {
++ tokens.add(tokenizer.nextToken());
++ }
+ // state machine
+ final int start = 0;
+ final int readyToClose = 1;
+@@ -2737,14 +2741,20 @@
+ // 'path[' 'path1;path2['
+ final int rulesReadyToClose = 6;
+ // 'path[rule' 'path[rule1;rule2'
++ final int bracketOpened = 7;
++ // '.*[.*'
++ final int bracketClosed = 8;
++ // '.*([.*])+'
+ final int error = 99;
+ int state = start;
+ String token = null;
+- while (tokenizer.hasMoreTokens() && state != error) {
+- token = tokenizer.nextToken();
++ int cursor = 0, tokensNb = tokens.size(), bracket = -1;
++ while (cursor < tokensNb && state != error) {
++ token = (String) tokens.get(cursor++);
+ if (token.equals(File.pathSeparator)) {
+ switch (state) {
+ case start:
++ case bracketOpened:
+ break;
+ case readyToClose:
+ case readyToCloseEndingWithRules:
+@@ -2757,14 +2767,21 @@
+ case rulesReadyToClose:
+ state = rulesNeedAnotherRule;
+ break;
++ case bracketClosed:
++ cursor = bracket + 1;
++ state = rulesStart;
++ break;
+ default:
+ state = error;
+ }
+ } else if (token.equals("[")) { //$NON-NLS-1$
+ switch (state) {
+ case readyToClose:
+- state = rulesStart;
++ bracket = cursor - 1;
++ case bracketClosed:
++ state = bracketOpened;
+ break;
++ case bracketOpened:
+ default:
+ state = error;
+ }
+@@ -2773,6 +2790,10 @@
+ case rulesReadyToClose:
+ state = readyToCloseEndingWithRules;
+ break;
++ case bracketOpened:
++ state = bracketClosed;
++ break;
++ case bracketClosed:
+ default:
+ state = error;
+ }
+@@ -2789,10 +2810,22 @@
+ state = rulesReadyToClose;
+ currentRuleSpecs.add(token);
+ break;
++ case bracketClosed:
++ for (int i = bracket; i < cursor ; i++) {
++ currentClasspathName += (String) tokens.get(i);
++ }
++ state = readyToClose;
++ break;
++ case bracketOpened:
++ break;
+ default:
+ state = error;
+ }
+ }
++ if (state == bracketClosed && cursor == tokensNb) {
++ cursor = bracket + 1;
++ state = rulesStart;
++ }
+ }
+ switch(state) {
+ case readyToClose:
+@@ -2801,6 +2834,8 @@
+ addNewEntry(paths, currentClasspathName, currentRuleSpecs,
+ customEncoding, isSourceOnly);
+ break;
++ case bracketOpened:
++ case bracketClosed:
+ default :
+ // we go on anyway
+ this.logger.logIncorrectClasspath(currentPath);
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..cdcd821
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,177 @@
+#!/usr/bin/make -f
+
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/rules/simple-patchsys.mk
+
+gcc_version = 4.1
+ant_version = 1.6
+ant_version =
+GCJ = gcj-$(gcc_version)
+GIJ = gij-$(gcc_version)
+GCJDBTOOL = gcj-dbtool-$(gcc_version)
+
+DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
+
+with_native := yes
+with_rebuild := yes
+
+ifneq (,$(findstring $(DEB_HOST_ARCH), arm))
+ with_rebuild := no
+endif
+
+JAR = eclipse-ecj.jar
+
+default: build
+
+eclipse_root = ../eclipse-3.2.2/source-tree
+
+get-source:
+ test -d $(eclipse_root)
+ rm -rf src
+ mkdir -p src/org.eclipse.jdt.core
+ cp -a $(eclipse_root)/plugins/org.eclipse.jdt.core/compiler/org \
+ src/org.eclipse.jdt.core/
+ cp -a $(eclipse_root)/plugins/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch \
+ src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/
+
+ cp -a $(eclipse_root)/plugins/org.eclipse.jdt.core/antadapter/org/eclipse/jdt/core/JDTCompilerAdapter.java \
+ src/org.eclipse.jdt.core/org/eclipse/jdt/core/
+ cp -a $(eclipse_root)/plugins/org.eclipse.jdt.core/antadapter/org/eclipse/jdt/internal/antadapter \
+ src/org.eclipse.jdt.core/org/eclipse/jdt/internal/
+
+
+build/ecj:: build/stamp-bytecode build/stamp-nativecode
+
+build/stamp-bytecode:
+ rm -rf build/bin
+ mkdir -p build/bin
+
+ cp -r src/org.eclipse.jdt.core/org build/bin/
+ find build/bin -name '*.java' > build/sourcefiles
+ split -l 25 build/sourcefiles ecj-sources.
+ ls -l
+ mv ecj-sources.* build/bin
+ ls -l . build/bin
+ifeq (0,1)
+ set -e; \
+ for list in $$(find build/bin -name 'ecj-sources.*'); do \
+ echo "building files in $$list ..."; \
+ echo $(GCJ) -d build/bin -C -g \
+ -I/usr/share/ant$(ant_version)/lib/ant.jar \
+ -Ibuild/bin \
+ @$$list; \
+ $(GCJ) -v -d build/bin -C -g \
+ -I/usr/share/ant$(ant_version)/lib/ant.jar \
+ -Ibuild/bin \
+ @$$list; \
+ done
+else
+ set -e; \
+ for list in $$(find build/bin -name 'ecj-sources.*'); do \
+ echo "building files in $$list ..."; \
+ echo $(GCJ) -d build/bin -C -g \
+ -I/usr/share/ant$(ant_version)/lib/ant.jar \
+ -Ibuild/bin \
+ $$(cat $$list); \
+ $(GCJ) -v -d build/bin -C -g \
+ -I/usr/share/ant$(ant_version)/lib/ant.jar \
+ -Ibuild/bin \
+ $$(cat $$list); \
+ done
+endif
+ find build/bin -name 'sources.list' -exec rm -f {} \;
+ find build/bin -name '*.java' -exec rm -f {} \;
+ find build/bin -name '*.html' -exec rm -f {} \;
+
+ mkdir -p build/bootstrap
+ fastjar -c -C build/bin . -f build/bootstrap/$(JAR)
+
+ifeq ($(with_rebuild),yes)
+ rm -rf build/bin
+ mkdir -p build/bin
+ cp -r src/org.eclipse.jdt.core/org build/bin/
+
+ time $(GIJ) \
+ -classpath build/bootstrap/$(JAR):/usr/share/ant$(ant_version)/lib/ant.jar \
+ org.eclipse.jdt.internal.compiler.batch.Main \
+ -bootclasspath /usr/share/java/libgcj-$(gcc_version).jar \
+ build/bin
+
+ find build/bin -name '*.java' -exec rm -f {} \;
+ find build/bin -name '*.html' -exec rm -f {} \;
+
+ mkdir -p build/dist
+ fastjar -c -C build/bin . -f build/dist/$(JAR)
+else
+ mkdir -p build/dist
+ cp -p build/bootstrap/$(JAR) build/dist/$(JAR)
+endif
+ mkdir -p build/exe
+ cp build/dist/$(JAR) build/exe/ecj-standalone.jar
+ zip -d build/exe/ecj-standalone.jar \
+ 'org/eclipse/jdt/core/JDTCompilerAdapter*'
+
+ touch build/stamp-bytecode
+
+build/stamp-nativecode: build/stamp-bytecode
+ find build/dist -name '*.jar.*.jar' | xargs -r rm -f
+ifeq ($(with_native),yes)
+ : # $(JAR).so
+ ifneq (,$(filter $(DEB_HOST_ARCH), hppa))
+ $(GCJ) \
+ -O2 -g -Wl,-Bsymbolic,-O1 -shared -fPIC -fjni -findirect-dispatch \
+ -o build/dist/$(JAR).so build/dist/$(JAR)
+ $(GCJDBTOOL) -f build/dist/eclipse-ecj.db \
+ build/dist/$(JAR).so /usr/lib/gcj/$(JAR).so \
+ || touch build/dist/eclipse-ecj.db
+ else
+ PYTHONPATH=$(CURDIR)/debian time python debian/aot-compile \
+ --gcj=$(GCJ) --dbtool=$(GCJDBTOOL) \
+ -L /usr/lib/gcj build/dist build/dist
+ mv build/dist/$(JAR).db build/dist/eclipse-ecj.db
+ endif
+
+ : # ecj-gcj
+ time $(GCJ) \
+ -O2 -g -Wl,-O1 \
+ --main=org.eclipse.jdt.internal.compiler.batch.Main \
+ -o build/exe/ecj-gcj build/exe/ecj-standalone.jar
+endif
+
+ touch build/stamp-nativecode
+
+
+install/ecj::
+ mkdir -p debian/tmp/usr/share/java
+ install -m 644 build/dist/$(JAR) debian/tmp/usr/share/java/
+
+ mkdir -p debian/tmp/usr/bin
+ install -m 755 ecj debian/tmp/usr/bin/
+
+install/ecj-gcj::
+ifeq ($(with_native),yes)
+ mkdir -p debian/tmp/usr/lib/gcj
+ install -m 644 build/dist/$(JAR).so debian/tmp/usr/lib/gcj
+
+ mkdir -p debian/tmp/usr/share/gcj/classmap.d
+ install -m 644 build/dist/eclipse-ecj.db \
+ debian/tmp/usr/share/gcj/classmap.d/
+
+ mkdir -p debian/tmp/usr/bin
+ install -m 755 build/exe/ecj-gcj debian/tmp/usr/bin/
+endif
+ mkdir -p debian/ecj-gcj/usr/share/man/man1
+ ln -sf ecj.1.gz \
+ debian/ecj-gcj/usr/share/man/man1/ecj-gcj.1.gz
+
+install/ecj-bootstrap::
+ mkdir -p debian/ecj-bootstrap/usr/bin
+ install -m 755 ecj-bootstrap debian/ecj-bootstrap/usr/bin/
+
+ mkdir -p debian/ecj-bootstrap/usr/share/man/man1
+ ln -sf ecj.1.gz \
+ debian/ecj-bootstrap/usr/share/man/man1/ecj-bootstrap.1.gz
+
+clean::
+ rm -rf build
+ rm -f debian/*.pyc
diff --git a/ecj b/ecj
new file mode 100644
index 0000000..2076605
--- /dev/null
+++ b/ecj
@@ -0,0 +1,31 @@
+#! /bin/sh
+
+ver=4.1
+
+case "$*" in
+ *-bootclasspath*) ;;
+ *)
+ if [ ! -f /usr/lib/jvm/java-gcj/jre/lib/rt.jar ]; then
+ bcoption="-bootclasspath /usr/share/java/libgcj-$ver.jar"
+ fi
+esac
+
+if [ -x /usr/bin/ecj-gcj ]; then
+
+ exec /usr/bin/ecj-gcj \
+ $bcoption ${1+"$@"}
+
+else
+
+ case $CLASSPATH in
+ */usr/share/java/ecj.jar*) ;;
+ *) CLASSPATH=${CLASSPATH:+$CLASSPATH:}/usr/share/java/ecj.jar
+ esac
+ export CLASSPATH
+
+ exec /usr/bin/gij-$ver \
+ -Dgnu.gcj.precompiled.db.path=/var/lib/gcj-$ver/classmap.db \
+ -Djava.ext.dirs=/usr/lib/java-ext:/usr/share/java-ext \
+ org.eclipse.jdt.internal.compiler.batch.Main $bcoption ${1+"$@"}
+
+fi
diff --git a/ecj-bootstrap b/ecj-bootstrap
new file mode 100644
index 0000000..2076605
--- /dev/null
+++ b/ecj-bootstrap
@@ -0,0 +1,31 @@
+#! /bin/sh
+
+ver=4.1
+
+case "$*" in
+ *-bootclasspath*) ;;
+ *)
+ if [ ! -f /usr/lib/jvm/java-gcj/jre/lib/rt.jar ]; then
+ bcoption="-bootclasspath /usr/share/java/libgcj-$ver.jar"
+ fi
+esac
+
+if [ -x /usr/bin/ecj-gcj ]; then
+
+ exec /usr/bin/ecj-gcj \
+ $bcoption ${1+"$@"}
+
+else
+
+ case $CLASSPATH in
+ */usr/share/java/ecj.jar*) ;;
+ *) CLASSPATH=${CLASSPATH:+$CLASSPATH:}/usr/share/java/ecj.jar
+ esac
+ export CLASSPATH
+
+ exec /usr/bin/gij-$ver \
+ -Dgnu.gcj.precompiled.db.path=/var/lib/gcj-$ver/classmap.db \
+ -Djava.ext.dirs=/usr/lib/java-ext:/usr/share/java-ext \
+ org.eclipse.jdt.internal.compiler.batch.Main $bcoption ${1+"$@"}
+
+fi
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/ecj.git
More information about the pkg-java-commits
mailing list