Update Buck

Latest version of buck is faster than the prior version used by
Gerrit.  No-op updates when loading a debug version of the UI now take
only 1.804s on my laptop (previously 7s) and a draft UI compile is
only 24.659s (previously 39s).

The slow acceptance tests must now be excluded with `--exclude slow`.
Buck changed the meaning of the -e option to be --emulator, which is
unfortunately useful only for Android application developers.

genrule() now needs to use $(exe) to reference the binary to run,
offers $(location) to make it easier to find files in the build tree.

The empty srcs array is no longer required for genrule().  Buck has
determined it is sufficiently powerful with $(location) and deps that
requiring srcs is unnecessary.

Supporting .src.zip files in the srcs array of java_library() means
Gerrit no longer needs to run a separate genrule() to extract files
produced by ANTLR, or call javac inside of the BuckPrologCompiler
support glue.

Change-Id: Ib03042921a081b867a7aad0423bd45523e42917a
This commit is contained in:
Shawn Pearce
2013-07-24 08:09:31 -07:00
parent a7bad77a08
commit 11d27c8ee8
18 changed files with 54 additions and 148 deletions

View File

@@ -1 +1 @@
a3aadacd7c1ccd819420a73975a08ba67110decb 0325c2dbc195dcceb963181fd3683b7d20328734

10
BUCK
View File

