cherry pick directory structure from ic branch, refactor and document model.
diff --git a/kotlin/builder/integrationtests/KotlinBuilderActionTests.java b/kotlin/builder/integrationtests/KotlinBuilderActionTests.java index 59b1fdb..a26c1a1 100644 --- a/kotlin/builder/integrationtests/KotlinBuilderActionTests.java +++ b/kotlin/builder/integrationtests/KotlinBuilderActionTests.java
@@ -9,6 +9,6 @@ addSource("AClass.kt", "package something;" + "class AClass{}"); instance(KotlinCompiler.class).compile(builderCommand()); assertFileExists(DirectoryType.CLASSES, "something/AClass.class"); - assertFileDoesNotExist(outputs().getOutput()); + assertFileDoesNotExist(outputs().getJar()); } }
diff --git a/kotlin/builder/integrationtests/KotlinBuilderTestCase.java b/kotlin/builder/integrationtests/KotlinBuilderTestCase.java index 01ed512..f1cc005 100644 --- a/kotlin/builder/integrationtests/KotlinBuilderTestCase.java +++ b/kotlin/builder/integrationtests/KotlinBuilderTestCase.java
@@ -38,12 +38,16 @@ return builder.getOutputs(); } + protected KotlinModel.BuilderCommand.Directories directories() { + return builder.getDirectories(); + } + protected String label() { return Preconditions.checkNotNull(label); } private Path classDir() { - return Paths.get(outputs().getClassDirectory()); + return Paths.get(directories().getClasses()); } protected KotlinModel.BuilderCommand builderCommand() { @@ -55,7 +59,8 @@ } protected void addSource(String filename, String... lines) { - Path file = Preconditions.checkNotNull(inputSourceDir, "initialize test context").resolve(filename); + Path file = + Preconditions.checkNotNull(inputSourceDir, "initialize test context").resolve(filename); try (BufferedWriter writer = com.google.common.io.Files.newWriter(file.toFile(), UTF_8)) { writer.write(Joiner.on("\n").join(lines)); String f = file.toString(); @@ -74,10 +79,13 @@ protected void resetTestContext(String label) { this.label = label; + Path prefixPath = Paths.get(label); + + createTestOuputDirectory(prefixPath); + inputSourceDir = Paths.get(createTestOuputDirectory(prefixPath.resolve("input_sources"))); + builder.clear(); - KotlinModel.BuilderCommand.Outputs.Builder testOuputs = setupTestOutputs(label); - builder.setInfo( - KotlinModel.BuilderCommand.Info.newBuilder() + builder.getInfoBuilder() .setLabel("//some/bogus:" + label) .setKotlinModuleName("some_bogus_module") .setRuleKind("kt_jvm_library") @@ -88,8 +96,17 @@ .setApiVersion("1.2") .setCoroutines("enabled") .setLanguageVersion("1.2")) - .setJvm(KotlinModel.KotlinToolchainInfo.Jvm.newBuilder().setJvmTarget("1.8")))); - builder.setOutputs(testOuputs); + .setJvm(KotlinModel.KotlinToolchainInfo.Jvm.newBuilder().setJvmTarget("1.8"))); + builder + .getDirectoriesBuilder() + .setClasses(prefixPath.resolve("classes").toAbsolutePath().toString()) + .setGeneratedSources(prefixPath.resolve("sources").toAbsolutePath().toString()) + .setTemp(prefixPath.resolve("temp").toAbsolutePath().toString()) + .setGeneratedClasses(prefixPath.resolve("generated_classes").toAbsolutePath().toString()); + builder + .getOutputsBuilder() + .setJar(prefixPath.resolve("jar_file.jar").toAbsolutePath().toString()) + .setJdeps(prefixPath.resolve("jdeps_files.jdeps").toAbsolutePath().toString()); } private static String createTestOuputDirectory(Path path) { @@ -108,21 +125,10 @@ } } - private KotlinModel.BuilderCommand.Outputs.Builder setupTestOutputs(String label) { - Path prefixPath = Paths.get(label); - createTestOuputDirectory(prefixPath); - inputSourceDir = Paths.get(createTestOuputDirectory(prefixPath.resolve("input_sources"))); - return KotlinModel.BuilderCommand.Outputs.newBuilder() - .setClassDirectory(prefixPath.resolve("classes").toAbsolutePath().toString()) - .setSourceGenDir(prefixPath.resolve("sources").toAbsolutePath().toString()) - .setTempDirectory(prefixPath.resolve("temp").toAbsolutePath().toString()) - .setOutputJdeps(prefixPath.resolve("jdeps_files.jdeps").toAbsolutePath().toString()) - .setOutput(prefixPath.resolve("jar_file.jar").toAbsolutePath().toString()); - } - protected enum DirectoryType { ROOT, CLASSES, + GENERATED_CLASSES, TEMP, SOURCE_GEN; @@ -130,13 +136,16 @@ Path ret; switch (type) { case CLASSES: - ret = Paths.get(command.getOutputs().getClassDirectory()); + ret = Paths.get(command.getDirectories().getClasses()); + break; + case GENERATED_CLASSES: + ret = Paths.get(command.getDirectories().getGeneratedClasses()); break; case TEMP: - ret = Paths.get(command.getOutputs().getTempDirectory()); + ret = Paths.get(command.getDirectories().getTemp()); break; case SOURCE_GEN: - ret = Paths.get(command.getOutputs().getSourceGenDir()); + ret = Paths.get(command.getDirectories().getGeneratedSources()); break; default: throw new RuntimeException("unhandled type: " + type);
diff --git a/kotlin/builder/integrationtests/KotlinBuilderTests.java b/kotlin/builder/integrationtests/KotlinBuilderTests.java index 0d515e9..cb5aa62 100644 --- a/kotlin/builder/integrationtests/KotlinBuilderTests.java +++ b/kotlin/builder/integrationtests/KotlinBuilderTests.java
@@ -3,11 +3,13 @@ import com.google.common.truth.Truth; import com.google.devtools.build.lib.view.proto.Deps; import io.bazel.kotlin.builder.mode.jvm.KotlinJvmCompilationExecutor; +import io.bazel.kotlin.model.KotlinModel; import org.junit.Test; import java.io.FileInputStream; import java.io.IOException; import java.io.UncheckedIOException; +import java.nio.file.Files; import java.nio.file.Paths; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -28,23 +30,33 @@ runCompileTask(); assertFileExists(DirectoryType.CLASSES, "something/AClass.class"); assertFileExists(DirectoryType.CLASSES, "something/AnotherClass.class"); - assertFileExists(outputs().getOutput()); + assertFileExists(outputs().getJar()); } private void runCompileTask() { + KotlinModel.BuilderCommand command = builderCommand(); + for (DirectoryType directoryType : DirectoryType.values()) { + try { + if (directoryType != DirectoryType.ROOT) { + Files.createDirectories(DirectoryType.select(directoryType, command)); + } + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } int timeoutSeconds = 10; KotlinJvmCompilationExecutor executor = instance(KotlinJvmCompilationExecutor.class); try { - CompletableFuture.runAsync(() -> executor.compile(builderCommand())) + CompletableFuture.runAsync(() -> executor.compile(command)) .get(timeoutSeconds, TimeUnit.SECONDS); } catch (TimeoutException e) { throw new AssertionError("did not complete in: " + timeoutSeconds); } catch (Exception e) { throw new RuntimeException(e); } - assertFileExists(outputs().getOutput()); - assertFileExists(outputs().getOutputJdeps()); - try (FileInputStream fs = new FileInputStream(Paths.get(outputs().getOutputJdeps()).toFile())) { + assertFileExists(outputs().getJar()); + assertFileExists(outputs().getJdeps()); + try (FileInputStream fs = new FileInputStream(Paths.get(outputs().getJdeps()).toFile())) { Deps.Dependencies dependencies = Deps.Dependencies.parseFrom(fs); Truth.assertThat(dependencies.getRuleLabel()).endsWith(label()); } catch (IOException e) {
diff --git a/kotlin/builder/proto/jars/libkotlin_model_proto-speed.jar b/kotlin/builder/proto/jars/libkotlin_model_proto-speed.jar index d44630c..943c343 100755 --- a/kotlin/builder/proto/jars/libkotlin_model_proto-speed.jar +++ b/kotlin/builder/proto/jars/libkotlin_model_proto-speed.jar Binary files differ
diff --git a/kotlin/builder/proto/kotlin_model.proto b/kotlin/builder/proto/kotlin_model.proto index 8d27cd0..d1e4ced 100644 --- a/kotlin/builder/proto/kotlin_model.proto +++ b/kotlin/builder/proto/kotlin_model.proto
@@ -17,32 +17,45 @@ option java_package = "io.bazel.kotlin.model"; +// An abstract definition of an annotation processor. This is encoded into a format understood by kapt3. +// +stable message AnnotationProcessor { - // the annotation processor class + // The annotation processor class. string processor_class = 1; - // bazel `java_plugin` generates_api setting. + // The Bazel `java_plugin` `generates_api` attribute. bool generates_api = 2; - // the classpath + // The full transitive classpath required for annotation processing. repeated string classpath = 3; - + // The label of the plugin. string label = 4; } +// A container for all of the types of compiler plugins needed by the kotlin compilers. +// +stable message CompilerPlugins { + // Regular java annotation_processor descriptors. repeated AnnotationProcessor annotation_processors = 1; } +// Toolchain info this contains info to be used to configure the compile tasks as well as configuring certain features +// in IDE plugins. +// +stable message KotlinToolchainInfo { + // Common properties that should be common to all platforms. message Common { // mandatory string language_version = 1; - //mandatory + // mandatory string api_version = 2; + // mandatory // oneof "enable", "warn" or "error" string coroutines = 3; } + // Properties specific to the JVM. message Jvm { + // The property is additionally to configure the source and target bytecode levels in kapt3, javac and kotlin. + // mandatory // oneof "1.6", or "1.8" string jvm_target = 1; } @@ -51,6 +64,7 @@ Jvm jvm = 2; } +// Mested messages not marked with stable could be refactored. message BuilderCommand { message Info { string label = 1; @@ -67,44 +81,65 @@ CompilerPlugins plugins = 8; - // derived from plugins - repeated string encoded_plugin_descriptors=9; + // All of the plugin descriptors in the format kotlinc understands. + // +derived + repeated string encoded_plugin_descriptors = 9; - // friend jars -- kotlin compiler allows internal visibility access to these jars. Used for tests. + // Jars that the kotlin compiler will allow package private access to. repeated string friend_paths = 10; } - message Outputs { - string class_directory = 1; - string temp_directory = 2; - string source_gen_dir = 3; + // Directories used by the builder. + // +stable + message Directories { + // The directory the compiler should use for class files. + string classes = 1; + // The directory to use by annotation processors to produce classes. + string generated_classes = 2; + // The directory used by annotation processors. The generated sources are currently only java. + string generated_sources = 3; + // A temp directory that the compiler may use. The source_jars are expanding into here. + string temp = 4; + } - string output = 4; - string output_jdeps = 5; + // Outputs produced by the builder. + // +stable + message Outputs { + // The path to the primary output jar. + string jar = 1; + // The path to the jdeps file. + string jdeps = 2; } message Inputs { + // The full classpath repeated string classpath = 1; - // derived from command line classpath + // The full joined classpath + // +derived string joined_classpath = 2; - + // Direct dependencies of the target. map<string, string> direct_dependencies = 3; + // Indirect dependencies of the target. map<string, string> indirect_dependencies = 4; - // partitioned from builder flags + // Partitioned from the builder flags and by expanding the source_jars. + // +derived repeated string kotlin_sources = 5; - // partitioned from builder flags + // Partitioned from the builder flags and by expanding the source_jars. + // +derived repeated string java_sources = 6; - - // created during compilation + // Created during annotation processing and partitioned from the generated_sources directory. + // +dervived repeated string generated_kotlin_sources = 7; - // created during compilation + // Created during annotation processing and partitioned from the generated_sources directory. + // +derived repeated string generated_java_sources = 8; - + // Jars containing additional sources. repeated string source_jars = 9; } Info info = 1; - Outputs outputs = 2; - Inputs inputs = 3; + Directories directories = 2; + Outputs outputs = 3; + Inputs inputs = 4; } \ No newline at end of file
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/BuildCommandBuilder.kt b/kotlin/builder/src/io/bazel/kotlin/builder/BuildCommandBuilder.kt index 9e69452..54302c1 100644 --- a/kotlin/builder/src/io/bazel/kotlin/builder/BuildCommandBuilder.kt +++ b/kotlin/builder/src/io/bazel/kotlin/builder/BuildCommandBuilder.kt
@@ -87,11 +87,15 @@ override fun fromInput(argMap: ArgMap): BuilderCommand = BuilderCommand.newBuilder().let { root -> with(root.outputsBuilder) { - classDirectory = argMap.mandatorySingle(JavaBuilderFlags.CLASSDIR.flag) - tempDirectory = argMap.mandatorySingle(JavaBuilderFlags.TEMPDIR.flag) - sourceGenDir = argMap.mandatorySingle(JavaBuilderFlags.SOURCEGEN_DIR.flag) - output = argMap.mandatorySingle(JavaBuilderFlags.OUTPUT.flag) - outputJdeps = argMap.mandatorySingle("--output_jdeps") + jar = argMap.mandatorySingle(JavaBuilderFlags.OUTPUT.flag) + jdeps = argMap.mandatorySingle("--output_jdeps") + } + + with(root.directoriesBuilder) { + classes = argMap.mandatorySingle(JavaBuilderFlags.CLASSDIR.flag) + generatedClasses = argMap.mandatorySingle("--kotlin_generated_classdir") + temp = argMap.mandatorySingle(JavaBuilderFlags.TEMPDIR.flag) + generatedSources = argMap.mandatorySingle(JavaBuilderFlags.SOURCEGEN_DIR.flag) } with(root.inputsBuilder) {
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt b/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt index a5cda42..61431ba 100644 --- a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt +++ b/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt
@@ -21,8 +21,8 @@ import io.bazel.kotlin.builder.mode.jvm.KotlinJvmCompilationExecutor import io.bazel.kotlin.builder.utils.ArgMap import io.bazel.kotlin.builder.utils.ArgMaps +import io.bazel.kotlin.builder.utils.ensureDirectories import io.bazel.kotlin.model.KotlinModel -import java.nio.file.Files import java.nio.file.Paths @Singleton @@ -39,7 +39,12 @@ commandBuilder.fromInput(args).let { execute(it) } fun execute(command: KotlinModel.BuilderCommand): Int { - ensureOutputDirectories(command) + ensureDirectories( + command.directories.classes, + command.directories.temp, + command.directories.generatedSources, + command.directories.generatedClasses + ) val updatedCommand = expandWithSourceJarSources(command) return try { compilationExector.compile(updatedCommand) @@ -49,12 +54,6 @@ } } - private fun ensureOutputDirectories(command: KotlinModel.BuilderCommand) { - Files.createDirectories(Paths.get(command.outputs.classDirectory)) - Files.createDirectories(Paths.get(command.outputs.tempDirectory)) - Files.createDirectories(Paths.get(command.outputs.sourceGenDir)) - } - /** * If any sourcejars were provided expand the jars sources and create a new [KotlinModel.BuilderCommand] with the * Java and Kotlin sources merged in. @@ -64,7 +63,7 @@ command } else { val sourceUnpackDirectory = - Paths.get(command.outputs.tempDirectory).let { + Paths.get(command.directories.temp).let { it.resolve("_srcjars").toFile().let { try { it.mkdirs(); it @@ -75,7 +74,8 @@ } for (sourceJar in command.inputs.sourceJarsList) { jarToolInvoker.invoke( - listOf("xf", Paths.get(sourceJar).toAbsolutePath().toString()), sourceUnpackDirectory) + listOf("xf", Paths.get(sourceJar).toAbsolutePath().toString()), sourceUnpackDirectory + ) } commandBuilder.withSources(
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/KotlinJvmCompilationExecutor.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/KotlinJvmCompilationExecutor.kt index 6ce5a15..db1b42d 100644 --- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/KotlinJvmCompilationExecutor.kt +++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/KotlinJvmCompilationExecutor.kt
@@ -21,7 +21,6 @@ import com.google.inject.Singleton import io.bazel.kotlin.builder.BuildCommandBuilder import io.bazel.kotlin.builder.CompilationStatusException -import io.bazel.kotlin.builder.ToolException import io.bazel.kotlin.builder.mode.jvm.KotlinJvmCompilationExecutor.Result import io.bazel.kotlin.builder.mode.jvm.actions.JDepsGenerator import io.bazel.kotlin.builder.mode.jvm.actions.JavaCompiler @@ -67,7 +66,7 @@ try { if (command.info.plugins.annotationProcessorsList.isNotEmpty()) { kotlinCompiler.runAnnotationProcessor(command) - File(command.outputs.sourceGenDir).walkTopDown() + File(command.directories.generatedSources).walkTopDown() .filter { it.isFile } .map { it.path } .iterator()
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JDepsGenerator.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JDepsGenerator.kt index 4c167a2..0bcc45f 100644 --- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JDepsGenerator.kt +++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JDepsGenerator.kt
@@ -55,7 +55,7 @@ val res = invoker.run( arrayOf( "-cp", command.inputs.joinedClasspath, - command.outputs.output), + command.outputs.jdeps), writer) out.toByteArray().inputStream().bufferedReader().readLines().let { if (res != 0) { @@ -64,7 +64,7 @@ try { JdepsParser.parse( command.info.label, - command.outputs.output, + command.outputs.jdeps, command.inputs.joinedClasspath, it, isKotlinImplicit @@ -76,7 +76,7 @@ } } } - Paths.get(command.outputs.outputJdeps).also { + Paths.get(command.outputs.jdeps).also { Files.deleteIfExists(it) FileOutputStream(Files.createFile(it).toFile()).use { jdepsContent.writeTo(it)
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JavaCompiler.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JavaCompiler.kt index b88f440..ee5df82 100644 --- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JavaCompiler.kt +++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JavaCompiler.kt
@@ -31,12 +31,12 @@ val javacInvoker: KotlinToolchain.JavacInvoker ) : JavaCompiler { override fun compile(command: BuilderCommand) { - val inputs = command.inputs - val outputs = command.outputs - if (inputs.javaSourcesList.isNotEmpty() || inputs.generatedJavaSourcesList.isNotEmpty()) { + val i = command.inputs + val d = command.directories + if (i.javaSourcesList.isNotEmpty() || i.generatedJavaSourcesList.isNotEmpty()) { val args = mutableListOf( - "-cp", "${outputs.classDirectory}/:${outputs.tempDirectory}/:${inputs.joinedClasspath}", - "-d", outputs.classDirectory + "-cp", "${d.classes}/:${d.temp}/:${i.joinedClasspath}", + "-d", d.classes ).let { it.addAll( // Kotlin takes care of annotation processing. @@ -46,8 +46,8 @@ "-source", command.info.toolchainInfo.jvm.jvmTarget, "-target", command.info.toolchainInfo.jvm.jvmTarget ) - it.addAll(inputs.javaSourcesList) - it.addAll(inputs.generatedJavaSourcesList) + it.addAll(i.javaSourcesList) + it.addAll(i.generatedJavaSourcesList) it.toTypedArray() } javacInvoker.compile(args).takeIf { it != 0 }?.also { throw CompilationStatusException("javac failed",it) }
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/KotlinCompiler.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/KotlinCompiler.kt index dbff055..ffcf837 100644 --- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/KotlinCompiler.kt +++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/KotlinCompiler.kt
@@ -71,7 +71,7 @@ args .addAll("-module-name", command.info.kotlinModuleName) - .addAll("-d", command.outputs.classDirectory) + .addAll("-d", command.directories.classes) command.info.passthroughFlags?.takeIf { it.isNotBlank() }?.also { args.addAll(it.split(" ")) } return args
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/OutputJarCreator.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/OutputJarCreator.kt index 19aab9f..e46147b 100644 --- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/OutputJarCreator.kt +++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/OutputJarCreator.kt
@@ -33,9 +33,10 @@ private fun MutableList<String>.addAllFrom(dir: Path) = addAll(arrayOf("-C", dir.toString(), ".")) override fun createOutputJar(command: KotlinModel.BuilderCommand) { mutableListOf( - "cf", command.outputs.output + "cf", command.outputs.jar ).also { args -> - args.addAllFrom(Paths.get(command.outputs.classDirectory)) + args.addAllFrom(Paths.get(command.directories.classes)) + args.addAllFrom(Paths.get(command.directories.generatedClasses)) }.let { toolInvoker.invoke(it) } } }
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/IOUtils.kt b/kotlin/builder/src/io/bazel/kotlin/builder/utils/IOUtils.kt index 0eb34a3..9e9c70b 100644 --- a/kotlin/builder/src/io/bazel/kotlin/builder/utils/IOUtils.kt +++ b/kotlin/builder/src/io/bazel/kotlin/builder/utils/IOUtils.kt
@@ -20,6 +20,7 @@ import java.io.BufferedReader import java.io.File import java.io.PrintStream +import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths import java.util.* @@ -72,6 +73,11 @@ fun Path.verified(): File = this.toFile().also { check(it.exists()) { "file did not exist: $this" } } +fun ensureDirectories(vararg directories: String) { + for (directory in directories) { + Files.createDirectories(Paths.get(directory)) + } +} val Throwable.rootCause: Throwable get() {
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/KotlinCompilerPluginArgsEncoder.kt b/kotlin/builder/src/io/bazel/kotlin/builder/utils/KotlinCompilerPluginArgsEncoder.kt index 716107d..1d29c0a 100644 --- a/kotlin/builder/src/io/bazel/kotlin/builder/utils/KotlinCompilerPluginArgsEncoder.kt +++ b/kotlin/builder/src/io/bazel/kotlin/builder/utils/KotlinCompilerPluginArgsEncoder.kt
@@ -96,13 +96,13 @@ val javacArgs = mutableMapOf<String, String>( "-target" to command.info.toolchainInfo.jvm.jvmTarget ) - + val d = command.directories return command.info.plugins.takeIf { it.annotationProcessorsList.isNotEmpty() }?.let { plugin -> PluginArgs().let { arg -> - arg["sources"] = command.outputs.sourceGenDir.toString() - arg["classes"] = command.outputs.classDirectory.toString() - arg["stubs"] = command.outputs.tempDirectory.toString() - arg["incrementalData"] = command.outputs.tempDirectory.toString() + arg["sources"] = d.generatedSources.toString() + arg["classes"] = d.generatedClasses.toString() + arg["stubs"] = d.temp.toString() + arg["incrementalData"] = d.temp.toString() arg["javacArguments"] = javacArgs.let(::encodeMap) arg["aptMode"] = "stubsAndApt" arg["correctErrorTypes"] = "true"
diff --git a/kotlin/internal/compile.bzl b/kotlin/internal/compile.bzl index 9a02835..b444c16 100644 --- a/kotlin/internal/compile.bzl +++ b/kotlin/internal/compile.bzl
@@ -15,6 +15,9 @@ load("//kotlin/internal:plugins.bzl", "plugins") load("//kotlin/internal:utils.bzl", "utils") +def _declare_output_directory(ctx, aspect, dir_name): + return ctx.actions.declare_directory("_kotlinc/%s_%s/%s_%s" % (ctx.label.name, aspect, ctx.label.name, dir_name)) + def _kotlin_do_compile_action(ctx, rule_kind, output_jar, compile_jars, module_name, friend_paths, srcs, src_jars): """Internal macro that sets up a Kotlin compile action. @@ -27,9 +30,11 @@ responsible for preparing the classpath. The stdlib (and jdk7 + jdk8) should generally be added to the classpath by the caller -- kotlin-reflect could be optional. """ - classes_directory=ctx.actions.declare_directory(ctx.label.name + "_classes") - sourcegen_directory=ctx.actions.declare_directory(ctx.label.name + "_sourcegendir") - temp_directory=ctx.actions.declare_directory(ctx.label.name + "_tempdir") + classes_directory=_declare_output_directory(ctx, "jvm", "classes") + generated_classes_directory=_declare_output_directory(ctx, "jvm", "generated_classes") + sourcegen_directory=_declare_output_directory(ctx, "jvm", "sourcegenfiles") + temp_directory=_declare_output_directory(ctx, "jvm", "temp") + tc=ctx.toolchains[kt.defs.TOOLCHAIN_TYPE] @@ -40,6 +45,7 @@ "--classdir", classes_directory.path, "--sourcegendir", sourcegen_directory.path, "--tempdir", temp_directory.path, + "--kotlin_generated_classdir", generated_classes_directory.path, "--output", output_jar.path, "--output_jdeps", ctx.outputs.jdeps.path, @@ -83,7 +89,14 @@ ctx.action( mnemonic = "KotlinCompile", inputs = compile_inputs, - outputs = [output_jar, ctx.outputs.jdeps, sourcegen_directory, classes_directory, temp_directory], + outputs = [ + output_jar, + ctx.outputs.jdeps, + sourcegen_directory, + classes_directory, + temp_directory, + generated_classes_directory + ], executable = ctx.executable._kotlinw, execution_requirements = {"supports-workers": "1"}, arguments = ["@" + args_file.path],