+// 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.*;
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++) {
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; }
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);
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] <source dir> ...");
private File builddir = null;
private boolean buildzip = false;
+ private boolean keepzip = false;
private ZipOutputStream jarfile = null;
private String mainclass = null;
}
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);
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]);
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"); }
// 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() {
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: " +
}
}
} 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;
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) {
}
};
+ 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();