split timing and trace into seperate flags and tidy up
diff --git a/kotlin/BUILD b/kotlin/BUILD
index b69cba7..e7ab37c 100644
--- a/kotlin/BUILD
+++ b/kotlin/BUILD
@@ -17,10 +17,26 @@
load("//kotlin/internal:bootstrap.bzl", "kt_toolchain_ide_info")
config_setting(
- name = "builder_debug_setting",
- values = {
- "define": "kt_debug=1"
- }
+ name = "builder_debug_timings",
+ values = { "define": "kt_timings=1" }
+)
+
+config_setting(
+ name = "builder_debug_trace",
+ values = { "define": "kt_trace=1" }
+)
+
+define_kt_toolchain(
+ name = "default_toolchain",
+ debug=
+ select({
+ "//kotlin:builder_debug_trace": ["trace"],
+ "//conditions:default": []
+ }) +
+ select({
+ "//kotlin:builder_debug_timings": ["timings"],
+ "//conditions:default": []
+ })
)
toolchain_type(
@@ -28,14 +44,6 @@
visibility = ["//visibility:public"]
)
-define_kt_toolchain(
- name = "default_toolchain",
- debug=select({
- "//kotlin:builder_debug_setting": 1,
- "//conditions:default": 0
- })
-)
-
kt_toolchain_ide_info(name="kt_toolchain_ide_info")
exports_files(["toolchains.bzl", "kotlin.bzl"], visibility=["//docs:__subpackages__"])
diff --git a/kotlin/builder/proto/jars/libkotlin_model_proto-speed.jar b/kotlin/builder/proto/jars/libkotlin_model_proto-speed.jar
index 1411450..3e72540 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 5344fed..8814ef6 100644
--- a/kotlin/builder/proto/kotlin_model.proto
+++ b/kotlin/builder/proto/kotlin_model.proto
@@ -96,8 +96,10 @@
repeated string friend_paths = 8;
// The path of the primary output for the task, this is derived from the flagfile.
string primary_output_path = 9;
- // If this is true the builder will print out debug messages.
- int32 debug = 10;
+ // Strings to enable various debugging behaviours
+ // trace: enables trace logging.
+ // timings: causes timing information to be printed at the of an action.
+ repeated string debug = 10;
}
// Mested messages not marked with stable could be refactored.
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/tasks/KotlinBuilder.kt b/kotlin/builder/src/io/bazel/kotlin/builder/tasks/KotlinBuilder.kt
index 8c6c973..c834790 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/tasks/KotlinBuilder.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/tasks/KotlinBuilder.kt
@@ -49,16 +49,24 @@
override fun apply(args: List<String>): Int {
val (argMap, context) = buildContext(args)
+ var success = false
+ var status = 0
try {
@Suppress("WHEN_ENUM_CAN_BE_NULL_IN_JAVA")
when (context.info.platform) {
Platform.JVM -> executeJvmTask(context, argMap)
Platform.UNRECOGNIZED, Platform.JS -> throw IllegalStateException("unrecognized platform: ${context.info}")
}
+ success = true
} catch (ex: CompilationStatusException) {
- return ex.status
+ status = ex.status
+ } catch(throwable: Throwable) {
+ context.reportUnhandledException(throwable)
+ throw throwable
+ } finally {
+ context.finalize(success)
}
- return 0
+ return status
}
private fun buildContext(args: List<String>): Pair<ArgMap, CompilationTaskContext> {
@@ -129,7 +137,8 @@
private fun buildTaskInfo(argMap: ArgMap): CompilationTaskInfo.Builder =
with(CompilationTaskInfo.newBuilder()) {
- debug = argMap.mandatorySingle(KotlinBuilderFlags.DEBUG).toInt()
+ addAllDebug(argMap.mandatory(KotlinBuilderFlags.DEBUG))
+
label = argMap.mandatorySingle(JavaBuilderFlags.TARGET_LABEL)
argMap.mandatorySingle(JavaBuilderFlags.RULE_KIND).split("_").also {
check(it.size == 3 && it[0] == "kt") { "invalid rule kind $it" }
@@ -152,7 +161,9 @@
private fun executeJvmTask(context: CompilationTaskContext, argMap: ArgMap) {
val task = buildJvmTask(context.info, argMap)
- context.debugPrintProto("jvm task message", task)
+ context.whenTracing {
+ printProto("jvm task message", task)
+ }
jvmTaskExecutor.execute(context, task)
}
@@ -178,7 +189,7 @@
putAllIndirectDependencies(argMap.labelDepMap(JavaBuilderFlags.DIRECT_DEPENDENCY))
putAllIndirectDependencies(argMap.labelDepMap(JavaBuilderFlags.INDIRECT_DEPENDENCY))
- argMap.optional(JavaBuilderFlags.SOURCES)?.iterator()?.partitionSources(
+ argMap.optional(JavaBuilderFlags.SOURCES)?.iterator()?.partitionJvmSources(
{ addKotlinSources(it) },
{ addJavaSources(it) }
)
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/KotlinJvmTaskExecutor.kt b/kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/KotlinJvmTaskExecutor.kt
index caa3372..bac2bcd 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/KotlinJvmTaskExecutor.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/KotlinJvmTaskExecutor.kt
@@ -15,12 +15,9 @@
*/
package io.bazel.kotlin.builder.tasks.jvm
-
import io.bazel.kotlin.builder.toolchain.CompilationStatusException
-import io.bazel.kotlin.builder.utils.CompilationTaskContext
-import io.bazel.kotlin.builder.utils.IS_JVM_SOURCE_FILE
-import io.bazel.kotlin.builder.utils.ensureDirectories
-import io.bazel.kotlin.builder.utils.expandWithSources
+import io.bazel.kotlin.builder.utils.*
+import io.bazel.kotlin.builder.utils.jars.JarCreator
import io.bazel.kotlin.builder.utils.jars.SourceJarCreator
import io.bazel.kotlin.builder.utils.jars.SourceJarExtractor
import io.bazel.kotlin.model.JvmCompilationTask
@@ -34,74 +31,50 @@
class KotlinJvmTaskExecutor @Inject internal constructor(
private val kotlinCompiler: KotlinJvmCompiler,
private val javaCompiler: JavaCompiler,
- private val jDepsGenerator: JDepsGenerator,
- private val outputJarCreator: OutputJarCreator
+ private val jDepsGenerator: JDepsGenerator
) {
fun execute(context: CompilationTaskContext, task: JvmCompilationTask) {
- val preprocessedTask = preprocessingSteps(task)
- // fix error handling
+ // TODO fix error handling
try {
- val commandWithApSources = context.execute("kapt") {
- runAnnotationProcessors(context, preprocessedTask)
- }
- compileClasses(context, commandWithApSources)
- context.execute("create jar") {
- outputJarCreator.createOutputJar(commandWithApSources)
- }
- produceSourceJar(commandWithApSources)
- context.execute("generate jdeps") {
- jDepsGenerator.generateJDeps(commandWithApSources)
- }
+ val preprocessedTask = task.preprocessingSteps(context)
+ context.execute("compile classes") { preprocessedTask.compileClasses(context) }
+ context.execute("create jar") { preprocessedTask.createOutputJar() }
+ context.execute("produce src jar") { preprocessedTask.produceSourceJar() }
+ context.execute("generate jdeps") { preprocessedTask.generateJDeps() }
} catch (ex: Throwable) {
throw RuntimeException(ex)
}
}
-
- private fun preprocessingSteps(command: JvmCompilationTask): JvmCompilationTask {
+ private fun JvmCompilationTask.preprocessingSteps(context: CompilationTaskContext): JvmCompilationTask {
ensureDirectories(
- command.directories.classes,
- command.directories.temp,
- command.directories.generatedSources,
- command.directories.generatedClasses
+ directories.temp,
+ directories.generatedSources,
+ directories.generatedClasses
)
- return expandWithSourceJarSources(command)
+ val taskWithAdditionalSources = context.execute("expand sources") { expandWithSourceJarSources() }
+ return context.execute("kapt") { taskWithAdditionalSources.runAnnotationProcessors(context) }
}
- /**
- * If any srcjars were provided expand the jars sources and create a new [JvmCompilationTask] with the
- * Java and Kotlin sources merged in.
- */
- private fun expandWithSourceJarSources(command: JvmCompilationTask): JvmCompilationTask =
- if (command.inputs.sourceJarsList.isEmpty()) {
- command
- } else {
- SourceJarExtractor(
- destDir = Paths.get(command.directories.temp).resolve("_srcjars"),
- fileMatcher = IS_JVM_SOURCE_FILE
- ).also {
- it.jarFiles.addAll(command.inputs.sourceJarsList.map { p -> Paths.get(p) })
- it.execute()
- }.let {
- command.expandWithSources(it.sourcesList.iterator())
- }
- }
+ private fun JvmCompilationTask.generateJDeps() {
+ jDepsGenerator.generateJDeps(this)
+ }
- private fun produceSourceJar(command: JvmCompilationTask) {
- Paths.get(command.outputs.srcjar).also { sourceJarPath ->
+ private fun JvmCompilationTask.produceSourceJar() {
+ Paths.get(outputs.srcjar).also { sourceJarPath ->
Files.createFile(sourceJarPath)
SourceJarCreator(
sourceJarPath
).also { creator ->
// This check asserts that source jars were unpacked if present.
check(
- command.inputs.sourceJarsList.isEmpty() ||
- Files.exists(Paths.get(command.directories.temp).resolve("_srcjars"))
+ inputs.sourceJarsList.isEmpty() ||
+ Files.exists(Paths.get(directories.temp).resolve("_srcjars"))
)
listOf(
// Any (input) source jars should already have been expanded so do not add them here.
- command.inputs.javaSourcesList.stream(),
- command.inputs.kotlinSourcesList.stream()
+ inputs.javaSourcesList.stream(),
+ inputs.kotlinSourcesList.stream()
).stream()
.flatMap { it.map { p -> Paths.get(p) } }
.also { creator.addSources(it) }
@@ -110,35 +83,46 @@
}
}
- private fun runAnnotationProcessors(
- context: CompilationTaskContext,
- command: JvmCompilationTask
+ private fun JvmCompilationTask.runAnnotationProcessors(
+ context: CompilationTaskContext
): JvmCompilationTask =
try {
- if (command.info.plugins.annotationProcessorsList.isNotEmpty()) {
- kotlinCompiler.runAnnotationProcessor(context, command)
- File(command.directories.generatedSources).walkTopDown()
- .filter { it.isFile }
- .map { it.path }
- .iterator()
- .let { command.expandWithSources(it) }
+ if (info.plugins.annotationProcessorsList.isEmpty()) {
+ this
} else {
- command
+ val kaptOutput = kotlinCompiler.runAnnotationProcessor(context, this)
+ context.whenTracing { printLines("kapt output", kaptOutput) }
+ expandWithGeneratedSources()
}
} catch (ex: CompilationStatusException) {
ex.lines.also(context::printCompilerOutput)
throw ex
}
- private fun compileClasses(
- context: CompilationTaskContext,
- command: JvmCompilationTask
- ) {
+ /**
+ * Produce the primary output jar.
+ */
+ private fun JvmCompilationTask.createOutputJar() =
+ JarCreator(
+ path = Paths.get(outputs.jar),
+ normalize = true,
+ verbose = false
+ ).also {
+ it.addDirectory(Paths.get(directories.classes))
+ it.addDirectory(Paths.get(directories.generatedClasses))
+ it.setJarOwner(info.label, info.bazelRuleKind)
+ it.execute()
+ }
+
+ private fun JvmCompilationTask.compileClasses(context: CompilationTaskContext) {
+ ensureDirectories(
+ directories.classes
+ )
var kotlinError: CompilationStatusException? = null
var result: List<String>? = null
context.execute("kotlinc") {
result = try {
- kotlinCompiler.compile(command)
+ kotlinCompiler.compile(this)
} catch (ex: CompilationStatusException) {
kotlinError = ex
ex.lines
@@ -146,11 +130,57 @@
}
try {
context.execute("javac") {
- javaCompiler.compile(command)
+ javaCompiler.compile(this)
}
} finally {
checkNotNull(result).also(context::printCompilerOutput)
kotlinError?.also { throw it }
}
}
+
+ /**
+ * If any srcjars were provided expand the jars sources and create a new [JvmCompilationTask] with the
+ * Java and Kotlin sources merged in.
+ */
+ private fun JvmCompilationTask.expandWithSourceJarSources(): JvmCompilationTask =
+ if (inputs.sourceJarsList.isEmpty())
+ this
+ else expandWithSources(
+ SourceJarExtractor(
+ destDir = Paths.get(directories.temp).resolve("_srcjars"),
+ fileMatcher = IS_JVM_SOURCE_FILE
+ ).also {
+ it.jarFiles.addAll(inputs.sourceJarsList.map { p -> Paths.get(p) })
+ it.execute()
+ }.sourcesList.iterator()
+ )
+
+ /**
+ * Create a new [JvmCompilationTask] with sources found in the generatedSources directory. This should be run after
+ * annotation processors have been run.
+ */
+ private fun JvmCompilationTask.expandWithGeneratedSources(): JvmCompilationTask =
+ expandWithSources(
+ File(directories.generatedSources).walkTopDown()
+ .filter { it.isFile }
+ .map { it.path }
+ .iterator()
+ )
+
+ private fun JvmCompilationTask.expandWithSources(sources: Iterator<String>): JvmCompilationTask =
+ updateBuilder { builder ->
+ sources.partitionJvmSources(
+ { builder.inputsBuilder.addKotlinSources(it) },
+ { builder.inputsBuilder.addJavaSources(it) })
+ }
+
+ private fun JvmCompilationTask.updateBuilder(
+ block: (JvmCompilationTask.Builder) -> Unit
+ ): JvmCompilationTask =
+ toBuilder().let {
+ block(it)
+ it.build()
+ }
}
+
+
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/OutputJarCreator.kt b/kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/OutputJarCreator.kt
deleted file mode 100644
index 0233dc5..0000000
--- a/kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/OutputJarCreator.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2018 The Bazel Authors. 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 io.bazel.kotlin.builder.tasks.jvm
-
-import io.bazel.kotlin.builder.utils.bazelRuleKind
-import io.bazel.kotlin.builder.utils.jars.JarCreator
-import io.bazel.kotlin.model.JvmCompilationTask
-import java.nio.file.Paths
-import javax.inject.Inject
-import javax.inject.Singleton
-
-@Singleton
-internal class OutputJarCreator @Inject constructor() {
- fun createOutputJar(command: JvmCompilationTask) {
- JarCreator(
- path = Paths.get(command.outputs.jar),
- normalize = true,
- verbose = false
- ).also {
- it.addDirectory(Paths.get(command.directories.classes))
- it.addDirectory(Paths.get(command.directories.generatedClasses))
- it.setJarOwner(command.info.label, command.info.bazelRuleKind)
- it.execute()
- }
- }
-}
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/CompilationTaskContext.kt b/kotlin/builder/src/io/bazel/kotlin/builder/utils/CompilationTaskContext.kt
index 17946ae..fc85d0a 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/utils/CompilationTaskContext.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/utils/CompilationTaskContext.kt
@@ -25,39 +25,51 @@
class CompilationTaskContext(val info: CompilationTaskInfo, private val out: PrintStream) {
private val executionRoot: String = Paths.get("").toAbsolutePath().toString() + File.separator
- private val timings = mutableListOf<String>()
- val isDebug: Boolean = info.debug > 0
+ private val timings: MutableList<String>?
+ @PublishedApi
+ internal val isTracing: Boolean
- /**
- * Print debugging messages if it is enabled for the task.
- */
- fun debugPrint(msg: String) {
- if (info.debug > 0) {
- out.println(msg)
- }
+ init {
+ val debugging = info.debugList.toSet()
+ timings = if (debugging.contains("timings")) mutableListOf() else null
+ isTracing = debugging.contains("trace")
}
+ fun reportUnhandledException(throwable: Throwable) { throwable.printStackTrace(out) }
+
/**
- * Print a debugging message if it debugging is enabled for the task. The lines are tab seperated.
+ * Print a list of debugging lines.
+ *
+ * @param header a header string
+ * @param lines a list of lines to print out
+ * @param prefix a prefix to add to each line
+ * @param filterEmpty if empty lines should be discarded or not
*/
- private inline fun debugPrintHeadedLines(header: String, lines: () -> String) {
- if (info.debug > 0) {
- out.println(if (header.endsWith(":")) header else "$header:")
- out.print("| ${lines().replace("\n", "\n| ")}")
+ fun printLines(header: String, lines: List<String>, prefix: String = "| ", filterEmpty: Boolean = false) {
+ check(header.isNotEmpty())
+ out.println(if (header.endsWith(":")) header else "$header:")
+ lines.forEach {
+ if (it.isNotEmpty() || !filterEmpty) {
+ out.println("$prefix$it")
+ }
}
+ out.println()
+ }
+
+ inline fun <T> whenTracing(block: CompilationTaskContext.() -> T): T? {
+ return if(isTracing) { block() } else null
}
/**
* Print a proto message if debugging is enabled for the task.
*/
- fun debugPrintProto(header: String, msg: MessageOrBuilder) {
- debugPrintHeadedLines(header) { TextFormat.printToString(msg) }
+ fun printProto(header: String, msg: MessageOrBuilder) {
+ printLines(header, TextFormat.printToString(msg).split("\n"), filterEmpty = true)
}
- fun printCompilerOutput(line: String) {
- out.println(trimExecutionRootPrefix(line))
- }
-
+ /**
+ * This method normalizes and reports the output from the Kotlin compiler.
+ */
fun printCompilerOutput(lines: List<String>) {
lines.map(::trimExecutionRootPrefix).forEach(out::println)
}
@@ -69,13 +81,31 @@
} else toPrint
}
+ /**
+ * Runs a task and records the timings.
+ */
fun <T> execute(name: String, task: () -> T): T {
- val start = System.currentTimeMillis()
- return try {
+ return if (timings == null) {
task()
- } finally {
- val stop = System.currentTimeMillis()
- timings += "$name: ${stop - start} ms"
+ } else {
+ val start = System.currentTimeMillis()
+ try {
+ task()
+ } finally {
+ val stop = System.currentTimeMillis()
+ timings += "$name: ${stop - start} ms"
+ }
+ }
+ }
+
+ /**
+ * This method should be called at the end of builder invocation.
+ *
+ * @param succesfull true if the task finished succesfully.
+ */
+ fun finalize(succesfull: Boolean) {
+ if(succesfull) {
+ timings?.also { printLines("Task timings", it, prefix = " * ") }
}
}
}
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 6974f0c..8e00e13 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/utils/KotlinCompilerPluginArgsEncoder.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/utils/KotlinCompilerPluginArgsEncoder.kt
@@ -99,7 +99,9 @@
arg["javacArguments"] = javacArgs.let(Companion::encodeMap)
arg["aptMode"] = "stubsAndApt"
arg["correctErrorTypes"] = "true"
- arg["verbose"] = context.isDebug.toString()
+ context.whenTracing {
+ arg["verbose"] = "true"
+ }
arg["processors"] = plugin.annotationProcessorsList
.filter { it.processorClass.isNotEmpty() }
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/TaskUtils.kt b/kotlin/builder/src/io/bazel/kotlin/builder/utils/TaskUtils.kt
index 67c607a..2f91ca6 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/utils/TaskUtils.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/utils/TaskUtils.kt
@@ -19,28 +19,11 @@
import io.bazel.kotlin.model.JvmCompilationTask
import java.io.File
-fun JvmCompilationTask.expandWithSources(
- sources: Iterator<String>
-): JvmCompilationTask =
- updateBuilder { builder ->
- sources.partitionSources(
- { builder.inputsBuilder.addKotlinSources(it) },
- { builder.inputsBuilder.addJavaSources(it) })
- }
-
val JvmCompilationTask.Inputs.joinedClasspath: String get() = this.classpathList.joinToString(File.pathSeparator)
val CompilationTaskInfo.bazelRuleKind: String get() = "kt_${platform.name.toLowerCase()}_${ruleKind.name.toLowerCase()}"
-private fun JvmCompilationTask.updateBuilder(
- init: (JvmCompilationTask.Builder) -> Unit
-): JvmCompilationTask =
- toBuilder().let {
- init(it)
- it.build()
- }
-
-fun Iterator<String>.partitionSources(kt: (String) -> Unit, java: (String) -> Unit) {
+fun Iterator<String>.partitionJvmSources(kt: (String) -> Unit, java: (String) -> Unit) {
forEach {
when {
it.endsWith(".kt") -> kt(it)
diff --git a/kotlin/internal/compile.bzl b/kotlin/internal/compile.bzl
index 1d61f17..47e45a4 100644
--- a/kotlin/internal/compile.bzl
+++ b/kotlin/internal/compile.bzl
@@ -33,7 +33,14 @@
args.add("--kotlin_api_version", toolchain.api_version)
args.add("--kotlin_language_version", toolchain.language_version)
args.add("--kotlin_passthrough_flags", "-Xcoroutines=%s" % toolchain.coroutines)
- args.add("--kotlin_debug", toolchain.debug)
+
+ debug = depset(toolchain.debug)
+ for tag in ctx.attr.tags:
+ if tag == "trace":
+ debug = debug + [tag]
+ if tag == "timings":
+ debug = debug + [tag]
+ args.add("--kotlin_debug", debug)
return args
diff --git a/kotlin/toolchains.bzl b/kotlin/toolchains.bzl
index 0e08ab8..c61c8ce 100644
--- a/kotlin/toolchains.bzl
+++ b/kotlin/toolchains.bzl
@@ -71,8 +71,12 @@
"1.2",
],
),
- "debug": attr.int(
- doc="if this is non zero then the builder will produce debug logging."
+ "debug": attr.string_list(
+ allow_empty=True,
+ doc="""Debugging tags passed to the builder. Two tags are supported. `timings` will cause the builder to print
+timing information. `trace` will cause the builder to print tracing messages. These tags can be enabled via the default
+toolchain via the defines `kt_timings=1` and `kt_trace=1`. The tags may also be picked up via the `tags` attribute
+defined directly on the rules."""
),
"coroutines": attr.string(
default = "enable",
@@ -151,7 +155,7 @@
api_version=None,
jvm_target=None,
coroutines=None,
- debug=0
+ debug=[]
):
"""Define a Kotlin JVM Toolchain, the name is used in the `toolchain` rule so can be used to register the toolchain
in the WORKSPACE file.
@@ -163,7 +167,7 @@
api_version = api_version,
jvm_target = jvm_target,
coroutines = coroutines,
- debug=debug,
+ debug = debug,
visibility = ["//visibility:public"]
)
native.toolchain(