aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/build_rules/java_rules_skylark.bzl
diff options
context:
space:
mode:
Diffstat (limited to 'tools/build_rules/java_rules_skylark.bzl')
-rw-r--r--tools/build_rules/java_rules_skylark.bzl392
1 files changed, 201 insertions, 191 deletions
diff --git a/tools/build_rules/java_rules_skylark.bzl b/tools/build_rules/java_rules_skylark.bzl
index ec103830d2..50a657728e 100644
--- a/tools/build_rules/java_rules_skylark.bzl
+++ b/tools/build_rules/java_rules_skylark.bzl
@@ -20,177 +20,183 @@ srcjar_filetype = FileType([".jar", ".srcjar"])
# production ready.
def java_library_impl(ctx):
- javac_options = ctx.fragments.java.default_javac_flags
- class_jar = ctx.outputs.class_jar
- compile_time_jars = depset(order="topological")
- runtime_jars = depset(order="topological")
- for dep in ctx.attr.deps:
- compile_time_jars += dep.compile_time_jars
- runtime_jars += dep.runtime_jars
-
- jars = jar_filetype.filter(ctx.files.jars)
- neverlink_jars = jar_filetype.filter(ctx.files.neverlink_jars)
- compile_time_jars += jars + neverlink_jars
- runtime_jars += jars
- compile_time_jars_list = list(compile_time_jars) # TODO: This is weird.
-
- build_output = class_jar.path + ".build_output"
- java_output = class_jar.path + ".build_java"
- javalist_output = class_jar.path + ".build_java_list"
- sources = ctx.files.srcs
-
- sources_param_file = ctx.new_file(ctx.bin_dir, class_jar, "-2.params")
- ctx.file_action(
- output = sources_param_file,
- content = cmd_helper.join_paths("\n", depset(sources)),
- executable = False)
-
- # Cleaning build output directory
- cmd = "set -e;rm -rf " + build_output + " " + java_output + " " + javalist_output + "\n"
- cmd += "mkdir " + build_output + " " + java_output + "\n"
- files = " @" + sources_param_file.path
-
- if ctx.files.srcjars:
- files += " @" + javalist_output
- for file in ctx.files.srcjars:
- cmd += "%s tf %s | grep '\.java$' | sed 's|^|%s/|' >> %s\n" % (ctx.file._jar.path, file.path, java_output, javalist_output)
- cmd += "unzip %s -d %s >/dev/null\n" % (file.path, java_output)
-
- if ctx.files.srcs or ctx.files.srcjars:
- cmd += ctx.file._javac.path
- cmd += " " + " ".join(javac_options)
- if compile_time_jars:
- cmd += " -classpath '" + cmd_helper.join_paths(ctx.configuration.host_path_separator, compile_time_jars) + "'"
- cmd += " -d " + build_output + files + "\n"
-
- # We haven't got a good story for where these should end up, so
- # stick them in the root of the jar.
- for r in ctx.files.resources:
- cmd += "cp %s %s\n" % (r.path, build_output)
- cmd += (ctx.file._jar.path + " cf " + class_jar.path + " -C " + build_output + " .\n" +
- "touch " + build_output + "\n")
- ctx.action(
- inputs = (sources + compile_time_jars_list + [sources_param_file] +
- [ctx.file._jar] + ctx.files._jdk + ctx.files.resources + ctx.files.srcjars),
- outputs = [class_jar],
- mnemonic='JavacBootstrap',
- command=cmd,
- use_default_shell_env=True)
-
- runfiles = ctx.runfiles(collect_data = True)
-
- return struct(files = depset([class_jar]),
- compile_time_jars = compile_time_jars + [class_jar],
- runtime_jars = runtime_jars + [class_jar],
- runfiles = runfiles)
-
+ javac_options = ctx.fragments.java.default_javac_flags
+ class_jar = ctx.outputs.class_jar
+ compile_time_jars = depset(order = "topological")
+ runtime_jars = depset(order = "topological")
+ for dep in ctx.attr.deps:
+ compile_time_jars += dep.compile_time_jars
+ runtime_jars += dep.runtime_jars
+
+ jars = jar_filetype.filter(ctx.files.jars)
+ neverlink_jars = jar_filetype.filter(ctx.files.neverlink_jars)
+ compile_time_jars += jars + neverlink_jars
+ runtime_jars += jars
+ compile_time_jars_list = list(compile_time_jars) # TODO: This is weird.
+
+ build_output = class_jar.path + ".build_output"
+ java_output = class_jar.path + ".build_java"
+ javalist_output = class_jar.path + ".build_java_list"
+ sources = ctx.files.srcs
+
+ sources_param_file = ctx.new_file(ctx.bin_dir, class_jar, "-2.params")
+ ctx.file_action(
+ output = sources_param_file,
+ content = cmd_helper.join_paths("\n", depset(sources)),
+ executable = False,
+ )
+
+ # Cleaning build output directory
+ cmd = "set -e;rm -rf " + build_output + " " + java_output + " " + javalist_output + "\n"
+ cmd += "mkdir " + build_output + " " + java_output + "\n"
+ files = " @" + sources_param_file.path
+
+ if ctx.files.srcjars:
+ files += " @" + javalist_output
+ for file in ctx.files.srcjars:
+ cmd += "%s tf %s | grep '\.java$' | sed 's|^|%s/|' >> %s\n" % (ctx.file._jar.path, file.path, java_output, javalist_output)
+ cmd += "unzip %s -d %s >/dev/null\n" % (file.path, java_output)
+
+ if ctx.files.srcs or ctx.files.srcjars:
+ cmd += ctx.file._javac.path
+ cmd += " " + " ".join(javac_options)
+ if compile_time_jars:
+ cmd += " -classpath '" + cmd_helper.join_paths(ctx.configuration.host_path_separator, compile_time_jars) + "'"
+ cmd += " -d " + build_output + files + "\n"
+
+ # We haven't got a good story for where these should end up, so
+ # stick them in the root of the jar.
+ for r in ctx.files.resources:
+ cmd += "cp %s %s\n" % (r.path, build_output)
+ cmd += (ctx.file._jar.path + " cf " + class_jar.path + " -C " + build_output + " .\n" +
+ "touch " + build_output + "\n")
+ ctx.action(
+ inputs = (sources + compile_time_jars_list + [sources_param_file] +
+ [ctx.file._jar] + ctx.files._jdk + ctx.files.resources + ctx.files.srcjars),
+ outputs = [class_jar],
+ mnemonic = "JavacBootstrap",
+ command = cmd,
+ use_default_shell_env = True,
+ )
+
+ runfiles = ctx.runfiles(collect_data = True)
+
+ return struct(
+ files = depset([class_jar]),
+ compile_time_jars = compile_time_jars + [class_jar],
+ runtime_jars = runtime_jars + [class_jar],
+ runfiles = runfiles,
+ )
def java_binary_impl(ctx):
- library_result = java_library_impl(ctx)
-
- deploy_jar = ctx.outputs.deploy_jar
- manifest = ctx.outputs.manifest
- build_output = deploy_jar.path + ".build_output"
- main_class = ctx.attr.main_class
- ctx.file_action(
- output = manifest,
- content = "Main-Class: " + main_class + "\n",
- executable = False)
-
- # Cleaning build output directory
- cmd = "set -e;rm -rf " + build_output + ";mkdir " + build_output + "\n"
- for jar in library_result.runtime_jars:
- cmd += "unzip -qn " + jar.path + " -d " + build_output + "\n"
- cmd += (ctx.file._jar.path + " cmf " + manifest.path + " " +
- deploy_jar.path + " -C " + build_output + " .\n" +
- "touch " + build_output + "\n")
-
- ctx.action(
- inputs=list(library_result.runtime_jars) + [manifest] + ctx.files._jdk,
- outputs=[deploy_jar],
- mnemonic='Deployjar',
- command=cmd,
- use_default_shell_env=True)
-
- # Write the wrapper.
- executable = ctx.outputs.executable
- ctx.file_action(
- output = executable,
- content = '\n'.join([
- "#!/bin/bash",
- "# autogenerated - do not edit.",
- "case \"$0\" in",
- "/*) self=\"$0\" ;;",
- "*) self=\"$PWD/$0\";;",
- "esac",
- "",
- "if [[ -z \"$JAVA_RUNFILES\" ]]; then",
- " if [[ -e \"${self}.runfiles\" ]]; then",
- " export JAVA_RUNFILES=\"${self}.runfiles\"",
- " fi",
- " if [[ -n \"$JAVA_RUNFILES\" ]]; then",
- " export TEST_SRCDIR=${TEST_SRCDIR:-$JAVA_RUNFILES}",
- " fi",
- "fi",
- "",
-
- "jvm_bin=%s" % (ctx.file._java.path),
- "if [[ ! -x ${jvm_bin} ]]; then",
- " jvm_bin=$(which java)",
- "fi",
-
- # We extract the .so into a temp dir. If only we could mmap
- # directly from the zip file.
- "DEPLOY=$(dirname $self)/$(basename %s)" % deploy_jar.path,
-
- # This works both on Darwin and Linux, with the darwin path
- # looking like tmp.XXXXXXXX.{random}
- "SO_DIR=$(mktemp -d -t tmp.XXXXXXXXX)",
- "function cleanup() {",
- " rm -rf ${SO_DIR}",
- "}",
- "trap cleanup EXIT",
- "unzip -q -d ${SO_DIR} ${DEPLOY} \"*.so\" \"*.dll\" \"*.dylib\" >& /dev/null",
- ("${jvm_bin} -Djava.library.path=${SO_DIR} %s -jar $DEPLOY \"$@\""
- % ' '.join(ctx.attr.jvm_flags)) ,
- "",
+ library_result = java_library_impl(ctx)
+
+ deploy_jar = ctx.outputs.deploy_jar
+ manifest = ctx.outputs.manifest
+ build_output = deploy_jar.path + ".build_output"
+ main_class = ctx.attr.main_class
+ ctx.file_action(
+ output = manifest,
+ content = "Main-Class: " + main_class + "\n",
+ executable = False,
+ )
+
+ # Cleaning build output directory
+ cmd = "set -e;rm -rf " + build_output + ";mkdir " + build_output + "\n"
+ for jar in library_result.runtime_jars:
+ cmd += "unzip -qn " + jar.path + " -d " + build_output + "\n"
+ cmd += (ctx.file._jar.path + " cmf " + manifest.path + " " +
+ deploy_jar.path + " -C " + build_output + " .\n" +
+ "touch " + build_output + "\n")
+
+ ctx.action(
+ inputs = list(library_result.runtime_jars) + [manifest] + ctx.files._jdk,
+ outputs = [deploy_jar],
+ mnemonic = "Deployjar",
+ command = cmd,
+ use_default_shell_env = True,
+ )
+
+ # Write the wrapper.
+ executable = ctx.outputs.executable
+ ctx.file_action(
+ output = executable,
+ content = "\n".join([
+ "#!/bin/bash",
+ "# autogenerated - do not edit.",
+ "case \"$0\" in",
+ "/*) self=\"$0\" ;;",
+ "*) self=\"$PWD/$0\";;",
+ "esac",
+ "",
+ "if [[ -z \"$JAVA_RUNFILES\" ]]; then",
+ " if [[ -e \"${self}.runfiles\" ]]; then",
+ " export JAVA_RUNFILES=\"${self}.runfiles\"",
+ " fi",
+ " if [[ -n \"$JAVA_RUNFILES\" ]]; then",
+ " export TEST_SRCDIR=${TEST_SRCDIR:-$JAVA_RUNFILES}",
+ " fi",
+ "fi",
+ "",
+ "jvm_bin=%s" % (ctx.file._java.path),
+ "if [[ ! -x ${jvm_bin} ]]; then",
+ " jvm_bin=$(which java)",
+ "fi",
+
+ # We extract the .so into a temp dir. If only we could mmap
+ # directly from the zip file.
+ "DEPLOY=$(dirname $self)/$(basename %s)" % deploy_jar.path,
+
+ # This works both on Darwin and Linux, with the darwin path
+ # looking like tmp.XXXXXXXX.{random}
+ "SO_DIR=$(mktemp -d -t tmp.XXXXXXXXX)",
+ "function cleanup() {",
+ " rm -rf ${SO_DIR}",
+ "}",
+ "trap cleanup EXIT",
+ "unzip -q -d ${SO_DIR} ${DEPLOY} \"*.so\" \"*.dll\" \"*.dylib\" >& /dev/null",
+ ("${jvm_bin} -Djava.library.path=${SO_DIR} %s -jar $DEPLOY \"$@\"" %
+ " ".join(ctx.attr.jvm_flags)),
+ "",
]),
- executable = True)
-
- runfiles = ctx.runfiles(files = [deploy_jar, executable] + ctx.files._jdk, collect_data = True)
- files_to_build = depset([deploy_jar, manifest, executable])
- files_to_build += library_result.files
+ executable = True,
+ )
- return struct(files = files_to_build, runfiles = runfiles)
+ runfiles = ctx.runfiles(files = [deploy_jar, executable] + ctx.files._jdk, collect_data = True)
+ files_to_build = depset([deploy_jar, manifest, executable])
+ files_to_build += library_result.files
+ return struct(files = files_to_build, runfiles = runfiles)
def java_import_impl(ctx):
- # TODO(bazel-team): Why do we need to filter here? The attribute
- # already says only jars are allowed.
- jars = depset(jar_filetype.filter(ctx.files.jars))
- neverlink_jars = depset(jar_filetype.filter(ctx.files.neverlink_jars))
- runfiles = ctx.runfiles(collect_data = True)
- return struct(files = jars,
- compile_time_jars = jars + neverlink_jars,
- runtime_jars = jars,
- runfiles = runfiles)
-
+ # TODO(bazel-team): Why do we need to filter here? The attribute
+ # already says only jars are allowed.
+ jars = depset(jar_filetype.filter(ctx.files.jars))
+ neverlink_jars = depset(jar_filetype.filter(ctx.files.neverlink_jars))
+ runfiles = ctx.runfiles(collect_data = True)
+ return struct(
+ files = jars,
+ compile_time_jars = jars + neverlink_jars,
+ runtime_jars = jars,
+ runfiles = runfiles,
+ )
java_library_attrs = {
- "_java": attr.label(default=Label("//tools/jdk:java"), single_file=True),
- "_javac": attr.label(default=Label("//tools/jdk:javac"), single_file=True),
- "_jar": attr.label(default=Label("//tools/jdk:jar"), single_file=True),
- "_jdk": attr.label(default=Label("//tools/jdk:jdk"), allow_files=True),
- "data": attr.label_list(allow_files=True, cfg="data"),
- "resources": attr.label_list(allow_files=True),
- "srcs": attr.label_list(allow_files=java_filetype),
- "jars": attr.label_list(allow_files=jar_filetype),
- "neverlink_jars": attr.label_list(allow_files=jar_filetype),
- "srcjars": attr.label_list(allow_files=srcjar_filetype),
+ "_java": attr.label(default = Label("//tools/jdk:java"), single_file = True),
+ "_javac": attr.label(default = Label("//tools/jdk:javac"), single_file = True),
+ "_jar": attr.label(default = Label("//tools/jdk:jar"), single_file = True),
+ "_jdk": attr.label(default = Label("//tools/jdk:jdk"), allow_files = True),
+ "data": attr.label_list(allow_files = True, cfg = "data"),
+ "resources": attr.label_list(allow_files = True),
+ "srcs": attr.label_list(allow_files = java_filetype),
+ "jars": attr.label_list(allow_files = jar_filetype),
+ "neverlink_jars": attr.label_list(allow_files = jar_filetype),
+ "srcjars": attr.label_list(allow_files = srcjar_filetype),
"deps": attr.label_list(
- allow_files=False,
- providers = ["compile_time_jars", "runtime_jars"]),
- }
+ allow_files = False,
+ providers = ["compile_time_jars", "runtime_jars"],
+ ),
+}
java_library = rule(
java_library_impl,
@@ -198,7 +204,7 @@ java_library = rule(
outputs = {
"class_jar": "lib%{name}.jar",
},
- fragments = ['java', 'cpp'],
+ fragments = ["java", "cpp"],
)
# A copy to avoid conflict with native rule.
@@ -208,56 +214,60 @@ bootstrap_java_library = rule(
outputs = {
"class_jar": "lib%{name}.jar",
},
- fragments = ['java'],
+ fragments = ["java"],
)
java_binary_attrs_common = dict(java_library_attrs)
java_binary_attrs_common.update({
"jvm_flags": attr.string_list(),
- "jvm": attr.label(default=Label("//tools/jdk:jdk"), allow_files=True),
+ "jvm": attr.label(default = Label("//tools/jdk:jdk"), allow_files = True),
})
java_binary_attrs = dict(java_binary_attrs_common)
-java_binary_attrs["main_class"] = attr.string(mandatory=True)
+java_binary_attrs["main_class"] = attr.string(mandatory = True)
java_binary_outputs = {
"class_jar": "lib%{name}.jar",
"deploy_jar": "%{name}_deploy.jar",
- "manifest": "%{name}_MANIFEST.MF"
+ "manifest": "%{name}_MANIFEST.MF",
}
-java_binary = rule(java_binary_impl,
- executable = True,
- attrs = java_binary_attrs,
- outputs = java_binary_outputs,
- fragments = ['java', 'cpp'],
+java_binary = rule(
+ java_binary_impl,
+ executable = True,
+ attrs = java_binary_attrs,
+ outputs = java_binary_outputs,
+ fragments = ["java", "cpp"],
)
# A copy to avoid conflict with native rule
-bootstrap_java_binary = rule(java_binary_impl,
- executable = True,
- attrs = java_binary_attrs,
- outputs = java_binary_outputs,
- fragments = ['java'],
+bootstrap_java_binary = rule(
+ java_binary_impl,
+ executable = True,
+ attrs = java_binary_attrs,
+ outputs = java_binary_outputs,
+ fragments = ["java"],
)
-java_test = rule(java_binary_impl,
- executable = True,
- attrs = dict(java_binary_attrs_common.items() + [
- ("main_class", attr.string(default="org.junit.runner.JUnitCore")),
- # TODO(bazel-team): it would be better if we could offer a
- # test_class attribute, but the "args" attribute is hard
- # coded in the bazel infrastructure.
- ]),
- outputs = java_binary_outputs,
- test = True,
- fragments = ['java', 'cpp'],
+java_test = rule(
+ java_binary_impl,
+ executable = True,
+ attrs = dict(java_binary_attrs_common.items() + [
+ ("main_class", attr.string(default = "org.junit.runner.JUnitCore")),
+ # TODO(bazel-team): it would be better if we could offer a
+ # test_class attribute, but the "args" attribute is hard
+ # coded in the bazel infrastructure.
+ ]),
+ outputs = java_binary_outputs,
+ test = True,
+ fragments = ["java", "cpp"],
)
java_import = rule(
java_import_impl,
attrs = {
- "jars": attr.label_list(allow_files=jar_filetype),
- "srcjar": attr.label(allow_files=srcjar_filetype),
- "neverlink_jars": attr.label_list(allow_files=jar_filetype, default=[]),
- })
+ "jars": attr.label_list(allow_files = jar_filetype),
+ "srcjar": attr.label(allow_files = srcjar_filetype),
+ "neverlink_jars": attr.label_list(allow_files = jar_filetype, default = []),
+ },
+)