diff --git a/scala/scala.bzl b/scala/scala.bzl index a942d39a5..d189b7a23 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -166,6 +166,10 @@ EnableIjar: {enableijar} ijarOutput: {ijar_out} ijarCmdPath: {ijar_cmd_path} SourceJars: {srcjars} +JavacPath: {javac_path} +JavacOpts: {javac_opts} +JavaFiles: {java_files} +JvmFlags: {jvm_flags} """.format( out=ctx.outputs.jar.path, # 0 manifest=ctx.outputs.manifest.path, # 1 @@ -177,6 +181,10 @@ SourceJars: {srcjars} ijar_out=ijar_output_path, ijar_cmd_path=ijar_cmd_path, srcjars=",".join([f.path for f in all_srcjars]), + javac_opts=" ".join(ctx.attr.javacopts), + javac_path=ctx.file._javac.path, + java_files=",".join([f.path for f in java_srcs]), + jvm_flags=" ".join(["-J" + flag for flag in ctx.attr.jvm_flags]), ) ctx.file_action(output=scalac_args_file, content=scalac_args) javac_sources_cmd = "" diff --git a/src/java/io/bazel/rulesscala/scalac/CompileOptions.java b/src/java/io/bazel/rulesscala/scalac/CompileOptions.java index 350f8441f..566d05afb 100644 --- a/src/java/io/bazel/rulesscala/scalac/CompileOptions.java +++ b/src/java/io/bazel/rulesscala/scalac/CompileOptions.java @@ -16,6 +16,10 @@ public class CompileOptions { final public boolean iJarEnabled; final public String ijarOutput; final public String ijarCmdPath; + final public String[] javaFiles; + final public String javacPath; + final public String javacOpts; + final public String jvmFlags; public CompileOptions(List args) { Map argMap = buildArgMap(args); @@ -23,12 +27,17 @@ public CompileOptions(List args) { outputName = getOrError(argMap, "JarOutput", "Missing required arg JarOutput"); manifestPath = getOrError(argMap, "Manifest", "Missing required arg Manifest"); - scalaOpts = getOrEmpty(argMap, "ScalacOpts").split(","); + scalaOpts = getCommaList(argMap, "ScalacOpts"); pluginArgs = buildPluginArgs(getOrEmpty(argMap, "Plugins")); classpath = getOrError(argMap, "Classpath", "Must supply the classpath arg"); - files = getOrEmpty(argMap, "Files").split(","); + files = getCommaList(argMap, "Files"); - sourceJars = getOrEmpty(argMap, "SourceJars").split(","); + javaFiles = getCommaList(argMap, "JavaFiles"); + javacPath = getOrEmpty(argMap, "JavacPath"); + javacOpts = getOrEmpty(argMap, "JavacOpts"); + jvmFlags = getOrEmpty(argMap, "JvmFlags"); + + sourceJars = getCommaList(argMap, "SourceJars"); iJarEnabled = booleanGetOrFalse(argMap, "EnableIjar"); if(iJarEnabled) { ijarOutput = getOrError(argMap, "ijarOutput", "Missing required arg ijarOutput when ijar enabled"); @@ -54,6 +63,20 @@ private static HashMap buildArgMap(List lines) { return hm; } + private static String[] getCommaList(Map m, String k) { + if(m.containsKey(k)) { + String v = m.get(k); + if (v == "") { + return new String[]{}; + } + else { + return v.split(","); + } + } else { + return new String[]{}; + } + } + private static String getOrEmpty(Map m, String k) { if(m.containsKey(k)) { return m.get(k); @@ -61,6 +84,7 @@ private static String getOrEmpty(Map m, String k) { return ""; } } + private static String getOrError(Map m, String k, String errorMessage) { if(m.containsKey(k)) { return m.get(k); diff --git a/src/java/io/bazel/rulesscala/scalac/ScalaCInvoker.java b/src/java/io/bazel/rulesscala/scalac/ScalaCInvoker.java index e56406db4..8228e3d46 100644 --- a/src/java/io/bazel/rulesscala/scalac/ScalaCInvoker.java +++ b/src/java/io/bazel/rulesscala/scalac/ScalaCInvoker.java @@ -255,6 +255,37 @@ private static void processRequest(List args) throws Exception { reporter.flush(); throw new RuntimeException("Build failed"); } else { + /** + * See if there are java sources to compile + */ + if (ops.javaFiles.length > 0) { + StringBuilder cmd = new StringBuilder(); + cmd.append(ops.javacPath); + if (ops.jvmFlags != "") cmd.append(ops.jvmFlags); + if (ops.javacOpts != "") cmd.append(ops.javacOpts); + + StringBuilder files = new StringBuilder(); + int cnt = 0; + for(String javaFile : ops.javaFiles) { + if (cnt > 0) files.append(" "); + files.append(javaFile); + cnt += 1; + } + Process iostat = new ProcessBuilder() + .command(cmd.toString(), + "-classpath", ops.classpath + ":" + tmpPath.toString(), + "-d", tmpPath.toString(), + files.toString()) + .inheritIO() + .start(); + int exitCode = iostat.waitFor(); + if(exitCode != 0) { + throw new RuntimeException("javac process failed!"); + } + } + /** + * Now build the output jar + */ String[] jarCreatorArgs = { "-m", ops.manifestPath, @@ -263,6 +294,9 @@ private static void processRequest(List args) throws Exception { }; JarCreator.buildJar(jarCreatorArgs); + /** + * Now build the output ijar + */ if(ops.iJarEnabled) { Process iostat = new ProcessBuilder() .command(ops.ijarCmdPath, ops.outputName, ops.ijarOutput)