aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
authorGravatar Laurent Le Brun <laurentlb@google.com>2015-09-11 12:22:14 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-09-11 12:42:20 +0000
commit36bc3285b751be366a84f113ff0eda0e8bfe61a2 (patch)
treea296ab1f4a9248140a026fb5778ff785e0b8882f /tools
parent31e251e14d6a49ef52e94e8f05b8f3b7d57ee765 (diff)
Scala rules: Implement scala_binary
-- MOS_MIGRATED_REVID=102837474
Diffstat (limited to 'tools')
-rw-r--r--tools/build_defs/scala/README.md17
-rw-r--r--tools/build_defs/scala/scala.bzl64
-rw-r--r--tools/build_defs/scala/test/BUILD28
-rw-r--r--tools/build_defs/scala/test/HelloLib.scala1
-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.java22
-rw-r--r--tools/build_defs/scala/test/ScalaBinary.scala7
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");
+ }
+}