@@ -16,7 +16,6 @@ API_DEPS = [
genrule( genrule(
name = 'api', name = 'api',
cmd = '', cmd = '',
srcs = [],
deps = API_DEPS, deps = API_DEPS,
out = '__fake.api__', out = '__fake.api__',
) )
@@ -38,8 +37,7 @@ java_library(
) )
genrule( genrule(
name = 'extension-api-src', name = 'extension-api-src',
cmd = 'ln -s $DEPS $OUT', cmd = 'ln -s $(location //gerrit-extension-api:api-src) $OUT',
srcs = [],
deps = ['//gerrit-extension-api:api-src'], deps = ['//gerrit-extension-api:api-src'],
out = 'extension-api-src.jar', out = 'extension-api-src.jar',
) )
@@ -66,16 +64,14 @@ java_binary(
genrule( genrule(
name = 'download', name = 'download',
cmd = '${//tools:download_all}', cmd = '$(exe //tools:download_all)',
srcs = [],
deps = ['//tools:download_all'], deps = ['//tools:download_all'],
out = '__fake.download__', out = '__fake.download__',
) )
genrule( genrule(
name = 'download_sources', name = 'download_sources',
cmd = '${//tools:download_all} --src', cmd = '$(exe //tools:download_all) --src',
srcs = [],
deps = ['//tools:download_all'], deps = ['//tools:download_all'],
out = '__fake.download__', out = '__fake.download__',
) )

View File

@@ -41,8 +41,7 @@ genasciidoc(
genrule( genrule(
name = 'licenses.txt', name = 'licenses.txt',
cmd = '${:gen_licenses} >$OUT', cmd = '$(exe :gen_licenses) >$OUT',
srcs = [],
deps = [':gen_licenses'] + MAIN, deps = [':gen_licenses'] + MAIN,
out = 'licenses.txt', out = 'licenses.txt',
) )

View File

@@ -47,7 +47,6 @@ def genasciidoc(
genrule( genrule(
name = name, name = name,
cmd = ':>$OUT', cmd = ':>$OUT',
srcs = [],
deps = [':' + o for o in outs], deps = [':' + o for o in outs],
out = name + '__done', out = name + '__done',
visibility = visibility, visibility = visibility,

View File

@@ -191,7 +191,7 @@ To run all tests including acceptance tests:
To exclude slow tests: To exclude slow tests:
---- ----
buck test --all -e slow buck test --all --exclude slow
---- ----

View File

@@ -1,7 +1,3 @@
ANTLR_OUTS = [
'QueryLexer.java',
'QueryParser.java',
]
PARSER_DEPS = [ PARSER_DEPS = [
':query_exception', ':query_exception',
'//lib/antlr:java_runtime', '//lib/antlr:java_runtime',
@@ -16,24 +12,22 @@ java_library(
genantlr( genantlr(
name = 'query_antlr', name = 'query_antlr',
srcs = ['src/main/antlr3/com/google/gerrit/server/query/Query.g'], srcs = ['src/main/antlr3/com/google/gerrit/server/query/Query.g'],
outs = ANTLR_OUTS, out = 'query_antlr.src.zip',
)
java_library(
name = 'lib',
srcs = [genfile('query_antlr.src.zip')],
deps = PARSER_DEPS + [':query_antlr'],
) )
# Hack necessary to expose ANTLR generated code as JAR to Eclipse. # Hack necessary to expose ANTLR generated code as JAR to Eclipse.
java_library(
name = 'lib',
srcs = [genfile(f) for f in ANTLR_OUTS],
deps = PARSER_DEPS + [':' + f for f in ANTLR_OUTS],
)
genrule( genrule(
name = 'query_link', name = 'query_link',
cmd = 'ln -s $SRCS $OUT', cmd = 'ln -s $(location :lib) $OUT',
srcs = [genfile('lib__lib__output/lib.jar')],
deps = [':lib'], deps = [':lib'],
out = 'query_parser.jar', out = 'query_parser.jar',
) )
prebuilt_jar( prebuilt_jar(
name = 'query_parser', name = 'query_parser',
binary_jar = genfile('query_parser.jar'), binary_jar = genfile('query_parser.jar'),

View File

@@ -53,7 +53,6 @@ def git_describe():
genrule( genrule(
name = 'git_describe', name = 'git_describe',
cmd = 'mkdir -p $(dirname $OUT); echo "%s" >$OUT' % git_describe(), cmd = 'mkdir -p $(dirname $OUT); echo "%s" >$OUT' % git_describe(),
srcs = [],
out = VER, out = VER,
) )

View File

@@ -100,5 +100,6 @@ java_test(
'//lib/jgit:jgit', '//lib/jgit:jgit',
], ],
source_under_test = [':ui_module'], source_under_test = [':ui_module'],
vm_args = ['-Xmx512m'],
visibility = ['//tools/eclipse:classpath'], visibility = ['//tools/eclipse:classpath'],
) )

View File

@@ -52,17 +52,19 @@ def gwt_user_agent_permutations(
"<set-property name='locale' value='default'/>", "<set-property name='locale' value='default'/>",
"</module>", "</module>",
]) ])
gwt = 'resources/%s_%s.gwt.xml' % (module_target.replace('.', '/'), ua) gwt = '%s_%s.gwt.xml' % (module_target.replace('.', '/'), ua)
jar = '%s_%s.gwtxml.jar' % (name, ua)
genrule( genrule(
name = '%s_%s_gwtxml_gen' % (name, ua), name = '%s_%s_gwtxml_gen' % (name, ua),
cmd = 'mkdir -p $(dirname $OUT);echo "%s">$OUT' % xml, cmd = 'cd $TMP;' +
srcs = [], ('mkdir -p $(dirname %s);' % gwt) +
deps = [], ('echo "%s">%s;' % (xml, gwt)) +
out = gwt, 'zip -qr $OUT .',
out = jar,
) )
java_library( prebuilt_jar(
name = '%s_%s_gwtxml_lib' % (name, ua), name = '%s_%s_gwtxml_lib' % (name, ua),
resources = [genfile(gwt)], binary_jar = genfile(jar),
deps = [':%s_%s_gwtxml_gen' % (name, ua)], deps = [':%s_%s_gwtxml_gen' % (name, ua)],
) )
gwt_application( gwt_application(

View File

@@ -37,7 +37,7 @@ genrule(
genrule( genrule(
name = 'log4j-config__jar', name = 'log4j-config__jar',
cmd = 'jar cf $OUT -C $(dirname $SRCS) .', cmd = 'jar cf $OUT -C $SRCDIR/src/main/resources .',
srcs = ['src/main/resources/log4j.properties'], srcs = ['src/main/resources/log4j.properties'],
out = 'log4j-config.jar', out = 'log4j-config.jar',
) )

View File

@@ -33,11 +33,10 @@ genrule(
genrule( genrule(
name = 'download', name = 'download',
cmd = '${//tools:download_file}' + cmd = '$(exe //tools:download_file)' +
' -o $OUT' + ' -o $OUT' +
' -u ' + URL + ' -u ' + URL +
' -v ' + SHA1, ' -v ' + SHA1,
srcs = [],
deps = ['//tools:download_file'], deps = ['//tools:download_file'],
out = 'codemirror-' + VERSION + '.zip', out = 'codemirror-' + VERSION + '.zip',
) )

View File

@@ -62,7 +62,7 @@ def maven_jar(
srcjar = jar + '-src.jar' srcjar = jar + '-src.jar'
srcurl = url + '-sources.jar' srcurl = url + '-sources.jar'
cmd = ['${//tools:download_file}', '-o', '$OUT', '-u', binurl] cmd = ['$(exe //tools:download_file)', '-o', '$OUT', '-u', binurl]
if sha1: if sha1:
cmd.extend(['-v', sha1]) cmd.extend(['-v', sha1])
elif bin_sha1: elif bin_sha1:
@@ -75,20 +75,18 @@ def maven_jar(
genrule( genrule(
name = name + '__download_bin', name = name + '__download_bin',
cmd = ' '.join(cmd), cmd = ' '.join(cmd),
srcs = [],
deps = ['//tools:download_file'], deps = ['//tools:download_file'],
out = binjar, out = binjar,
) )
license = ['//lib:LICENSE-' + license] license = ['//lib:LICENSE-' + license]
if src_sha1 or attach_source: if src_sha1 or attach_source:
cmd = ['${//tools:download_file}', '-o', '$OUT', '-u', srcurl] cmd = ['$(exe //tools:download_file)', '-o', '$OUT', '-u', srcurl]
if src_sha1: if src_sha1:
cmd.extend(['-v', src_sha1]) cmd.extend(['-v', src_sha1])
genrule( genrule(
name = name + '__download_src', name = name + '__download_src',
cmd = ' '.join(cmd), cmd = ' '.join(cmd),
srcs = [],
deps = ['//tools:download_file'], deps = ['//tools:download_file'],
out = srcjar, out = srcjar,
) )
@@ -104,7 +102,6 @@ def maven_jar(
genrule( genrule(
name = name + '__download_src', name = name + '__download_src',
cmd = ':>$OUT', cmd = ':>$OUT',
srcs = [],
out = '__' + name + '__no_src', out = '__' + name + '__no_src',
) )

View File

@@ -18,21 +18,29 @@ def prolog_cafe_library(
deps = [], deps = [],
visibility = []): visibility = []):
genrule( genrule(
name = name + '_prolog2java', name = name + '__pl2j',
cmd = '${//lib/prolog:compiler} $SRCS $DEPS $OUT', cmd = '$(exe //lib/prolog:compiler) $SRCS $DEPS $OUT',
srcs = srcs, srcs = srcs,
deps = ['//lib/prolog:compiler'],
out = name + '.src.zip',
)
java_library(
name = name + '__lib',
srcs = [genfile(name + '.src.zip')],
deps = [ deps = [
'//lib/prolog:compiler', ':' + name + '__pl2j',
'//lib/prolog:prolog-cafe', '//lib/prolog:prolog-cafe',
] + deps, ] + deps,
)
genrule(
name = name + '__ln',
cmd = 'ln -s $(location :%s__lib) $OUT' % name,
deps = [':%s__lib' % name],
out = name + '.jar', out = name + '.jar',
) )
prebuilt_jar( prebuilt_jar(
name = name, name = name,
binary_jar = genfile(name + '.jar'), binary_jar = genfile(name + '.jar'),
deps = [ deps = [':%s__ln' % name],
':' + name + '_prolog2java',
'//lib/prolog:prolog-cafe',
] + deps,
visibility = visibility, visibility = visibility,
) )

View File

@@ -20,19 +20,10 @@ import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream; import java.util.jar.JarOutputStream;
import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class BuckPrologCompiler { public class BuckPrologCompiler {
public static void main(String[] argv) throws IOException, CompileException { public static void main(String[] argv) throws IOException, CompileException {
List<File> srcs = new ArrayList<File>(); List<File> srcs = new ArrayList<File>();
@@ -48,12 +39,10 @@ public class BuckPrologCompiler {
File out = new File(argv[argv.length - 1]); File out = new File(argv[argv.length - 1]);
File java = tmpdir("java"); File java = tmpdir("java");
File classes = tmpdir("classes");
for (File src : srcs) { for (File src : srcs) {
new Compiler().prologToJavaSource(src.getPath(), java.getPath()); new Compiler().prologToJavaSource(src.getPath(), java.getPath());
} }
javac(jars, java, classes); jar(out, java);
jar(out, classes);
} }
private static File tmpdir(String name) throws IOException { private static File tmpdir(String name) throws IOException {
@@ -64,59 +53,11 @@ public class BuckPrologCompiler {
return d; return d;
} }
private static void javac(List<File> cp, File java, File classes)
throws IOException, CompileException {
JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
if (javac == null) {
throw new CompileException("JDK required (running inside of JRE)");
}
DiagnosticCollector<JavaFileObject> d =
new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fm = javac.getStandardFileManager(d, null, null);
try {
StringBuilder classpath = new StringBuilder();
for (File jar : cp) {
if (classpath.length() > 0) {
classpath.append(File.pathSeparatorChar);
}
classpath.append(jar.getPath());
}
ArrayList<String> args = new ArrayList<String>();
args.addAll(Arrays.asList(new String[]{
"-source", "6",
"-target", "6",
"-g:none",
"-nowarn",
"-d", classes.getPath()}));
if (classpath.length() > 0) {
args.add("-classpath");
args.add(classpath.toString());
}
if (!javac.getTask(null, fm, d, args, null,
fm.getJavaFileObjectsFromFiles(find(java, ".java"))).call()) {
StringBuilder msg = new StringBuilder();
for (Diagnostic<? extends JavaFileObject> err : d.getDiagnostics()) {
msg.append('\n').append(err.getKind()).append(": ");
if (err.getSource() != null) {
msg.append(err.getSource().getName());
}
msg.append(':').append(err.getLineNumber()).append(": ");
msg.append(err.getMessage(Locale.getDefault()));
}
throw new CompileException(msg.toString());
}
} finally {
fm.close();
}
}
private static void jar(File jar, File classes) throws IOException { private static void jar(File jar, File classes) throws IOException {
File tmp = File.createTempFile("prolog", ".jar", jar.getParentFile()); File tmp = File.createTempFile("prolog", ".jar", jar.getParentFile());
try { try {
JarOutputStream out = new JarOutputStream(new FileOutputStream(tmp)); JarOutputStream out = new JarOutputStream(new FileOutputStream(tmp));
try { try {
out.setLevel(9);
add(out, classes, ""); add(out, classes, "");
} finally { } finally {
out.close(); out.close();
@@ -154,16 +95,4 @@ public class BuckPrologCompiler {
} }
} }
} }
private static List<File> find(File dir, String extension) {
ArrayList<File> list = new ArrayList<File>();
for (File f : dir.listFiles()) {
if (f.getName().endsWith(extension)) {
list.add(f);
} else if (f.isDirectory()) {
list.addAll(find(f, extension));
}
}
return list;
}
} }

View File

@@ -41,7 +41,6 @@ genrule(
name = 'buck.properties', name = 'buck.properties',
cmd = 'echo buck=`which buck`>$OUT;' + cmd = 'echo buck=`which buck`>$OUT;' +
("echo PATH=\''%s'\' >>$OUT;" % shquote(os_path())), ("echo PATH=\''%s'\' >>$OUT;" % shquote(os_path())),
srcs = [],
deps = [], deps = [],
out = 'buck.properties', out = 'buck.properties',
visibility = ['PUBLIC'], visibility = ['PUBLIC'],

View File

@@ -15,26 +15,17 @@
def genantlr( def genantlr(
name, name,
srcs, srcs,
outs): out):
tmp = name + '.srcjar' tmp = name + '.src.zip'
genrule( genrule(
name = name, name = name,
srcs = srcs, srcs = srcs,
cmd = '${//lib/antlr:antlr-tool} -o $TMP $SRCS;' + cmd = '$(exe //lib/antlr:antlr-tool) -o $TMP $SRCS;' +
'cd $TMP;' + 'cd $TMP;' +
'zip -qr $OUT .', 'zip -qr $OUT .',
deps = ['//lib/antlr:antlr-tool'], deps = ['//lib/antlr:antlr-tool'],
out = tmp, out = out,
) )
for o in outs:
genrule(
name = o,
cmd = 'unzip -qp $SRCS %s >$OUT' % o,
srcs = [genfile(tmp)],
deps = [':' + name],
out = o,
)
def gwt_module( def gwt_module(
name, name,
@@ -61,11 +52,10 @@ def gwt_application(
compiler_jvm_flags = [], compiler_jvm_flags = [],
deps = [], deps = [],
visibility = []): visibility = []):
cmd = ['${//lib/gwt:compiler}', module_target, '$OUT'] cmd = ['$(exe //lib/gwt:compiler)', module_target, '$OUT']
cmd += compiler_opts + ['--', '$DEPS'] cmd += compiler_opts + ['--', '$DEPS']
genrule( genrule(
name = name, name = name,
srcs = [],
cmd = ' '.join(cmd), cmd = ' '.join(cmd),
deps = [ deps = [
'//lib/gwt:compiler', '//lib/gwt:compiler',

View File

@@ -38,7 +38,7 @@ def war(
context = [], context = [],
visibility = [] visibility = []
): ):
cmd = ['${//tools:pack_war}', '-o', '$OUT'] cmd = ['$(exe //tools:pack_war)', '-o', '$OUT']
for l in libs: for l in libs:
cmd.extend(['--lib', l]) cmd.extend(['--lib', l])
for l in pgmlibs: for l in pgmlibs:
@@ -96,7 +96,7 @@ def _maven_util(
deps deps
): ):
cmd = [ cmd = [
'${//tools:maven_deploy}', '$(exe //tools:maven_deploy)',
'-a', name, '-a', name,
'-v', GERRIT_VER, '-v', GERRIT_VER,
'-d', '"$DEPS"' '-d', '"$DEPS"'
@@ -104,7 +104,6 @@ def _maven_util(
genrule( genrule(
name = 'api_%s' % name, name = 'api_%s' % name,
cmd = ' '.join(cmd), cmd = ' '.join(cmd),
srcs = [],
deps = deps + ['//tools:maven_deploy'], deps = deps + ['//tools:maven_deploy'],
out = '__fake.api_%s__' % name out = '__fake.api_%s__' % name
) )

View File

@@ -3,7 +3,6 @@ include_defs('//tools/build.defs')
genrule( genrule(
name = 'eclipse', name = 'eclipse',
cmd = '', cmd = '',
srcs = [],
deps = [ deps = [
':_classpath', ':_classpath',
':_project', ':_project',
@@ -15,7 +14,6 @@ genrule(
genrule( genrule(
name = 'eclipse_project', name = 'eclipse_project',
cmd = '', cmd = '',
srcs = [],
deps = [ deps = [
':_classpath_nocompile', ':_classpath_nocompile',
':_project', ':_project',
@@ -40,16 +38,14 @@ java_library(
genrule( genrule(
name = '_project', name = '_project',
cmd = '${:gen_project} $OUT', cmd = '$(exe :gen_project) $OUT',
srcs = [],
deps = [':gen_project'], deps = [':gen_project'],
out = 'project', out = 'project',
) )
genrule( genrule(
name = '_classpath', name = '_classpath',
cmd = '${:gen_classpath} $OUT $DEPS', cmd = '$(exe :gen_classpath) $OUT $DEPS',
srcs = [],
deps = [ deps = [
':classpath', ':classpath',
':gen_classpath', ':gen_classpath',
@@ -59,8 +55,7 @@ genrule(
genrule( genrule(
name = '_classpath_nocompile', name = '_classpath_nocompile',
cmd = '${:gen_classpath}', cmd = '$(exe :gen_classpath)',
srcs = [],
deps = [':gen_classpath'], deps = [':gen_classpath'],
out = '__fake.eclipse__', out = '__fake.eclipse__',
) )