Skip to content

Commit e51619c

Browse files
[infra] Use kotlin standard libraries from the toolchain, as opposed to hard coded. (bazelbuild#1225)
* Add stdlib to runtime * Allow setting std libs * Set stdlib builder from toolchain * disable automatically including the stdlib * Pass stdlibs to mergejdeps * omit stdlib and reflect from library and import targets * omit targets * Fix merge and remove js * Fix tests that need stdlib * Fix KotlinJvmTaskExecutorTest.testSimpleGeneratedNonJvmSourcesIgnored to check sources, not inputs * Keep runtime data for libraries * Add stblib to jdeps merge --------- Co-authored-by: Ben Lee <[email protected]>
1 parent 7c14a34 commit e51619c

File tree

14 files changed

+79
-43
lines changed

14 files changed

+79
-43
lines changed

.bazelproject

+1-9
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,7 @@ directories:
1818
.
1919

2020
targets:
21-
//:all_local_tests
22-
# These targets are built for the ide only. Primary purpose is to ensure the builder can build the targets, but it's
23-
# also a good way of testing the intellij plugin.
24-
//src/main/kotlin/io/bazel/kotlin/builder/tasks:tasks_for_ide
25-
//src/main/kotlin/io/bazel/kotlin/builder/utils:utils_for_ide
26-
//src/main/kotlin/io/bazel/kotlin/builder/toolchain:toolchain_for_ide
27-
//src/main/kotlin/io/bazel/kotlin/compiler:compiler_for_ide
28-
//kotlin:stardoc
29-
//src/main/starlark/core/repositories:all
21+
//...
3022

3123
test_sources:
3224
src/test/*

docs/kotlin.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -508,8 +508,8 @@ load("@rules_kotlin//kotlin:core.bzl", "define_kt_toolchain")
508508
define_kt_toolchain(<a href="#define_kt_toolchain-name">name</a>, <a href="#define_kt_toolchain-language_version">language_version</a>, <a href="#define_kt_toolchain-api_version">api_version</a>, <a href="#define_kt_toolchain-jvm_target">jvm_target</a>, <a href="#define_kt_toolchain-experimental_use_abi_jars">experimental_use_abi_jars</a>,
509509
<a href="#define_kt_toolchain-experimental_strict_kotlin_deps">experimental_strict_kotlin_deps</a>, <a href="#define_kt_toolchain-experimental_report_unused_deps">experimental_report_unused_deps</a>,
510510
<a href="#define_kt_toolchain-experimental_reduce_classpath_mode">experimental_reduce_classpath_mode</a>, <a href="#define_kt_toolchain-experimental_multiplex_workers">experimental_multiplex_workers</a>, <a href="#define_kt_toolchain-javac_options">javac_options</a>,
511-
<a href="#define_kt_toolchain-kotlinc_options">kotlinc_options</a>, <a href="#define_kt_toolchain-jacocorunner">jacocorunner</a>, <a href="#define_kt_toolchain-exec_compatible_with">exec_compatible_with</a>, <a href="#define_kt_toolchain-target_compatible_with">target_compatible_with</a>,
512-
<a href="#define_kt_toolchain-target_settings">target_settings</a>)
511+
<a href="#define_kt_toolchain-kotlinc_options">kotlinc_options</a>, <a href="#define_kt_toolchain-jvm_stdlibs">jvm_stdlibs</a>, <a href="#define_kt_toolchain-jvm_runtime">jvm_runtime</a>, <a href="#define_kt_toolchain-jacocorunner">jacocorunner</a>, <a href="#define_kt_toolchain-exec_compatible_with">exec_compatible_with</a>,
512+
<a href="#define_kt_toolchain-target_compatible_with">target_compatible_with</a>, <a href="#define_kt_toolchain-target_settings">target_settings</a>)
513513
</pre>
514514

515515
Define the Kotlin toolchain.
@@ -530,6 +530,8 @@ Define the Kotlin toolchain.
530530
| <a id="define_kt_toolchain-experimental_multiplex_workers"></a>experimental_multiplex_workers | <p align="center"> - </p> | `None` |
531531
| <a id="define_kt_toolchain-javac_options"></a>javac_options | <p align="center"> - </p> | `Label("@rules_kotlin//kotlin/internal:default_javac_options")` |
532532
| <a id="define_kt_toolchain-kotlinc_options"></a>kotlinc_options | <p align="center"> - </p> | `Label("@rules_kotlin//kotlin/internal:default_kotlinc_options")` |
533+
| <a id="define_kt_toolchain-jvm_stdlibs"></a>jvm_stdlibs | <p align="center"> - </p> | `None` |
534+
| <a id="define_kt_toolchain-jvm_runtime"></a>jvm_runtime | <p align="center"> - </p> | `None` |
533535
| <a id="define_kt_toolchain-jacocorunner"></a>jacocorunner | <p align="center"> - </p> | `None` |
534536
| <a id="define_kt_toolchain-exec_compatible_with"></a>exec_compatible_with | <p align="center"> - </p> | `None` |
535537
| <a id="define_kt_toolchain-target_compatible_with"></a>target_compatible_with | <p align="center"> - </p> | `None` |

examples/trivial/.bazelrc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
test --test_output=streamed

examples/trivial/BUILD

+13
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,16 @@ ktlint_config(
2727
experimental_rules_enabled = False,
2828
visibility = ["//visibility:public"],
2929
)
30+
31+
sh_test(
32+
name = "test_execution",
33+
srcs = ["test_execution.sh"],
34+
args = [
35+
"$(location //app:myapp)",
36+
],
37+
data = [
38+
"//app:myapp",
39+
"@bazel_tools//tools/bash/runfiles",
40+
],
41+
deps = [],
42+
)

examples/trivial/app/BUILD.bazel

+3
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,8 @@ ktlint_fix(
2525
java_binary(
2626
name = "myapp",
2727
main_class = "app.MyApp",
28+
visibility = [
29+
"//visibility:public",
30+
],
2831
runtime_deps = [":app_lib"],
2932
)

examples/trivial/test_execution.sh

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/bin/bash
2+
set -e -x
3+
4+
want='{data={foo={name=baz!, age=42}}}'
5+
got=$($1 | tr -d "\n")
6+
if [[ "$got" -eq "$want" ]]; then
7+
echo "Failed to execute"
8+
exit 1
9+
fi

kotlin/internal/jvm/compile.bzl

+8-3
Original file line numberDiff line numberDiff line change
@@ -360,11 +360,14 @@ def _run_merge_jdeps_action(ctx, toolchains, jdeps, outputs, deps):
360360
ctx.actions.run(
361361
mnemonic = mnemonic,
362362
inputs = inputs,
363-
tools = [toolchains.kt.jdeps_merger.files_to_run],
363+
tools = [toolchains.kt.jdeps_merger.files_to_run, toolchains.kt.jvm_stdlibs.compile_jars],
364364
outputs = [f for f in outputs.values()],
365365
executable = toolchains.kt.jdeps_merger.files_to_run.executable,
366366
execution_requirements = toolchains.kt.execution_requirements,
367-
arguments = [args],
367+
arguments = [
368+
ctx.actions.args().add_all(toolchains.kt.builder_args),
369+
args,
370+
],
368371
progress_message = progress_message,
369372
)
370373

@@ -471,6 +474,7 @@ def _run_kt_builder_action(
471474
"""Creates a KotlinBuilder action invocation."""
472475
kotlinc_options = ctx.attr.kotlinc_opts[KotlincOptions] if ctx.attr.kotlinc_opts else toolchains.kt.kotlinc_options
473476
javac_options = ctx.attr.javac_opts[JavacOptions] if ctx.attr.javac_opts else toolchains.kt.javac_options
477+
474478
args = _utils.init_args(ctx, rule_kind, associates.module_name, kotlinc_options)
475479

476480
for f, path in outputs.items():
@@ -497,6 +501,7 @@ def _run_kt_builder_action(
497501
omit_if_empty = True,
498502
uniquify = True,
499503
)
504+
500505
args.add_all(
501506
"--processorpath",
502507
annotation_processors,
@@ -563,7 +568,7 @@ def _run_kt_builder_action(
563568
toolchains.kt.execution_requirements,
564569
{"worker-key-mnemonic": mnemonic},
565570
),
566-
arguments = [args],
571+
arguments = [ctx.actions.args().add_all(toolchains.kt.builder_args), args],
567572
progress_message = progress_message,
568573
env = {
569574
"LC_CTYPE": "en_US.UTF-8", # For Java source files

kotlin/internal/toolchains.bzl

+25-21
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,3 @@
1-
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
2-
load("@rules_java//java:defs.bzl", "JavaInfo", "java_common")
3-
load(
4-
"//kotlin/internal:defs.bzl",
5-
_KT_COMPILER_REPO = "KT_COMPILER_REPO",
6-
_TOOLCHAIN_TYPE = "TOOLCHAIN_TYPE",
7-
)
8-
91
# Copyright 2018 The Bazel Authors. All rights reserved.
102
#
113
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,6 +11,13 @@ load(
1911
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2012
# See the License for the specific language governing permissions and
2113
# limitations under the License.
14+
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
15+
load("@rules_java//java:defs.bzl", "JavaInfo", "java_common")
16+
load(
17+
"//kotlin/internal:defs.bzl",
18+
_KT_COMPILER_REPO = "KT_COMPILER_REPO",
19+
_TOOLCHAIN_TYPE = "TOOLCHAIN_TYPE",
20+
)
2221
load(
2322
"//kotlin/internal:opts.bzl",
2423
"JavacOptions",
@@ -73,6 +72,11 @@ def _kotlin_toolchain_impl(ctx):
7372
debug = ctx.attr.debug,
7473
jvm_target = ctx.attr.jvm_target,
7574
kotlinbuilder = ctx.attr.kotlinbuilder,
75+
builder_args = [
76+
"--wrapper_script_flag=--main_advice_classpath=%s" % (
77+
":".join([f.path for f in ctx.files.jvm_stdlibs])
78+
),
79+
],
7680
jdeps_merger = ctx.attr.jdeps_merger,
7781
kotlin_home = ctx.attr.kotlin_home,
7882
jvm_stdlibs = java_common.merge(compile_time_providers + runtime_providers),
@@ -122,7 +126,7 @@ _kt_toolchain = rule(
122126
),
123127
"language_version": attr.string(
124128
doc = "this is the -language_version flag [see](https://kotlinlang.org/docs/reference/compatibility.html)",
125-
default = "2.0",
129+
default = "1.9",
126130
values = [
127131
"1.1",
128132
"1.2",
@@ -138,7 +142,7 @@ _kt_toolchain = rule(
138142
),
139143
"api_version": attr.string(
140144
doc = "this is the -api_version flag [see](https://kotlinlang.org/docs/reference/compatibility.html).",
141-
default = "2.0",
145+
default = "1.9",
142146
values = [
143147
"1.1",
144148
"1.2",
@@ -161,22 +165,11 @@ _kt_toolchain = rule(
161165
),
162166
"jvm_runtime": attr.label_list(
163167
doc = "The implicit jvm runtime libraries. This is internal.",
164-
default = [
165-
Label("//kotlin/compiler:kotlin-stdlib"),
166-
],
167168
providers = [JavaInfo],
168169
cfg = "target",
169170
),
170171
"jvm_stdlibs": attr.label_list(
171172
doc = "The jvm stdlibs. This is internal.",
172-
default = [
173-
Label("//kotlin/compiler:annotations"),
174-
Label("//kotlin/compiler:kotlin-stdlib"),
175-
Label("//kotlin/compiler:kotlin-stdlib-jdk7"),
176-
# JDK8 is being added blindly but I think we will probably not support bytecode levels 1.6 when the
177-
# repo stabelizes so this should be fine.
178-
Label("//kotlin/compiler:kotlin-stdlib-jdk8"),
179-
],
180173
providers = [JavaInfo],
181174
cfg = "target",
182175
),
@@ -301,6 +294,8 @@ def define_kt_toolchain(
301294
experimental_multiplex_workers = None,
302295
javac_options = Label("//kotlin/internal:default_javac_options"),
303296
kotlinc_options = Label("//kotlin/internal:default_kotlinc_options"),
297+
jvm_stdlibs = None,
298+
jvm_runtime = None,
304299
jacocorunner = None,
305300
exec_compatible_with = None,
306301
target_compatible_with = None,
@@ -327,6 +322,15 @@ def define_kt_toolchain(
327322
kotlinc_options = kotlinc_options,
328323
visibility = ["//visibility:public"],
329324
jacocorunner = jacocorunner,
325+
jvm_stdlibs = jvm_stdlibs if jvm_stdlibs != None else [
326+
Label("//kotlin/compiler:annotations"),
327+
Label("//kotlin/compiler:kotlin-stdlib"),
328+
Label("//kotlin/compiler:kotlin-stdlib-jdk7"),
329+
Label("//kotlin/compiler:kotlin-stdlib-jdk8"),
330+
],
331+
jvm_runtime = jvm_runtime if jvm_runtime != None else [
332+
Label("//kotlin/compiler:kotlin-stdlib"),
333+
],
330334
)
331335
native.toolchain(
332336
name = name,

src/main/kotlin/io/bazel/kotlin/builder/BUILD

+2-4
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,11 @@ java_library(
1717
name = "builder",
1818
srcs = glob(["*.java"]),
1919
visibility = ["//src:__subpackages__"],
20-
runtime_deps = [
21-
"//kotlin/compiler:kotlin-stdlib-jdk7",
22-
"//kotlin/compiler:kotlin-stdlib-jdk8",
23-
],
2420
deps = [
2521
"//kotlin/compiler:annotations",
2622
"//kotlin/compiler:kotlin-stdlib",
23+
"//kotlin/compiler:kotlin-stdlib-jdk7",
24+
"//kotlin/compiler:kotlin-stdlib-jdk8",
2725
"//src/main/kotlin/io/bazel/kotlin/builder/tasks",
2826
"//src/main/kotlin/io/bazel/kotlin/builder/toolchain",
2927
"//src/main/kotlin/io/bazel/kotlin/builder/utils",

src/main/kotlin/io/bazel/kotlin/test/BazelIntegrationTestRunner.kt

+1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ object BazelIntegrationTestRunner {
9090
"test",
9191
version.workspaceFlag(bzlmod),
9292
"--override_repository=rules_kotlin=$unpack",
93+
"--test_output=all",
9394
"//...",
9495
).onFailThrow()
9596
}

src/main/kotlin/shade.jarjar

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
rule dagger.** io.bazel.kotlin.builder.dagger.@1
22
rule com.google.common.** io.bazel.kotlin.builder.guava.@1
3+
zap kotlin.**

src/test/kotlin/io/bazel/kotlin/builder/KotlinAbstractTestBuilder.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ private <R> R runCompileTask(
161161
ByteArrayOutputStream out = new ByteArrayOutputStream();
162162
try (PrintStream outputStream = new PrintStream(out)) {
163163
return operation.apply(new CompilationTaskContext(info, outputStream,
164-
instanceRoot().toAbsolutePath().toString() + File.separator), task);
164+
instanceRoot().toAbsolutePath() + File.separator), task);
165165
} finally {
166166
outLines = unmodifiableList(
167167
new BufferedReader(new InputStreamReader(new ByteArrayInputStream(out.toByteArray())))

src/test/kotlin/io/bazel/kotlin/builder/KotlinJvmTestBuilder.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public final class KotlinJvmTestBuilder extends KotlinAbstractTestBuilder<JvmCom
5555
DirectoryType.TEMP,
5656
DirectoryType.COVERAGE_METADATA);
5757

58-
private TaskBuilder taskBuilderInstance = new TaskBuilder();
58+
private final TaskBuilder taskBuilderInstance = new TaskBuilder();
5959
private static KotlinBuilderTestComponent component;
6060

6161
@Override
@@ -64,6 +64,11 @@ void setupForNext(CompilationTaskInfo.Builder taskInfo) {
6464

6565
DirectoryType.createAll(instanceRoot(), ALL_DIRECTORY_TYPES);
6666

67+
taskBuilder.getInputsBuilder()
68+
.addClasspath(KOTLIN_STDLIB.singleCompileJar())
69+
.addClasspath(KOTLIN_STDLIB_JDK7.singleCompileJar())
70+
.addClasspath(KOTLIN_STDLIB_JDK8.singleCompileJar());
71+
6772
taskBuilder
6873
.getDirectoriesBuilder()
6974
.setClasses(directory(DirectoryType.CLASSES).toAbsolutePath().toString())

src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinJvmTaskExecutorTest.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,13 @@ class KotlinJvmTaskExecutorTest {
3636
)
3737
val compileTask = ctx.buildTask()
3838

39-
assertFalse(compileTask.hasInputs())
39+
assertTrue(compileTask.inputs.javaSourcesList.isEmpty())
40+
assertTrue(compileTask.inputs.kotlinSourcesList.isEmpty())
4041

4142
val expandedCompileTask = compileTask.expandWithGeneratedSources()
4243

43-
assertFalse(compileTask.hasInputs())
44+
assertTrue(compileTask.inputs.javaSourcesList.isEmpty())
45+
assertTrue(compileTask.inputs.kotlinSourcesList.isEmpty())
4446

4547
assertTrue(expandedCompileTask.hasInputs())
4648
assertNotNull(expandedCompileTask.inputs.javaSourcesList.find { path ->

0 commit comments

Comments
 (0)