[ecj] 61/145: Import Debian changes 3.9.0-1

Emmanuel Bourg ebourg-guest at moszumanska.debian.org
Tue Mar 27 23:11:29 BST 2018


This is an automated email from the git hooks/post-receive script.

ebourg-guest pushed a commit to branch master
in repository ecj.

commit 5cb30c655002ae9e11b4f63c42d92cb123985679
Merge: 8abb214 8cf7ba0
Author: Matthias Klose <doko at debian.org>
Date:   Tue Dec 10 15:50:07 2013 +0100

    Import Debian changes 3.9.0-1
    
    ecj (3.9.0-1) unstable; urgency=medium
    
      * Update to 4.3.1 (built from the R4_3_1 tag, identifies itself as 3.9.0).

 debian/aotcompile.py                               |   6 +-
 debian/changelog                                   |   6 +
 debian/control                                     |   2 +-
 debian/patches/gcc-changes.diff                    |  22 +-
 debian/rules                                       |  14 +-
 src/org.eclipse.jdt.core/META-INF/eclipse.inf      |   1 +
 src/org.eclipse.jdt.core/build.xml                 |   5 +-
 .../eclipse/jdt/core/compiler/CharOperation.java   |  17 +-
 .../org/eclipse/jdt/core/compiler/IProblem.java    |  58 +-
 .../eclipse/jdt/internal/compiler/ClassFile.java   | 119 +++-
 .../internal/compiler/ast/AND_AND_Expression.java  |  19 +-
 .../eclipse/jdt/internal/compiler/ast/ASTNode.java |  12 +-
 .../compiler/ast/AbstractMethodDeclaration.java    |   5 +-
 .../compiler/ast/AllocationExpression.java         |  26 +-
 .../jdt/internal/compiler/ast/Annotation.java      |   7 +-
 .../compiler/ast/ArrayAllocationExpression.java    |  13 +-
 .../internal/compiler/ast/ArrayInitializer.java    |   3 +-
 .../jdt/internal/compiler/ast/ArrayReference.java  |  16 +-
 .../jdt/internal/compiler/ast/AssertStatement.java |  15 +-
 .../jdt/internal/compiler/ast/Assignment.java      |  50 +-
 .../internal/compiler/ast/BinaryExpression.java    |  37 +-
 .../eclipse/jdt/internal/compiler/ast/Block.java   |  11 +-
 .../jdt/internal/compiler/ast/BreakStatement.java  |   6 +-
 .../jdt/internal/compiler/ast/CastExpression.java  |  27 +-
 .../eclipse/jdt/internal/compiler/ast/Clinit.java  |  26 +-
 .../compiler/ast/CombinedBinaryExpression.java     |  45 +-
 .../compiler/ast/CompilationUnitDeclaration.java   |   2 +-
 .../internal/compiler/ast/CompoundAssignment.java  |  13 +-
 .../compiler/ast/ConditionalExpression.java        |  47 +-
 .../compiler/ast/ConstructorDeclaration.java       |  70 ++-
 .../internal/compiler/ast/ContinueStatement.java   |   6 +-
 .../jdt/internal/compiler/ast/DoStatement.java     |  17 +-
 .../jdt/internal/compiler/ast/EqualExpression.java |  85 ++-
 .../compiler/ast/ExplicitConstructorCall.java      |  10 +-
 .../jdt/internal/compiler/ast/Expression.java      |  63 +-
 .../compiler/ast/FakedTrackingVariable.java        | 115 +++-
 .../internal/compiler/ast/FieldDeclaration.java    |  19 +-
 .../jdt/internal/compiler/ast/FieldReference.java  | 117 +++-
 .../jdt/internal/compiler/ast/ForStatement.java    |  18 +-
 .../internal/compiler/ast/ForeachStatement.java    |  24 +-
 .../jdt/internal/compiler/ast/IfStatement.java     |  14 +-
 .../compiler/ast/InstanceOfExpression.java         |  19 +-
 .../eclipse/jdt/internal/compiler/ast/Javadoc.java |   7 +-
 .../internal/compiler/ast/JavadocMessageSend.java  |   5 +-
 .../internal/compiler/ast/LocalDeclaration.java    |  57 +-
 .../jdt/internal/compiler/ast/MessageSend.java     | 283 +++++++--
 .../internal/compiler/ast/MethodDeclaration.java   |  42 +-
 .../jdt/internal/compiler/ast/NameReference.java   |  19 +-
 .../jdt/internal/compiler/ast/NullLiteral.java     |   7 +-
 .../internal/compiler/ast/OR_OR_Expression.java    |  22 +-
 .../internal/compiler/ast/OperatorExpression.java  |   7 +-
 .../ast/ParameterizedQualifiedTypeReference.java   |   3 +-
 .../ast/QualifiedAllocationExpression.java         |  46 +-
 .../compiler/ast/QualifiedNameReference.java       | 114 +++-
 .../compiler/ast/QualifiedThisReference.java       |   7 +-
 .../compiler/ast/QualifiedTypeReference.java       |  10 +-
 .../jdt/internal/compiler/ast/Reference.java       |  51 +-
 .../jdt/internal/compiler/ast/ReturnStatement.java |  19 +-
 .../internal/compiler/ast/SingleNameReference.java |  81 ++-
 .../jdt/internal/compiler/ast/Statement.java       |  26 +-
 .../jdt/internal/compiler/ast/SuperReference.java  |  11 +-
 .../jdt/internal/compiler/ast/SwitchStatement.java |   3 +-
 .../jdt/internal/compiler/ast/ThisReference.java   |  25 +-
 .../jdt/internal/compiler/ast/ThrowStatement.java  |   2 +
 .../jdt/internal/compiler/ast/TryStatement.java    | 296 +++++-----
 .../jdt/internal/compiler/ast/TypeDeclaration.java |  31 +-
 .../jdt/internal/compiler/ast/UnaryExpression.java |  10 +-
 .../jdt/internal/compiler/ast/WhileStatement.java  |  13 +-
 .../eclipse/jdt/internal/compiler/batch/Main.java  | 230 +++++++-
 .../internal/compiler/batch/messages.properties    |  50 +-
 .../compiler/classfmt/ClassFileConstants.java      |   6 +-
 .../MethodInfoWithParameterAnnotations.java        |  17 +-
 .../jdt/internal/compiler/codegen/CodeStream.java  |   5 +-
 .../internal/compiler/env/INameEnvironment.java    |   6 +-
 .../compiler/flow/ConditionalFlowInfo.java         |   6 +
 .../flow/ExceptionHandlingFlowContext.java         |  17 +-
 .../internal/compiler/flow/FinallyFlowContext.java |  55 +-
 .../jdt/internal/compiler/flow/FlowContext.java    | 192 +++++-
 .../jdt/internal/compiler/flow/FlowInfo.java       |  59 +-
 .../compiler/flow/InsideSubRoutineFlowContext.java |   4 +-
 .../internal/compiler/flow/LabelFlowContext.java   |   6 +-
 .../internal/compiler/flow/LoopingFlowContext.java |  38 +-
 .../internal/compiler/flow/NullInfoRegistry.java   | 549 -----------------
 .../internal/compiler/flow/SwitchFlowContext.java  |   9 +-
 .../jdt/internal/compiler/flow/TryFlowContext.java |  44 ++
 .../compiler/flow/UnconditionalFlowInfo.java       | 139 ++---
 .../internal/compiler/impl/CompilerOptions.java    |  60 +-
 .../jdt/internal/compiler/impl/IrritantSet.java    |  10 +-
 .../jdt/internal/compiler/lookup/ArrayBinding.java |   8 +-
 .../internal/compiler/lookup/BaseTypeBinding.java  |   6 +-
 .../compiler/lookup/BinaryTypeBinding.java         |  71 ++-
 .../jdt/internal/compiler/lookup/BlockScope.java   |  76 ++-
 .../jdt/internal/compiler/lookup/ClassScope.java   |  18 +-
 .../jdt/internal/compiler/lookup/FieldBinding.java |  17 +-
 .../lookup/IQualifiedTypeResolutionListener.java   |  33 ++
 .../lookup/ImplicitNullAnnotationVerifier.java     | 450 ++++++++++++++
 .../internal/compiler/lookup/InvocationSite.java   |  22 +-
 .../compiler/lookup/LocalVariableBinding.java      |  11 +-
 .../compiler/lookup/LookupEnvironment.java         |  13 +
 .../internal/compiler/lookup/MethodBinding.java    |  15 +-
 .../internal/compiler/lookup/MethodVerifier.java   | 204 ++-----
 .../internal/compiler/lookup/MethodVerifier15.java | 341 +++++------
 .../compiler/lookup/NestedTypeBinding.java         |  31 +-
 .../lookup/ParameterizedGenericMethodBinding.java  |   8 +-
 .../compiler/lookup/ParameterizedTypeBinding.java  |  13 +-
 .../internal/compiler/lookup/ReferenceBinding.java | 150 ++++-
 .../jdt/internal/compiler/lookup/Scope.java        | 176 +++---
 .../compiler/lookup/SourceTypeBinding.java         | 153 ++---
 .../jdt/internal/compiler/lookup/TagBits.java      |   7 +-
 .../jdt/internal/compiler/lookup/TypeBinding.java  |  12 +-
 .../internal/compiler/lookup/TypeConstants.java    |  79 ++-
 .../jdt/internal/compiler/lookup/TypeIds.java      |  16 +-
 .../compiler/lookup/TypeVariableBinding.java       |  26 +-
 .../lookup/UnresolvedAnnotationBinding.java        |  12 +-
 .../internal/compiler/lookup/VariableBinding.java  |  16 +-
 .../compiler/parser/AbstractCommentParser.java     |   4 +-
 .../internal/compiler/parser/JavadocParser.java    |   4 +-
 .../jdt/internal/compiler/parser/Parser.java       |  37 +-
 .../internal/compiler/parser/RecoveredField.java   |  19 +-
 .../internal/compiler/parser/readableNames.props   | 656 ++++++++++-----------
 .../internal/compiler/problem/ProblemReporter.java | 333 ++++++++++-
 .../internal/compiler/problem/messages.properties  |  32 +-
 .../jdt/internal/compiler/util/Sorting.java        |  79 +++
 123 files changed, 4651 insertions(+), 2403 deletions(-)

