X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Ftool%2FCompiler.java;h=3b3dddd9d021301cecc2eb6ae88ca187122a9f20;hb=1f8d04e6dc7984c83037f08cc44ca45a52d5ad19;hp=bf1ad56557626ef0224cec6600090fcc99dc584c;hpb=c820d06c14e36048da46a51d1cd61ae51cae2a66;p=org.ibex.tool.git diff --git a/src/org/ibex/tool/Compiler.java b/src/org/ibex/tool/Compiler.java index bf1ad56..3b3dddd 100644 --- a/src/org/ibex/tool/Compiler.java +++ b/src/org/ibex/tool/Compiler.java @@ -1,3 +1,7 @@ +// Copyright 2000-2005 the Contributors, as shown in the revision logs. +// Licensed under the Apache Public Source License 2.0 ("the License"). +// You may not use this file except in compliance with the License. + package org.ibex.tool; import java.io.*; @@ -31,6 +35,7 @@ public class Compiler { List srcdir = new ArrayList(); String source = null, target = null, blddir = null, mainclass = null; boolean buildjar = false; + boolean keepjar = false; if (args.length == 0) args = new String[] { "--help" }; for (int i=0; i < args.length; i++) { @@ -48,6 +53,8 @@ public class Compiler { if (blddir != null) { System.out.println("cannot specify both -d and -j"); return; } blddir = args[++i]; break; + case 'J': + keepjar = true; case 'j': if (i == args.length - 1) { System.out.println("Missing parameter: "+args[i]); return; } @@ -90,7 +97,7 @@ public class Compiler { Compiler c = new Compiler(); if (blddir != null) { - if (buildjar) c.setBuildJar(blddir); + if (buildjar) c.setBuildJar(blddir, keepjar); else c.setBuildDir(blddir); } if (source != null) c.setSource(source); @@ -104,7 +111,9 @@ public class Compiler { c.setVerbose(verbose); c.setWarnings(warnings); c.setVeryVerbose(veryverbose); - c.compile(); + boolean hasErrors = c.compile(); + if (hasErrors) Runtime.getRuntime().exit(-1); + Runtime.getRuntime().exit(0); } private static void printHelp() { System.out.println("Usage java -cp ... org.ibex.tool.Compiler [options] ..."); @@ -132,6 +141,7 @@ public class Compiler { private File builddir = null; private boolean buildzip = false; + private boolean keepzip = false; private ZipOutputStream jarfile = null; private String mainclass = null; @@ -157,9 +167,10 @@ public class Compiler { } public void setMainClass(String mainclass) { this.mainclass = mainclass; } - public void setBuildJar(String dir) throws IOException { + public void setBuildJar(String dir, boolean keepjar) throws IOException { builddir = new File(dir == null ? "." : dir); buildzip = true; + if (keepjar) keepzip = true; } public void setBuildDir(String dir) throws IOException { builddir = new File(dir == null ? "." : dir); @@ -191,14 +202,24 @@ public class Compiler { public void setVeryVerbose(boolean v) { veryverbose = v; } public void setWarnings(boolean w) { warnings = w; } - public void compile() throws IOException { + ZipInputStream keptzip = null; + + public boolean compile() throws IOException { List s = new ArrayList(); if (buildzip) { + if (keepzip) { + File f = builddir; + if (f.exists()) { + keptzip = new ZipInputStream(new FileInputStream(f)); + f.delete(); + } + } Manifest m = new Manifest(); m.getMainAttributes().putValue("Manifest-Version", "1.0"); if (mainclass != null) m.getMainAttributes().putValue("Main-Class", mainclass); jarfile = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(builddir)), m); + entries.add("META-INF/MANIFEST.MF"); } for (int i=0; i < sourcedirs.length; i++) { File src = new File(sourcedirs[i]); @@ -234,12 +255,29 @@ public class Compiler { if (warnings && !hasErrors) { out.write(w.toString()); out.flush(); } warn = null; try { - if (jarfile != null) jarfile.close(); + if (jarfile != null) { + if (keptzip != null) { + byte[] buf = new byte[1024 * 16]; + for(ZipEntry ze = keptzip.getNextEntry(); ze != null; ze = keptzip.getNextEntry()) { + if (entries.contains(ze.getName())) continue; + message(" preserving: " + ze.getName()); + jarfile.putNextEntry(ze); + while(true) { + int numread = keptzip.read(buf, 0, buf.length); + if (numread == -1) break; + jarfile.write(buf, 0, numread); + } + } + } + jarfile.close(); + } } catch (Exception e) { e.printStackTrace(); } if (verbose) System.out.print(clearing + " \r"); + return hasErrors; } + List entries = new ArrayList(); private final FilenameFilter filterSrcs = new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".java"); } @@ -362,7 +400,7 @@ public class Compiler { // Compiler Parameters //////////////////////////////////////////////////// // FEATURE: may be able to use this to block access to APIs generated for stack objects - final AccessRestriction access = new AccessRestriction(null, null, null, null); + final AccessRestriction access = null; /** Used by compiler to resolve classes. */ final INameEnvironment env = new INameEnvironment() { @@ -379,6 +417,7 @@ public class Compiler { bytes(c), (str(p, '/') + '/' + classname).toCharArray())); return new NameEnvironmentAnswer(b, access); } catch (ClassNotFoundException e) { + } catch (LinkageError e) { } catch (ClassFormatException e) { e.printStackTrace(); throw new Error("ClassFormatException reading system class: " + @@ -410,8 +449,8 @@ public class Compiler { } } } catch (ClassFormatException e) { - System.out.println("Unexpected ClassFormatException"); // FIXME - e.printStackTrace(); return null; + e.printStackTrace(); + throw new Error("unexpected ClassFormatException resolving compiled class: "+e); } if (veryverbose) System.out.println(" not found"); return null; @@ -478,15 +517,13 @@ public class Compiler { pct = "(" + pct + "%) "; */ String printme = " writing: " + pct + str(pack(name),'.') + "." + new String(name(name)); - if (clearing.length() < printme.length()) clearing = ""; - else clearing = clearing.substring(printme.length()); - System.out.print(printme + clearing + "\r"); - for(clearing = ""; clearing.length() < printme.length() + 5; clearing += " "); + message(printme); } if (buildzip) { try { jarfile.putNextEntry(new ZipEntry(str(pack(name), '/') + "/" + new String(name(name)) + ".class")); jarfile.write(c[i].getBytes()); + entries.add(str(pack(name), '/') + "/" + new String(name(name)) + ".class"); } catch (java.util.zip.ZipException ze) { // HACK: horrendous hack if (ze.getMessage().indexOf("duplicate entry") != -1) { @@ -513,8 +550,15 @@ public class Compiler { } }; + public static void message(String printme) { + if (clearing.length() < printme.length()) clearing = ""; + else clearing = clearing.substring(printme.length()); + System.out.print(printme + clearing + "\r"); + for(clearing = ""; clearing.length() < printme.length() + 5; clearing += " "); + } + int percent = 0; - String clearing = ""; + static String clearing = ""; /** Problem creater for compiler. */ private final IProblemFactory problems = new DefaultProblemFactory();