debian/0000755000000000000000000000000012251631752007172 5ustar debian/libecj-java.poms0000644000000000000000000000002412130260463012226 0ustar debian/poms/ecj.pom debian/ecj.prerm0000644000000000000000000000012412130260463010770 0ustar #! /bin/sh -e update-alternatives --quiet --remove javac /usr/bin/ecj #DEBHELPER# debian/libecj-java.links0000644000000000000000000000007012130260463012371 0ustar /usr/share/java/eclipse-ecj.jar /usr/share/java/ecj.jar debian/classfile.py0000644000000000000000000001633612130260463011513 0ustar ## Copyright (C) 2004, 2005 Red Hat, Inc. ## Written by Gary Benson ## ## 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 "" 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": ""}) result.append("%-13s %s" % ( attr + ":", repr(value).replace( "'Code': ''", "'Code': "))) 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") debian/copyright0000644000000000000000000002720312130335336011124 0ustar This package was debianized by Jerry Haltom on Thu, 10 Feb 2005 14:47:15 -0600 It was downloaded from http://download.eclipse.org/eclipse/downloads/ 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: Eclipse Public License - v 1.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE 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 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. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation 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. debian/libecj-java-gcj.postrm0000644000000000000000000000017212130260463013341 0ustar #! /bin/sh set -e if [ "$1" = remove ] && which rebuild-gcj-db >/dev/null 2>&1; then rebuild-gcj-db fi #DEBHELPER# debian/ecj.manpages0000644000000000000000000000001512130260463011435 0ustar debian/ecj.1 debian/changelog0000644000000000000000000004112712251625051011044 0ustar 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 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 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 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 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 Sun, 06 Jan 2013 18:54:59 +0100 ecj (3.5.1-5) unstable; urgency=low * Fix the libgcj so version. -- Matthias Klose Sun, 06 Jan 2013 17:36:18 +0100 ecj (3.5.1-4) unstable; urgency=low * Rebuild using GCC-4.7. -- Matthias Klose 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 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 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 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 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 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 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 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 Sun, 15 Feb 2009 22:34:28 +0100 ecj (3.3.0+0728-11) unstable; urgency=low * Build again for alpha. -- Matthias Klose 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 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 Wed, 09 Apr 2008 04:12:54 +0200 ecj (3.3.0+0728-8) unstable; urgency=low * Fix build failure on alpha. -- Matthias Klose 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 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 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 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 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 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 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 Sat, 25 Aug 2007 12:35:30 +0200 ecj (3.3.0-2) unstable; urgency=low * Apply fix for upstream report #195317. -- Matthias Klose 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 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 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 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 Sun, 29 Apr 2007 22:19:47 +0200 ecj (3.2.2-1) unstable; urgency=low * Upload to unstable. -- Matthias Klose 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 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 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 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 Tue, 9 Jan 2007 00:09:22 +0100 ecj-bootstrap (3.2.1-3) unstable; urgency=low * Add missing build dependency. -- Matthias Klose 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 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 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 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 Sun, 13 Aug 2006 13:01:45 +0200 ecj-bootstrap (3.2-1) unstable; urgency=low * New upstream version. -- Matthias Klose 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 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 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 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 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 Sun, 26 Feb 2006 21:00:44 +0000 ecj-bootstrap (3.1.2-2ubuntu2) dapper; urgency=low * Build using gcj-4.1. -- Matthias Klose 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 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 Thu, 9 Feb 2006 16:33:45 +0000 ecj-bootstrap (3.1.2-1) unstable; urgency=low * New upstream version. -- Matthias Klose 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 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 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 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 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 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 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 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 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 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 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 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 Sat, 11 Jun 2005 16:57:27 +0000 ecj-bootstrap (3.0.1-3) experimental; urgency=low * Synchronize. -- Matthias Klose 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 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 Sun, 22 May 2005 15:53:07 +0000 ecj-bootstrap (3.0.1-1ubuntu5) hoary; urgency=low * Fixed path to ant.jar. -- Jerry Haltom 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 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 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 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 Fri, 11 Feb 2005 20:37:21 +0000 ecj-bootstrap (3.0.1-0) unstable; urgency=low * Initial release. -- Jerry Haltom Wed, 09 Feb 2005 19:36:07 -0600 debian/ecj-gcj.overrides0000644000000000000000000000005612130260463012412 0ustar ecj-gcj binary: binary-or-shlib-defines-rpath debian/ecj.10000644000000000000000000000634212130260463010013 0ustar .TH ECJ "1" "October 2002" .SH NAME ecj \- manual page for eclipse JDT Compiler .SH SYNOPSIS .B ecj \fR .SH DESCRIPTION The JDT Compiler (jdtc) is a command version of Java compiler for eclipse. ecj 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 ;;...; .TP \fB\-d\fR destination directory (if omitted no package directory structure is created) .TP \fB\-d\fR none no classfile is generated .PP \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\-1.7\fR set compliance level to 1.7 .TP \fB\-source\fR assertions toggle (1.3 or 1.4, default is 1.3 in -1.3 mode and 1.4 in -1.4 mode) .TP \fB\-target\fR classfile target setting .TP \fB\-nowarn\fR no warning (equivalent to '\-warn:none') .TP \fB\-warn\fR: 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:] 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 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 repeat compilation process times (perf analysis) .PP .SH AUTHOR This manual page was written by Takshi Okamoto and Jan Schulz . debian/stamp-patched0000644000000000000000000000000012130271477011635 0ustar debian/compat0000644000000000000000000000000212130260463010361 0ustar 5 debian/ecj.install0000644000000000000000000000002712130260463011313 0ustar debian/tmp/usr/bin/ecj debian/ecj.in0000644000000000000000000000133312130260463010254 0ustar #! /bin/sh 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*) ;; */usr/share/java/eclipse-ecj.jar*) ;; *) CLASSPATH=${CLASSPATH:+$CLASSPATH:}/usr/share/java/eclipse-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 debian/patches/0000755000000000000000000000000012251575265010627 5ustar debian/patches/gcc-changes.diff0000644000000000000000000005146612251575265013637 0ustar Index: b/gcc.properties =================================================================== --- /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 +++ b/src/org.eclipse.jdt.core/build.xml @@ -49,9 +49,10 @@ + - \ No newline at end of file + 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 +++ 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 +++ 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); + } +} debian/patches/series0000644000000000000000000000002112130331057012016 0ustar gcc-changes.diff debian/README.Debian0000644000000000000000000000067712130260463011236 0ustar ecj === 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. debian/control0000644000000000000000000000602112251625073010573 0ustar Source: ecj Section: java Priority: optional Maintainer: Debian Java Maintainers Uploaders: Matthias Klose 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.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. debian/poms/0000755000000000000000000000000012130326565010147 5ustar debian/poms/ecj.pom0000644000000000000000000000275212130326552011427 0ustar 4.0.0 org.eclipse.jdt.core.compiler ecj 3.8.2 jar Eclipse ECJ Eclipse JDT Core Batch Compiler http://www.eclipse.org/jdt/ UTF-8 UTF-8 Eclipse Public License v1.0 http://www.eclipse.org/org/documents/epl-v10.php repo http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jdt.core/ :pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse Ralph Schaer ralphschaer@gmail.com debian/libecj-java-gcj.postinst0000644000000000000000000000017512130260463013703 0ustar #! /bin/sh set -e if [ "$1" = configure ] && which rebuild-gcj-db >/dev/null 2>&1; then rebuild-gcj-db fi #DEBHELPER# debian/aotcompile.py0000644000000000000000000003511712251631744011710 0ustar # -*- python -*- ## Copyright (C) 2005, 2006 Red Hat, Inc. ## Written by Gary Benson ## ## 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", "-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) $(LDFLAGS) $(GCJFLAGS) $(RPATH) -Wl,-O1 --main=org.eclipse.jdt.internal.compiler.batch.Main $^ -o $@ ecj1: $(%(base)s_OBJECTS) resources.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] debian/aot-compile0000644000000000000000000000612612130260463011324 0ustar #! /usr/bin/python ## Copyright (C) 2006 Red Hat, Inc. ## Written by Gary Benson ## ## 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) debian/rules0000755000000000000000000002000412251631657010252 0ustar #!/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) -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) -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=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/R4_3_1.tar.gz #git clone -b R3_8_maintenance git://git.eclipse.org/gitroot/jdt/eclipse.jdt.core.git 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 debian/source/0000755000000000000000000000000012130327657010474 5ustar debian/source/format0000644000000000000000000000001412130327657011702 0ustar 3.0 (quilt) debian/libecj-java-gcj.install0000644000000000000000000000010312130260463013455 0ustar debian/tmp/usr/lib/gcj/eclipse-ecj.jar.so debian/tmp/usr/share/gcj debian/ecj-gcj.install0000644000000000000000000000003412130260463012052 0ustar debian/tmp/usr/bin/ecj-gcj debian/ecj.postinst0000644000000000000000000000027312130260463011533 0ustar #! /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#