diff --cc debian/aotcompile.py
index 00e9828,0000000..007c1dc
mode 100644,000000..100644
--- a/debian/aotcompile.py
+++ b/debian/aotcompile.py
@@@ -1,430 -1,0 +1,430 @@@
 +
 +# -*- 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"]
++LDFLAGS = ["-Wl,-Bsymbolic", "-Wl,-z,relro"]
 +
 +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 \\
 +ecj-gcj ecj1
 +
 +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 $@
 +
 +ecj-gcj: $(%(base)s_OBJECTS) resources.o
- 	$(GCJ) $(GCJFLAGS) $(RPATH) -Wl,-O1 --main=org.eclipse.jdt.internal.compiler.batch.Main $^ -o $@
++	$(GCJ) $(LDFLAGS) $(GCJFLAGS) $(RPATH) -Wl,-O1 --main=org.eclipse.jdt.internal.compiler.batch.Main $^ -o $@
 +
 +ecj1: $(%(base)s_OBJECTS) resources.o
- 	$(GCJ) $(GCJFLAGS) $(RPATH) -Wl,-O1 --main=org.eclipse.jdt.internal.compiler.batch.GCCMain $^ -o $@
++	$(GCJ) $(LDFLAGS) $(GCJFLAGS) $(RPATH) -Wl,-O1 --main=org.eclipse.jdt.internal.compiler.batch.GCCMain $^ -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 --cc debian/changelog
index 2737b6a,0000000..3db23c4
mode 100644,000000..100644
--- a/debian/changelog
+++ b/debian/changelog
@@@ -1,533 -1,0 +1,539 @@@
++ecj (3.9.0-1) unstable; urgency=medium
++
++  * Update to 4.3.1 (built from the R4_3_1 tag, identifies itself as 3.9.0).
++
++ -- Matthias Klose <doko at debian.org>  Tue, 10 Dec 2013 15:50:07 +0100
++
 +ecj (3.8.2-4) unstable; urgency=low
 +
 +  * Build using gcj-4.8 on all architectures.
 +
 + -- Matthias Klose <doko at debian.org>  Mon, 01 Jul 2013 01:17:16 +0200
 +
 +ecj (3.8.2-2) unstable; urgency=low
 +
 +  * Build using gcj-4.6 on mips.
 +
 + -- Matthias Klose <doko at debian.org>  Mon, 08 Apr 2013 18:56:06 +0200
 +
 +ecj (3.8.2-1) unstable; urgency=low
 +
 +  * Update to 3.8.2 (built from the R3_8_2 tag, identifies itself as 3.8.3).
 +    Supports Java7. Closes: #693441.
 +  * Remove copyright information from ICU and jsch. Closes: #622296.
 +
 + -- Matthias Klose <doko at debian.org>  Mon, 08 Apr 2013 00:34:31 +0200
 +
 +ecj (3.5.1-6) unstable; urgency=low
 +
 +  * Allow package to build with gcj-4.6 on ia64.
 +
 + -- Matthias Klose <doko at debian.org>  Sun, 06 Jan 2013 18:54:59 +0100
 +
 +ecj (3.5.1-5) unstable; urgency=low
 +
 +  * Fix the libgcj so version.
 +
 + -- Matthias Klose <doko at debian.org>  Sun, 06 Jan 2013 17:36:18 +0100
 +
 +ecj (3.5.1-4) unstable; urgency=low
 +
 +  * Rebuild using GCC-4.7.
 +
 + -- Matthias Klose <doko at debian.org>  Tue, 10 Apr 2012 14:47:52 +0200
 +
 +ecj (3.5.1-3) unstable; urgency=low
 +
 +  [ James Page ]
 +  * Add maven artifact deployment to resolve FTBFS for 
 +    tomcat-maven-plugin (LP: #835769):
 +    - debian/control: added maven-repo-helper to Build-Depends-Indep
 +    - debian/rules: install maven artifacts, added get-orig-poms target 
 +      to retrieve original pom files
 +    - debian/libecj-java.poms: POM file locator.
 +    - debian/poms/ecj.pom: Upstream POM file from Maven repo1.
 +    - debian/libecj-java.install: removed - install handled by m-r-h.
 +
 +  [ Matthias Klose ]
 +  * Remove Jerry Haltom and Michael Koch from uploaders.
 +
 + -- Matthias Klose <doko at debian.org>  Wed, 14 Sep 2011 23:27:58 +0200
 +
 +ecj (3.5.1-2.1) unstable; urgency=low
 +
 +  * Non-maintainer upload.
 +  * Enable armhf architecture for ecj1 (Closes: #631070) 
 +
 + -- Hector Oron <zumbi at debian.org>  Wed, 13 Jul 2011 22:13:12 +0100
 +
 +ecj (3.5.1-2) unstable; urgency=medium
 +
 +  [ Steve Langasek ]
 +  * Move ecj1 binary to the multiarch gcc directory so gcj can find it.
 +  * Create a link to ecj1 in our build directory so that gcj can find it
 +    for rebootstrapping ecj1.
 +
 +  [ Matthias Klose]
 +  * Build with default gcj-jdk.
 +  * ecj1: Provide a compatibility symlink in /usr/lib/gcc/ecj1.
 +
 + -- Matthias Klose <doko at debian.org>  Wed, 08 Jun 2011 19:25:06 +0200
 +
 +ecj (3.5.1-1) unstable; urgency=low
 +
 +  * Update to the final 3.5.1 release.
 +  * Update GCCMain.java from rhug/eclipse-gcj.
 +
 + -- Matthias Klose <doko at debian.org>  Sat, 10 Oct 2009 11:18:07 +0200
 +
 +ecj (3.5+20090820-1) unstable; urgency=low
 +
 +  * Update to the R3_5_maintenance branch.
 +    - Fixes eclipse #285466, bootstrap error in OpenJDK.
 +  * Set sections to java.
 +
 + -- Matthias Klose <doko at debian.org>  Thu, 20 Aug 2009 19:34:12 +0200
 +
 +ecj (3.5-1) unstable; urgency=low
 +
 +  * New upstream version.
 +  * Update to the R3_5_maintenance branch 20090728.
 +  * Update GCCMain.java.
 +  * Build using gcj-4.4-jdk on all architectures.
 +
 + -- Matthias Klose <doko at debian.org>  Tue, 28 Jul 2009 18:55:13 +0200
 +
 +ecj (3.4.2-4) unstable; urgency=low
 +
 +  * Build using gcj-4.4-jdk on hppa.
 +
 + -- Matthias Klose <doko at debian.org>  Sun, 15 Feb 2009 22:34:28 +0100
 +
 +ecj (3.4.2-1) unstable; urgency=low
 +
 +  * New upstream version 3.4.2, built from the v_894_R34x tag,
 +    R3_4_maintenance branch.
 +
 + -- Matthias Klose <doko at debian.org>  Sun, 15 Feb 2009 22:34:28 +0100
 +
 +ecj (3.3.0+0728-11) unstable; urgency=low
 +
 +  * Build again for alpha.
 +
 + -- Matthias Klose <doko at debian.org>  Sun, 01 Feb 2009 09:31:00 +0100
 +
 +ecj (3.3.0+0728-10) unstable; urgency=low
 +
 +  * libecj-java: Recommend default-jre-headless | java2-runtime-headless
 +    instead of java2-runtime.
 +
 + -- Matthias Klose <doko at debian.org>  Sat, 06 Sep 2008 10:52:13 +0000
 +
 +ecj (3.3.0+0728-9) unstable; urgency=low
 +
 +  * Don't build on alpha, arm, hppa.
 +
 + -- Matthias Klose <doko at debian.org>  Wed, 09 Apr 2008 04:12:54 +0200
 +
 +ecj (3.3.0+0728-8) unstable; urgency=low
 +
 +  * Fix build failure on alpha.
 +
 + -- Matthias Klose <doko at debian.org>  Thu, 24 Jan 2008 19:58:40 +0100
 +
 +ecj (3.3.0+0728-7) unstable; urgency=low
 +
 +  * Build using gcj-4.3 on all archs but alpha.
 +
 + -- Matthias Klose <doko at debian.org>  Thu, 24 Jan 2008 19:11:08 +0100
 +
 +ecj (3.3.0+0728-6) unstable; urgency=low
 +
 +  * Build-depend on libecj-java on arm.
 +
 + -- Matthias Klose <doko at debian.org>  Mon, 14 Jan 2008 22:07:01 +0100
 +
 +ecj (3.3.0+0728-5) unstable; urgency=medium
 +
 +  * Make ecj architecture dependent, dependencies depend on the jvm used.
 +  * ecj: Depend on gij-x.y.
 +
 + -- Matthias Klose <doko at debian.org>  Thu, 06 Sep 2007 19:22:58 +0200
 +
 +ecj (3.3.0+0728-4) unstable; urgency=low
 +
 +  * Fix name of renamed jar file (Michael Koch).
 +
 + -- Matthias Klose <doko at debian.org>  Wed, 05 Sep 2007 00:08:06 +0200
 +
 +ecj (3.3.0+0728-3) unstable; urgency=medium
 +
 +  * Use ecj-standalone.jar to build the ecj-gcj and ecj1 binaries.
 +  * ecj-gcj: Depend on ecj. Closes: #440259.
 +
 + -- Matthias Klose <doko at debian.org>  Thu, 30 Aug 2007 23:33:08 +0200
 +
 +ecj (3.3.0+0728-2) unstable; urgency=low
 +
 +  * Tighten build-dependency on libgcj-bc.
 +
 + -- Matthias Klose <doko at debian.org>  Sat, 25 Aug 2007 20:12:38 +0200
 +
 +ecj (3.3.0+0728-1) unstable; urgency=medium
 +
 +  * New upstream version, taken from the R3_3_maintenance tag.
 +  * Build using gcj-4.2 on all architectures except alpha and m68k.
 +  * Stop building the ecj-bootstrap and ecj-bootstrap-gcj packages.
 +  * Build a libecj-java-gcj package.
 +  * Build an ecj1 package on arm, BC-compile ecj1.
 +  * Update debian/copyright, eclipse is EPL, not CPL anymore.
 +
 + -- Matthias Klose <doko at debian.org>  Sat, 25 Aug 2007 12:35:30 +0200
 +
 +ecj (3.3.0-2) unstable; urgency=low
 +
 +  * Apply fix for upstream report #195317.
 +
 + -- Matthias Klose <doko at debian.org>  Fri, 20 Jul 2007 12:05:37 +0200
 +
 +ecj (3.3.0-1) unstable; urgency=low
 +
 +  * New upstream release.
 +  * Don't reference the transitional bootstrap package in the README.
 +    Closes: #426887.
 +  * Split out the library into libecj-java. Closes: #421621.
 +
 + -- Matthias Klose <doko at ubuntu.com>  Sat,  7 Jul 2007 02:13:27 +0200
 +
 +ecj (3.3~M7-2) unstable; urgency=low
 +
 +  * debian/control: Make ecj and ecj-gcj conflict and replace their
 +    eclipse-ecj and eclipse-ecj-gcj counterparts. Closes: #421302.
 +
 + -- Michael Koch <konqueror at gmx.de>  Sun, 20 May 2007 09:57:58 -0100
 +
 +ecj (3.3~M7-1) unstable; urgency=low
 +
 +  * New upstream release.
 +    - Fixes issues with classes extending java.io.PrintWriter and implementing
 +      some random interface. Closes: #424504.
 +    - Removed debian/patches/ecj-square-bracket-classpath.diff.
 +      Applied upstream.
 +
 + -- Michael Koch <konqueror at gmx.de>  Fri, 18 May 2007 09:32:35 -0100
 +
 +ecj (3.2.2-2) unstable; urgency=low
 +
 +  * Loosen dependency on gij-4.1, libgcj7-jar. Closes: #421488.
 +
 + -- Matthias Klose <doko at debian.org>  Sun, 29 Apr 2007 22:19:47 +0200
 +
 +ecj (3.2.2-1) unstable; urgency=low
 +
 +  * Upload to unstable.
 +
 + -- Matthias Klose <doko at debian.org>  Fri, 27 Apr 2007 01:04:45 +0200
 +
 +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 --cc debian/control
index 4473c62,0000000..614a335
mode 100644,000000..100644
--- a/debian/control
+++ b/debian/control
@@@ -1,69 -1,0 +1,69 @@@
 +Source: ecj
 +Section: java
 +Priority: optional
 +Maintainer: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
 +Uploaders: Matthias Klose <doko at debian.org>
 +Build-Depends: cdbs (>= 0.4.90ubuntu9), debhelper (>= 5),
 + gcj-jdk (>= 4:4.8.1),
 + libgcj-bc (>= 4.6.3),
 + libecj-java (>= 3.8.2) [arm], unzip [arm],
 + fastjar, ant, zip, dpkg (>= 1.13.19), python, time
 +Build-Depends-Indep: maven-repo-helper
 +Build-Conflicts: ecj-bootstrap-gcj (<< 3.8.2)
- Standards-Version: 3.9.4
++Standards-Version: 3.9.5
 +
 +Package: ecj
 +Architecture: any
 +Depends: libecj-java (>= ${source:Version}), ${pkg:gij}, ${pkg:libgcjjar}, java-common (>= 0.23), ${misc:Depends}
 +Recommends: ecj-gcj
 +Conflicts: ecj-bootstrap (<< 3.2.2), eclipse-ecj
 +Replaces: ecj-bootstrap (<< 3.2.2), eclipse-ecj
 +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, 1.6 and 1.7.
 +
 +Package: libecj-java
 +Architecture: all
 +Depends: java-common (>= 0.23), ${misc:Depends}
 +Conflicts: ecj-bootstrap (<< 3.2.2), eclipse-ecj
 +Replaces: ecj-bootstrap (<< 3.2.2), eclipse-ecj, ecj (<< 3.3.0-1)
 +Recommends: default-jre-headless | java2-runtime-headless | java5-runtime-headless
 +Suggests: ecj, ant, libecj-java-gcj
 +Description: Eclipse Java compiler (library)
 + This package provides a standalone version of the Eclipse JDT compiler library
 + 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, 1.6 and 1.7.
 +
 +Package: libecj-java-gcj
 +Architecture: any
 +Depends: java-common (>= 0.23), libecj-java (>= ${source:Version}), ${shlibs:Depends}, ${misc:Depends}
 +Replaces: ecj-bootstrap-gcj (<< 3.2.2), eclipse-ecj-gcj, ecj-gcj (<< 3.3.0+0728)
 +Description: Eclipse Java compiler (native library)
 + This package provides a standalone version of the Eclipse JDT compiler library
 + 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, 1.6 and 1.7.
 + .
 + This package contains a native version of libecj-java built using gcj.
 +
 +Package: ecj1
 +Architecture: alpha arm armel armhf
 +Depends: ${shlibs:Depends}, ${misc:Depends}
 +Description: java byte code compiler used by gcj
 + This package provides a standalone version of the java byte code compiler
 + used by gcj.
 +
 +Package: ecj-gcj
 +Architecture: any
 +Depends: ecj (>= ${source:Version}), libecj-java-gcj (>= ${source:Version}), ${shlibs:Depends}, ${misc:Depends}
 +Recommends: java-gcj-compat (>= 1.0.69)
 +Replaces: ecj-bootstrap-gcj (<< 3.2.2), eclipse-ecj-gcj
 +Conflicts: eclipse-ecj-gcj
 +Provides: libecj-java-gcj
 +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, 1.6 and 1.7.
 + .
 + This package contains a native version of ecj built using gcj.
diff --cc debian/patches/gcc-changes.diff
index 3663d54,0000000..5e2f09a
mode 100644,000000..100644
--- a/debian/patches/gcc-changes.diff
+++ b/debian/patches/gcc-changes.diff
@@@ -1,551 -1,0 +1,551 @@@
 +Index: b/gcc.properties
 +===================================================================
- --- /dev/null	1970-01-01 00:00:00.000000000 +0000
- +++ b/gcc.properties	2013-04-07 17:52:19.000000000 +0000
++--- /dev/null
+++++ b/gcc.properties
 +@@ -0,0 +1,5 @@
 ++
 ++# GCCMain messages.
 ++gcc.zipArg=-fzip-target requires argument
 ++gcc.zipDepArg=-fzip-dependency requires argument
 ++gcc.noClasspath=no classpath specified
 +Index: b/src/org.eclipse.jdt.core/build.xml
 +===================================================================
- --- a/src/org.eclipse.jdt.core/build.xml	2013-04-07 17:51:01.262026748 +0000
- +++ b/src/org.eclipse.jdt.core/build.xml	2013-04-07 17:52:19.000000000 +0000
- @@ -46,9 +46,10 @@
-  				<include name="**/*.rsc"/>
++--- a/src/org.eclipse.jdt.core/build.xml
+++++ b/src/org.eclipse.jdt.core/build.xml
++@@ -49,9 +49,10 @@
++ 				<include name="**/readableNames.props"/>
 + 				<include name="META-INF/**"/>
 + 				<include name="**/*.properties"/>
 ++				<include name="**/*.props"/>
 + 				<exclude name="META-INF/eclipse.inf"/>
 + 			</fileset>
 + 		</zip>
 + 		<delete dir="${output}" />
 + 	</target>
 +-</project>
 +\ No newline at end of file
 ++</project>
 +Index: b/src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
 +===================================================================
- --- a/src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java	2013-04-07 17:51:01.262026748 +0000
- +++ b/src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java	2013-04-07 17:52:19.000000000 +0000
- @@ -1154,9 +1154,9 @@
++--- a/src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
+++++ b/src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
++@@ -1188,9 +1188,9 @@
 + 		
 + 		// by default only lines and source attributes are generated.
 + 		this.produceDebugAttributes = ClassFileConstants.ATTR_SOURCE | ClassFileConstants.ATTR_LINES;
 +-		this.complianceLevel = this.originalComplianceLevel = ClassFileConstants.JDK1_4; // by default be compliant with 1.4
 +-		this.sourceLevel = this.originalSourceLevel = ClassFileConstants.JDK1_3; //1.3 source behavior by default
 +-		this.targetJDK = ClassFileConstants.JDK1_2; // default generates for JVM1.2
 ++		this.complianceLevel = this.originalComplianceLevel = ClassFileConstants.JDK1_5;
 ++		this.sourceLevel = this.originalSourceLevel = ClassFileConstants.JDK1_5;
 ++		this.targetJDK = ClassFileConstants.JDK1_5;
 + 
 + 		this.defaultEncoding = null; // will use the platform default encoding
 + 
 +Index: b/src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/GCCMain.java
 +===================================================================
- --- /dev/null	1970-01-01 00:00:00.000000000 +0000
- +++ b/src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/GCCMain.java	2013-04-07 17:58:29.121568275 +0000
++--- /dev/null
+++++ b/src/org.eclipse.jdt.core/org/eclipse/jdt/internal/compiler/batch/GCCMain.java
 +@@ -0,0 +1,502 @@
 ++/**
 ++ * 
 ++ */
 ++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.internal.compiler.ClassFile;
 ++import org.eclipse.jdt.internal.compiler.CompilationResult;
 ++import org.eclipse.jdt.internal.compiler.env.AccessRestriction;
 ++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.problem.ProblemSeverities;
 ++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) {
 ++		t.printStackTrace();
 ++		this.logger.logException(t);
 ++		System.exit(1);
 ++	}
 ++
 ++	public CompilationUnit[] getCompilationUnits() {
 ++		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);
 ++			// Sun/OpenJDK require at least one entry in the zip file.
 ++			ZipEntry entry = new ZipEntry(".dummy");
 ++			byte[] contents = new byte[0];
 ++			CRC32 crc = new CRC32();
 ++			crc.update(contents);
 ++			entry.setSize(contents.length);
 ++			entry.setCrc(crc.getValue());
 ++			zipStream.putNextEntry(entry);
 ++			zipStream.write(contents);
 ++			zipStream.closeEntry();
 ++		}
 ++		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);
 ++			// Sun/OpenJDK require at least one entry in the zip file.
 ++			ZipEntry entry = new ZipEntry(".dummy");
 ++			byte[] contents = new byte[0];
 ++			CRC32 crc = new CRC32();
 ++			crc.update(contents);
 ++			entry.setSize(contents.length);
 ++			entry.setCrc(crc.getValue());
 ++			zipDependencyStream.putNextEntry(entry);
 ++			zipDependencyStream.write(contents);
 ++			zipDependencyStream.closeEntry();
 ++		}
 ++		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];
 ++		AccessRuleSet accessRuleSet = new AccessRuleSet(accessRules, AccessRestriction.COMMAND_LINE, currentClasspathName);
 ++		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) {
 ++		// 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);
 ++	}
 ++
 ++	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) {
 ++		// A somewhat arbitrary list.  We use the GCC names
 ++		// here, and the local handleWarningToken translates
 ++		// for us.
 ++		handleWarningToken("constructor-name", enable);
 ++		handleWarningToken("pkg-default-method", enable);
 ++		handleWarningToken("masked-catch-block", enable);
 ++		handleWarningToken("all-deprecation", enable);
 ++		handleWarningToken("unused-local", enable);
 ++		handleWarningToken("unused-label", enable);
 ++		handleWarningToken("static-receiver", enable);
 ++		handleWarningToken("indirect-static", enable);
 ++		handleWarningToken("no-effect-assign", enable);
 ++		handleWarningToken("char-concat", enable);
 ++		handleWarningToken("useless-type-check", enable);
 ++		handleWarningToken("final-bound", enable);
 ++		handleWarningToken("assert-identifier", enable);
 ++		handleWarningToken("enum-identifier", enable);
 ++		handleWarningToken("finally", enable);
 ++		handleWarningToken("varargs-cast", enable);
 ++		handleWarningToken("unused", enable);
 ++		handleWarningToken("forbidden", enable);
 ++	}
 ++
 ++	public void configure(String[] argv) {
 ++		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 IllegalArgumentException(
 ++						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 IllegalArgumentException(
 ++						this.bind("configure.duplicateOutputPath", errorMessage.toString())); //$NON-NLS-1$
 ++				}
 ++				this.setDestinationPath(arg);
 ++			} 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 IllegalArgumentException(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 IllegalArgumentException(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);
 ++			} else if (currentArg.startsWith("-W")) { //$NON-NLS-1$
 ++				handleWarningToken(currentArg.substring(2), true);
 ++			} 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 IllegalArgumentException(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 IllegalArgumentException(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 IllegalArgumentException(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)
 ++			disableAll(ProblemSeverities.Warning);
 ++		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.maxRepetition = 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 --cc debian/rules
index 3ec6513,0000000..033b298
mode 100755,000000..100755
--- a/debian/rules
+++ b/debian/rules
@@@ -1,265 -1,0 +1,267 @@@
 +#!/usr/bin/make -f
 +
 +include /usr/share/cdbs/1/rules/debhelper.mk
 +
 +DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
 +DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
 +
 +GCC_VERSION   := $(shell ls -l /usr/bin/gcj | sed 's/.*-> gcj-\(.*\)/\1/')
 +
 +LIBGCJ_EXT    := $(shell ls -l /usr/lib/$(DEB_HOST_MULTIARCH)/libgcj_bc.so.1 | sed 's/.*\.//')
 +LIBGCJ_SOVER  = $(LIBGCJ_EXT)
 +REQ_VERSION   = 4.4.6
 +
 +ant_version = 1.7
 +ant_version =
 +GCJ = gcj-$(GCC_VERSION)
 +GIJ = gij-$(GCC_VERSION)
 +GCJDBTOOL = gcj-dbtool-$(GCC_VERSION)
 +GCJSUBDIR = /usr/lib/gcj-$(GCC_VERSION)-$(LIBGCJ_SOVER)
 +
 +# work around ecj1 having fallen out of the gcc search path
 +PATH := $(CURDIR):$(PATH)
 +export PATH
 +
 +with_native := yes
 +with_rebuild := yes
 +with_sourcebuild := yes
 +
 +ifneq (,$(filter $(DEB_HOST_ARCH), arm armel))
 +  with_rebuild := no
 +endif
 +
 +ifneq (,$(filter $(DEB_HOST_ARCH), arm))
 +  with_sourcebuild := no
 +endif
 +
 +DEB_DH_GENCONTROL_ARGS = -- \
 +	'-Vpkg:gij=gcj-$(GCC_VERSION)-jre-headless (>= $(REQ_VERSION))' \
 +	'-Vpkg:libgcjjar=gcj-$(GCC_VERSION)-jre-lib (>= $(REQ_VERSION))'
 +
 +JAR = eclipse-ecj.jar
 +
 +default: build
 +
 +eclipse_root = $(CURDIR)/../eclipse
 +
 +build/ecj:: build/stamp-bytecode build/stamp-nativecode
 +
 +build/stamp-bytecode:
 +ifneq (,$(findstring $(DEB_HOST_ARCH),arm))
 +	@echo 'ecj is not built anymore on this architecture.'
 +	@echo 'People insist on 100% compatible packages without providing any help.'
 +	@echo 'The porter lists are quiet on the topic of better gij/gcj support for'
 +	@echo 'these architectures.'
 +	false
 +endif
 +	rm -rf build/bin
 +	mkdir -p build/bin
 +
 +ifeq ($(with_sourcebuild),yes)
 +	cp -r src/org.eclipse.jdt.core/org build/bin/
 +	cat gcc.properties \
 +	    >> build/bin/org/eclipse/jdt/internal/compiler/batch/messages.properties
 +	rm -rf build/bin/org/eclipse/jdt/internal/compiler/apt
 +	rm -rf build/bin/org/eclipse/jdt/internal/compiler/tool
 +
 +	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
 +
 +	ln -sf /usr/lib/gcc/ecj1 $(CURDIR)/ecj1
 +	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
 +
 +	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)
 +	: # rebuild the compiler
 +	rm -rf build/bin
 +	mkdir -p build/bin
 +	cp -r src/org.eclipse.jdt.core/org build/bin/
++	cat gcc.properties \
++	    >> build/bin/org/eclipse/jdt/internal/compiler/batch/messages.properties
 +	rm -rf build/bin/org/eclipse/jdt/internal/compiler/apt
 +	rm -rf build/bin/org/eclipse/jdt/internal/compiler/tool
 +
 +	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
 +else
 +	mkdir -p build/bin
 +	unzip -d build/bin -q /usr/share/java/eclipse-ecj.jar
 +	mkdir -p build/dist
 +	cp -p /usr/share/java/eclipse-ecj.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
 +
 +	cd build/bin && find -name '*.rsc' -o -name '*.properties' -o -name '*.props' \
 +	    | fastjar -c -@ - -f $(CURDIR)/build/resources.jar
 +	$(GCJ) \
 +	    -c -O2 -g -fPIC -fjni -findirect-dispatch \
 +	    -o build/dist/resources.o build/resources.jar
 +	cp -p build/dist/resources.o build/exe/
 +
 +	PYTHONPATH=$(CURDIR)/debian \
 +	RPATH=-Wl,-rpath,$(GCJSUBDIR) \
 +	  time python debian/aot-compile \
 +	    --gcj=$(GCJ) --dbtool=$(GCJDBTOOL) \
 +	    -L /usr/lib/gcj build/dist build/dist
 +
 +	PYTHONPATH=$(CURDIR)/debian \
 +	RPATH=-Wl,-rpath,$(GCJSUBDIR) \
 +	  time python debian/aot-compile \
 +	    --gcj=$(GCJ) --dbtool=$(GCJDBTOOL) \
 +	    -L /usr/lib/gcj build/exe build/exe
 +
 +  ifeq (0,1)
 +	: # ecj-gcj
 +	time $(GCJ) \
- 	    -O1 -g -Wl,-O1 -Wl,-rpath,$(GCJSUBDIR) \
++	    -O1 -g -Wl,-O1 -Wl,-rpath,$(GCJSUBDIR) -Wl,-z,relro \
 +	    --main=org.eclipse.jdt.internal.compiler.batch.Main \
 +	    -o build/dist/ecj-gcj build/exe/ecj-standalone.jar
 +	: # ecj1
 +	time $(GCJ) \
- 	    -O1 -g -Wl,-O1 -Wl,-rpath,$(GCJSUBDIR) \
++	    -O1 -g -Wl,-O1 -Wl,-rpath,$(GCJSUBDIR) -Wl,-z,relro \
 +	    --main=org.eclipse.jdt.internal.compiler.batch.GCCMain \
 +	    -o build/dist/ecj1 build/exe/ecj-standalone.jar
 +  endif
 +endif
 +	touch build/stamp-nativecode
 +
 +
 +install/libecj-java::
 +	mh_installpoms -plibecj-java
 +	mh_installjar -plibecj-java -l debian/poms/ecj.pom build/dist/$(JAR) \
 +		--usj-name=eclipse-ecj
 +
 +install/ecj::
 +	mkdir -p debian/tmp/usr/bin
 +	sed 's/@ver@/$(GCC_VERSION)/g' debian/ecj.in \
 +	  > debian/tmp/usr/bin/ecj
 +	chmod 755 debian/tmp/usr/bin/ecj
 +
 +install/libecj-java-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/*.db \
 +		debian/tmp/usr/share/gcj/classmap.d/
 +endif
 +
 +install/ecj1::
 +ifeq ($(with_native),yes)
 +	mkdir -p debian/ecj1/usr/lib/$(DEB_HOST_MULTIARCH)/gcc
 +	install -m 755 build/exe/ecj1 debian/ecj1/usr/lib/$(DEB_HOST_MULTIARCH)/gcc/
 +	dh_link -p ecj1 \
 +	  /usr/lib/$(DEB_HOST_MULTIARCH)/gcc/ecj1 /usr/lib/gcc/ecj1
 +endif
 +
 +install/ecj-gcj::
 +ifeq ($(with_native),yes)
 +	mkdir -p debian/tmp/usr/bin
 +	install -m 755 build/exe/ecj-gcj debian/tmp/usr/bin/
 +endif
 +	mkdir -p debian/ecj-gcj/usr/bin
 +
 +	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
 +
 +	mkdir -p debian/ecj-gcj/usr/share/lintian/overrides
 +	cp -p debian/ecj-gcj.overrides \
 +	  debian/ecj-gcj/usr/share/lintian/overrides/ecj-gcj
 +
 +binary-predeb/ecj1::
 +#	sed -i 's/libgcj[1-9][^,]*//;s/,,/,/' debian/ecj1.substvars
 +
 +binary-predeb/ecj-gcj::
 +#	sed -i 's/libgcj[1-9][^,]*//;s/,,/,/' debian/ecj-gcj.substvars
 +
 +clean::
 +	rm -rf build
 +	rm -f debian/*.pyc ecj1
 +	rm -rf debian/.mh
 +
 +RR=../cvs/R3_5_maintenance/
 +RR=../cvs/R3_5_1/
- RR=R3_8_2/
- tag = R3_8_2
++RR=R4_3_1/
++tag = R4_3_1
 +
 +MAVEN_REPO  := http://repo1.maven.org/maven2
 +PACKAGE := ecj
 +
 +get-orig-pom:
 +	mkdir -p debian/poms
 +	wget  -U NoSuchBrowser/1.0 -O debian/poms/$(PACKAGE).pom \
 +        $(MAVEN_REPO)/org/eclipse/jdt/core/compiler/$(PACKAGE)/$(DEB_UPSTREAM_VERSION)/$(PACKAGE)-$(DEB_UPSTREAM_VERSION).pom
 +
 +get-source:
 +	rm -rf org.eclipse.jdt.core
- 	#wget http://git.eclipse.org/c/jdt/eclipse.jdt.core.git/snapshot/R3_8_2.tar.gz
++	#wget http://git.eclipse.org/c/jdt/eclipse.jdt.core.git/snapshot/R4_3_1.tar.gz
 +	#git clone -b R3_8_maintenance git://git.eclipse.org/gitroot/jdt/eclipse.jdt.core.git
- 	tar xf ../R3_8_2.tar.gz
++	tar xf ../R4_3_1.tar.gz
 +	rm -rf tmp-src
 +	mkdir -p tmp-src/org.eclipse.jdt.core
 +	cp -p $(RR)org.eclipse.jdt.core/scripts/about.html \
 +		tmp-src/org.eclipse.jdt.core/
 +	cp -p $(RR)org.eclipse.jdt.core/scripts/build.xml \
 +		tmp-src/org.eclipse.jdt.core/
 +	tar -c -f - -C $(RR)org.eclipse.jdt.core/compiler org \
 +	    | tar -x -f - -C tmp-src/org.eclipse.jdt.core/
 +
 +	tar -c -f - -C $(RR)org.eclipse.jdt.core/antadapter org META-INF \
 +	    | tar -x -f - -C tmp-src/org.eclipse.jdt.core/
 +	find tmp-src -name CheckDebugAttributes.java | xargs -r rm -f
 +	find tmp-src -name BuildJarIndex.java | xargs -r rm -f
 +
 +	tar -c -f - -C $(RR)org.eclipse.jdt.core/batch org \
 +	    | tar -x -f - -C tmp-src/org.eclipse.jdt.core/
 +
 +	mkdir -p tmp-src/org.eclipse.jdt.core/META-INF/services
 +#	cp -p $(RR)org.eclipse.jdt.core/scripts/META-INF/MANIFEST.MF \
 +#	    tmp-src/org.eclipse.jdt.core/META-INF/
 +	printf 'org.eclipse.jdt.internal.compiler.tool.EclipseCompiler #Eclipse compiler' \
 +	    > tmp-src/org.eclipse.jdt.core/META-INF/services/javax.tools.JavaCompiler
 +

-- 
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