diff options
author | 2015-09-11 12:22:14 +0000 | |
---|---|---|
committer | 2015-09-11 12:42:20 +0000 | |
commit | 36bc3285b751be366a84f113ff0eda0e8bfe61a2 (patch) | |
tree | a296ab1f4a9248140a026fb5778ff785e0b8882f /tools | |
parent | 31e251e14d6a49ef52e94e8f05b8f3b7d57ee765 (diff) |
Scala rules: Implement scala_binary
--
MOS_MIGRATED_REVID=102837474
Diffstat (limited to 'tools')
-rw-r--r-- | tools/build_defs/scala/README.md | 17 | ||||
-rw-r--r-- | tools/build_defs/scala/scala.bzl | 64 | ||||
-rw-r--r-- | tools/build_defs/scala/test/BUILD | 28 | ||||
-rw-r--r-- | tools/build_defs/scala/test/HelloLib.scala | 1 | ||||
-rw-r--r-- | tools/build_defs/scala/test/JavaBinary.java (renamed from tools/build_defs/scala/test/Hello.java) | 2 | ||||
-rw-r--r-- | tools/build_defs/scala/test/OtherJavaLib.java | 22 | ||||
-rw-r--r-- | tools/build_defs/scala/test/ScalaBinary.scala | 7 |
7 files changed, 123 insertions, 18 deletions
diff --git a/tools/build_defs/scala/README.md b/tools/build_defs/scala/README.md index be8ede2e1d..2a0287812b 100644 --- a/tools/build_defs/scala/README.md +++ b/tools/build_defs/scala/README.md @@ -2,16 +2,23 @@ ## Overview -This rule is used for building [Scala][scala] projects with Bazel. There is -currently only one rule, `scala_library`. More features will be added in the -future, e.g. `scala_binary`, `scala_test`, etc. +This rule is used for building [Scala][scala] projects with Bazel. There are +currently two rules, `scala_library` and `scala_binary`. More features will be +added in the future, e.g. `scala_test`. [scala]: http://www.scala-lang.org/ ### `scala_library` -`scala_library` generates a `.jar` file from `.scala` source files. In order to -make a java rule use this jar file, use the `java_import` rule. +`scala_library` generates a `.jar` file from `.scala` source files. +In order to make a java rule use this jar file, use the `java_import` rule. The current implementation assumes that the files `/usr/bin/scalac` and `/usr/share/java/scala-library.jar` exist. + +### `scala_binary` + +`scala_binary` generates a Scala executable. It may depend on `scala_library` +and `java_library` rules. + +A `scala_binary` requires a `main_class` attribute. diff --git a/tools/build_defs/scala/scala.bzl b/tools/build_defs/scala/scala.bzl index 0f23bb1ea3..222573db8f 100644 --- a/tools/build_defs/scala/scala.bzl +++ b/tools/build_defs/scala/scala.bzl @@ -23,8 +23,9 @@ _scalac_path = "/usr/bin/scalac" def _compile(ctx, jars): cmd = """ +set -e mkdir -p {out}_tmp -{scalac} -classpath "{jars}" $@ -d {out}_tmp && +{scalac} -classpath "{jars}" $@ -d {out}_tmp # Make jar file deterministic by setting the timestamp of files touch -t 198001010000 $(find .) jar cmf {manifest} {out} -C {out}_tmp . @@ -33,7 +34,7 @@ jar cmf {manifest} {out} -C {out}_tmp . scalac=_scalac_path, out=ctx.outputs.jar.path, manifest=ctx.outputs.manifest.path, - jars=':'.join([j.path for j in jars])) + jars=":".join([j.path for j in jars])) ctx.action( inputs=list(jars) + ctx.files.srcs + [ctx.outputs.manifest], @@ -54,6 +55,20 @@ def _write_manifest(ctx): content = manifest) +def _write_launcher(ctx, jars): + content = """#!/bin/bash +cd $0.runfiles +java -cp {cp} {name} "$@" +""" + content = content.format( + name=ctx.attr.main_class, + deploy_jar=ctx.outputs.jar.path, + cp=":".join([j.short_path for j in jars])) + ctx.file_action( + output=ctx.outputs.executable, + content=content) + + def _collect_jars(ctx): jars = set() for target in ctx.attr.deps: @@ -69,21 +84,55 @@ def _scala_library_impl(ctx): _write_manifest(ctx) _compile(ctx, jars) - all_jars = jars + [ctx.outputs.jar] + jars += [ctx.outputs.jar] + runfiles = ctx.runfiles( + files = list(jars), + collect_data = True) + return struct( + files=jars, + jar_files=jars, + runfiles=runfiles) + + +def _scala_binary_impl(ctx): + jars = _collect_jars(ctx) + _write_manifest(ctx) + _compile(ctx, jars) + + jars += [ctx.outputs.jar] + _write_launcher(ctx, jars) runfiles = ctx.runfiles( - files = list(all_jars) + [ctx.outputs.jar], + files = list(jars) + [ctx.outputs.executable], collect_data = True) return struct( - files=all_jars, - jar_files=all_jars, + files=set([ctx.outputs.executable]), runfiles=runfiles) scala_library = rule( implementation=_scala_library_impl, attrs={ - "srcs": attr.label_list(allow_files=_scala_filetype), + "main_class": attr.string(), + "srcs": attr.label_list( + allow_files=_scala_filetype, + non_empty=True), + "deps": attr.label_list(), + "data": attr.label_list(allow_files=True, cfg=DATA_CFG), + }, + outputs={ + "jar": "%{name}_deploy.jar", + "manifest": "%{name}_MANIFEST.MF", + }, +) + +scala_binary = rule( + implementation=_scala_binary_impl, + attrs={ + "main_class": attr.string(mandatory=True), + "srcs": attr.label_list( + allow_files=_scala_filetype, + non_empty=True), "deps": attr.label_list(), "data": attr.label_list(allow_files=True, cfg=DATA_CFG), }, @@ -91,4 +140,5 @@ scala_library = rule( "jar": "%{name}_deploy.jar", "manifest": "%{name}_MANIFEST.MF", }, + executable=True, ) diff --git a/tools/build_defs/scala/test/BUILD b/tools/build_defs/scala/test/BUILD index 6eebffb7d1..8e6c47e71d 100644 --- a/tools/build_defs/scala/test/BUILD +++ b/tools/build_defs/scala/test/BUILD @@ -1,9 +1,12 @@ -load("/tools/build_defs/scala/scala", "scala_library") +load("/tools/build_defs/scala/scala", "scala_binary", "scala_library") + +# The examples below show how to combine Scala and Java rules. +# ScalaBinary is the Scala equivalent of JavaBinary. java_binary( - name = "Hello", - srcs = ["Hello.java"], - main_class = "scala.test.Hello", + name = "JavaBinary", + srcs = ["JavaBinary.java"], + main_class = "scala.test.JavaBinary", deps = [":lib_import"], ) @@ -14,13 +17,28 @@ java_import( jars = [":HelloLib"], ) +scala_binary( + name = "ScalaBinary", + srcs = ["ScalaBinary.scala"], + main_class = "scala.test.ScalaBinary", + deps = [":HelloLib"], +) + scala_library( name = "HelloLib", srcs = ["HelloLib.scala"], - deps = ["OtherLib"], + deps = [ + "OtherJavaLib", + "OtherLib", + ], ) scala_library( name = "OtherLib", srcs = ["OtherLib.scala"], ) + +java_library( + name = "OtherJavaLib", + srcs = ["OtherJavaLib.java"], +) diff --git a/tools/build_defs/scala/test/HelloLib.scala b/tools/build_defs/scala/test/HelloLib.scala index afd4ec2f07..88db4546ac 100644 --- a/tools/build_defs/scala/test/HelloLib.scala +++ b/tools/build_defs/scala/test/HelloLib.scala @@ -3,5 +3,6 @@ package scala.test object HelloLib { def printMessage(arg: String) { println(arg + " " + OtherLib.getMessage()) + println(arg + " " + OtherJavaLib.getMessage()) } } diff --git a/tools/build_defs/scala/test/Hello.java b/tools/build_defs/scala/test/JavaBinary.java index 55baa73868..69e8900be8 100644 --- a/tools/build_defs/scala/test/Hello.java +++ b/tools/build_defs/scala/test/JavaBinary.java @@ -15,7 +15,7 @@ package scala.test; /** Example class */ -public class Hello { +public class JavaBinary { public static void main(String[] args) { HelloLib.printMessage("Hello"); } diff --git a/tools/build_defs/scala/test/OtherJavaLib.java b/tools/build_defs/scala/test/OtherJavaLib.java new file mode 100644 index 0000000000..8b5968c69f --- /dev/null +++ b/tools/build_defs/scala/test/OtherJavaLib.java @@ -0,0 +1,22 @@ +// Copyright 2015 Google Inc. All rights reserved. +// +// 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. + +package scala.test; + +/** Example class */ +public class OtherJavaLib { + public static String getMessage() { + return "java!"; + } +} diff --git a/tools/build_defs/scala/test/ScalaBinary.scala b/tools/build_defs/scala/test/ScalaBinary.scala new file mode 100644 index 0000000000..5b023a97de --- /dev/null +++ b/tools/build_defs/scala/test/ScalaBinary.scala @@ -0,0 +1,7 @@ +package scala.test + +object ScalaBinary { + def main(args: Array[String]) { + HelloLib.printMessage("Hello"); + } +} |