gerrit/lib/prolog/java/BuckPrologCompiler.java
Shawn Pearce 4e1a8bc63d Update Buck
Buck changed export_deps from a boolean to be exported_deps, a list of
dependencies that are to be added to deps and also exported.  This
allows libraries to have dependencies for implementation use only, but
not expose them to callers for linkage.

exported_deps aren't transparently transitive anymore.  This mostly
impacts the plugin-api:lib rule.

This is the first time Gerrit is using upstream Buck with no patches.

- Java memory settings for Buck can now be supplied in a project
  specific file using `.buckjavaargs` in the root directory.  The file
  replaces the `.buckrc` previously supported by Gerrit's fork.

- Temporary directories for java_application() invoked from genrule()
  is now supplied as part of the arguments using $TMP.  This removes
  one of the patches Gerrit had for Buck.

- Unit tests use the system temporary directory during testing.  This
  can be faster if the temporary directory is a tmpfs.  Unfortunately
  not all passing tests clean up after themselves, making it possible
  to exhaust system memory and swap with useless tmpfs contents.
  Using the system temporary directory for tests removes another patch
  Gerrit had on top of Buck.

Change-Id: I3a9fe4aab0a33a8673df727e618122027a742638
2013-11-29 10:50:59 -08:00

90 lines
2.6 KiB
Java

// Copyright (C) 2013 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import com.googlecode.prolog_cafe.compiler.CompileException;
import com.googlecode.prolog_cafe.compiler.Compiler;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
public class BuckPrologCompiler {
private static File tmpdir;
public static void main(String[] argv) throws IOException, CompileException {
int i = 0;
tmpdir = new File(argv[i++]);
File out = new File(argv[i++]);
File java = tmpdir("java");
for (; i < argv.length; i++) {
new Compiler().prologToJavaSource(argv[i], java.getPath());
}
jar(out, java);
}
private static File tmpdir(String name) throws IOException {
File d = File.createTempFile(name + "_", "", tmpdir);
if (!d.delete() || !d.mkdir()) {
throw new IOException("Cannot mkdir " + d);
}
return d;
}
private static void jar(File jar, File classes) throws IOException {
File tmp = File.createTempFile("prolog", ".jar", tmpdir);
try {
JarOutputStream out = new JarOutputStream(new FileOutputStream(tmp));
try {
add(out, classes, "");
} finally {
out.close();
}
if (!tmp.renameTo(jar)) {
throw new IOException("Cannot create " + jar);
}
} finally {
tmp.delete();
}
}
private static void add(JarOutputStream out, File classes, String prefix)
throws IOException {
for (String name : classes.list()) {
File f = new File(classes, name);
if (f.isDirectory()) {
add(out, f, prefix + name + "/");
continue;
}
JarEntry e = new JarEntry(prefix + name);
FileInputStream in = new FileInputStream(f);
try {
e.setTime(f.lastModified());
out.putNextEntry(e);
byte[] buf = new byte[16 << 10];
int n;
while (0 < (n = in.read(buf))) {
out.write(buf, 0, n);
}
} finally {
in.close();
out.closeEntry();
}
}
}
}