Skip to content

Commit 1d6cc4f

Browse files
authored
Add scrooge toolchain (#1116)
* Add scrooge toolchain * Rename dep provider for scrooge generator * Migrate thrift and scrooge rules cfg from host to exec * Add test to ensure scrooge host and target deps are not mixed
1 parent 95c1c1a commit 1d6cc4f

File tree

9 files changed

+186
-45
lines changed

9 files changed

+186
-45
lines changed

src/scala/io/bazel/rules_scala/scrooge_support/BUILD

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,14 @@ load("//scala:scala.bzl", "scala_library")
22

33
scala_library(
44
name = "compiler",
5-
srcs = ["Compiler.scala"],
5+
srcs = [
6+
"Compiler.scala",
7+
"FocusedZipImporter.scala",
8+
],
69
# util_core is still needed as a dep for older versions of scrooge
710
unused_dependency_checker_mode = "off",
811
visibility = ["//visibility:public"],
912
deps = [
10-
":focused_zip_importer",
11-
"//external:io_bazel_rules_scala/dependency/scala/parser_combinators",
12-
"//external:io_bazel_rules_scala/dependency/thrift/scrooge_generator",
13-
"//external:io_bazel_rules_scala/dependency/thrift/util_core",
14-
"//external:io_bazel_rules_scala/dependency/thrift/util_logging",
15-
],
16-
)
17-
18-
scala_library(
19-
name = "focused_zip_importer",
20-
srcs = ["FocusedZipImporter.scala"],
21-
visibility = ["//visibility:public"],
22-
deps = [
23-
"//external:io_bazel_rules_scala/dependency/thrift/scrooge_generator",
13+
"//twitter_scrooge:compiler_classpath",
2414
],
2515
)

src/scala/scripts/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ scala_library(
55
srcs = ["ScroogeWorker.scala"],
66
visibility = ["//visibility:public"],
77
deps = [
8-
"//external:io_bazel_rules_scala/dependency/thrift/scrooge_generator",
98
"//src/java/io/bazel/rulesscala/io_utils",
109
"//src/java/io/bazel/rulesscala/jar",
1110
"//src/java/io/bazel/rulesscala/worker",
1211
"//src/scala/io/bazel/rules_scala/scrooge_support:compiler",
12+
"//twitter_scrooge:scrooge_generator_classpath",
1313
],
1414
)
1515

test/shell/test_deps.sh

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,21 @@ scala_pb_library_targets_do_not_have_host_deps() {
3131
fi
3232
}
3333

34+
scrooge_library_targets_do_not_have_host_deps() {
35+
set -e
36+
bazel build //test/src/main/scala/scalarules/test/twitter_scrooge:test_binary_to_ensure_no_host_deps
37+
set +e
38+
find bazel-bin/test/src/main/scala/scalarules/test/twitter_scrooge/test_binary_to_ensure_no_host_deps.runfiles -name '*.jar' -exec readlink {} \; | grep 'bazel-out/host'
39+
RET=$?
40+
set -e
41+
if [ "$RET" == "0" ]; then
42+
echo "Host deps exist in output of target:"
43+
echo "Possibly toolchains limitation?"
44+
find bazel-bin/test/proto/test_binary_to_ensure_no_host_deps.runfiles -name '*.jar' -exec readlink {} \; | grep 'bazel-out/host'
45+
exit 1
46+
fi
47+
}
48+
3449
test_scala_import_expect_failure_on_missing_direct_deps_warn_mode() {
3550
dependency_target1='//test_expect_failure/scala_import:cats'
3651
dependency_target2='//test_expect_failure/scala_import:guava'
@@ -57,5 +72,6 @@ test_plus_one_ast_analyzer_strict_deps() {
5772
$runner test_scala_import_library_passes_labels_of_direct_deps
5873
$runner test_plus_one_deps_only_works_for_java_info_targets
5974
$runner scala_pb_library_targets_do_not_have_host_deps
75+
$runner scrooge_library_targets_do_not_have_host_deps
6076
$runner test_scala_import_expect_failure_on_missing_direct_deps_warn_mode
6177
$runner test_plus_one_ast_analyzer_strict_deps

test/src/main/scala/scalarules/test/twitter_scrooge/BUILD

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,14 @@ scala_library(
218218
deps = [":justscrooge3"],
219219
)
220220

221+
scala_binary(
222+
name = "test_binary_to_ensure_no_host_deps",
223+
main_class = "scalarules.test.twitter_scrooge.JustScrooge2b",
224+
deps = [
225+
":justscrooge2b",
226+
],
227+
)
228+
221229
scala_binary(
222230
name = "twodeep_binary",
223231
main_class = "scalarules.test.twitter_scrooge.Twodeep",

thrift/thrift.bzl

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,11 @@ def _thrift_library_impl(ctx):
4343

4444
if len(found_prefixes) == 0:
4545
fail(
46-
"could not find prefix from available prefixes: {prefixes} in the common prefix: {common_prefix}"
47-
.format(prefixes = ",".join(prefixes), common_prefix = common_prefix),
46+
"could not find prefix from available prefixes: {prefixes} in the common prefix: {common_prefix}".format(prefixes = ",".join(prefixes), common_prefix = common_prefix),
4847
)
4948
elif len(found_prefixes) > 1:
5049
fail(
51-
"Too many not prefixes found, matched: {found_prefixes} in the common prefix: {common_prefix}"
52-
.format(
50+
"Too many not prefixes found, matched: {found_prefixes} in the common prefix: {common_prefix}".format(
5351
found_prefixes = ",".join(found_prefixes),
5452
common_prefix = common_prefix,
5553
),
@@ -164,7 +162,7 @@ thrift_library = rule(
164162
"external_jars": attr.label_list(allow_files = [".jar"]),
165163
"_zipper": attr.label(
166164
executable = True,
167-
cfg = "host",
165+
cfg = "exec",
168166
default = Label("@bazel_tools//tools/zip:zipper"),
169167
allow_files = True,
170168
),

twitter_scrooge/BUILD

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
load("//twitter_scrooge/toolchain:toolchain.bzl", "export_scrooge_deps", "scrooge_toolchain")
2+
load("//scala:providers.bzl", "declare_deps_provider")
3+
4+
scrooge_toolchain(
5+
name = "scrooge_toolchain_impl",
6+
visibility = ["//visibility:public"],
7+
)
8+
9+
toolchain(
10+
name = "scrooge_toolchain",
11+
toolchain = ":scrooge_toolchain_impl",
12+
toolchain_type = "@io_bazel_rules_scala//twitter_scrooge/toolchain:scrooge_toolchain_type",
13+
visibility = ["//visibility:public"],
14+
)
15+
16+
declare_deps_provider(
17+
name = "aspect_compile_classpath_provider",
18+
deps_id = "aspect_compile_classpath",
19+
visibility = ["//visibility:public"],
20+
deps = [
21+
"//external:io_bazel_rules_scala/dependency/thrift/javax_annotation_api",
22+
"//external:io_bazel_rules_scala/dependency/thrift/libthrift",
23+
"//external:io_bazel_rules_scala/dependency/thrift/scrooge_core",
24+
"//external:io_bazel_rules_scala/dependency/thrift/util_core",
25+
"//scala/private/toolchain_deps:scala_library_classpath",
26+
],
27+
)
28+
29+
declare_deps_provider(
30+
name = "compile_classpath_provider",
31+
deps_id = "compile_classpath",
32+
visibility = ["//visibility:public"],
33+
deps = [
34+
"//external:io_bazel_rules_scala/dependency/thrift/libthrift",
35+
"//external:io_bazel_rules_scala/dependency/thrift/scrooge_core",
36+
"//scala/private/toolchain_deps:scala_library_classpath",
37+
],
38+
)
39+
40+
declare_deps_provider(
41+
name = "scrooge_generator_classpath_provider",
42+
deps_id = "scrooge_generator_classpath",
43+
visibility = ["//visibility:public"],
44+
deps = [
45+
"//external:io_bazel_rules_scala/dependency/thrift/scrooge_generator",
46+
],
47+
)
48+
49+
declare_deps_provider(
50+
name = "compiler_classpath_provider",
51+
deps_id = "compiler_classpath",
52+
visibility = ["//visibility:public"],
53+
deps = [
54+
"//external:io_bazel_rules_scala/dependency/thrift/scrooge_generator",
55+
"//external:io_bazel_rules_scala/dependency/thrift/util_core",
56+
"//external:io_bazel_rules_scala/dependency/thrift/util_logging",
57+
"//scala/private/toolchain_deps:parser_combinators",
58+
],
59+
)
60+
61+
export_scrooge_deps(
62+
name = "compile_classpath",
63+
deps_id = "compile_classpath",
64+
visibility = ["//visibility:public"],
65+
)
66+
67+
export_scrooge_deps(
68+
name = "aspect_compile_classpath",
69+
deps_id = "aspect_compile_classpath",
70+
visibility = ["//visibility:public"],
71+
)
72+
73+
export_scrooge_deps(
74+
name = "scrooge_generator_classpath",
75+
deps_id = "scrooge_generator_classpath",
76+
visibility = ["//visibility:public"],
77+
)
78+
79+
export_scrooge_deps(
80+
name = "compiler_classpath",
81+
deps_id = "compiler_classpath",
82+
visibility = ["//visibility:public"],
83+
)

twitter_scrooge/toolchain/BUILD

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
toolchain_type(
2+
name = "scrooge_toolchain_type",
3+
visibility = ["//visibility:public"],
4+
)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
load("@io_bazel_rules_scala//scala:providers.bzl", "DepsInfo")
2+
load(
3+
"@io_bazel_rules_scala//scala/private/toolchain_deps:toolchain_deps.bzl",
4+
"expose_toolchain_deps",
5+
)
6+
7+
def _scrooge_toolchain_impl(ctx):
8+
toolchain = platform_common.ToolchainInfo(
9+
dep_providers = ctx.attr.dep_providers,
10+
)
11+
return [toolchain]
12+
13+
scrooge_toolchain = rule(
14+
_scrooge_toolchain_impl,
15+
attrs = {
16+
"dep_providers": attr.label_list(
17+
default = [
18+
"@io_bazel_rules_scala//twitter_scrooge:compile_classpath_provider",
19+
"@io_bazel_rules_scala//twitter_scrooge:aspect_compile_classpath_provider",
20+
"@io_bazel_rules_scala//twitter_scrooge:compiler_classpath_provider",
21+
"@io_bazel_rules_scala//twitter_scrooge:scrooge_generator_classpath_provider",
22+
],
23+
providers = [DepsInfo],
24+
),
25+
},
26+
)
27+
28+
def _export_scrooge_deps_impl(ctx):
29+
return expose_toolchain_deps(
30+
ctx,
31+
"@io_bazel_rules_scala//twitter_scrooge/toolchain:scrooge_toolchain_type",
32+
)
33+
34+
export_scrooge_deps = rule(
35+
_export_scrooge_deps_impl,
36+
attrs = {
37+
"deps_id": attr.string(
38+
mandatory = True,
39+
),
40+
},
41+
toolchains = ["@io_bazel_rules_scala//twitter_scrooge/toolchain:scrooge_toolchain_type"],
42+
)

twitter_scrooge/twitter_scrooge.bzl

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ load(
2323
"merge_thrift_infos",
2424
)
2525
load("//third_party/repositories:repositories.bzl", "repositories")
26+
load(
27+
"@io_bazel_rules_scala//scala/private/toolchain_deps:toolchain_deps.bzl",
28+
"find_deps_info_on",
29+
"java_info_for_deps",
30+
)
2631

2732
_jar_extension = ".jar"
2833

@@ -137,6 +142,8 @@ def twitter_scrooge(
137142
actual = "@io_bazel_rules_scala_javax_annotation_api",
138143
)
139144

145+
native.register_toolchains("@io_bazel_rules_scala//twitter_scrooge:scrooge_toolchain")
146+
140147
def _colon_paths(data):
141148
return ":".join([f.path for f in sorted(data)])
142149

@@ -416,27 +423,15 @@ def _scrooge_java_aspect_impl(target, ctx):
416423
common_attrs = {
417424
"_pluck_scrooge_scala": attr.label(
418425
executable = True,
419-
cfg = "host",
426+
cfg = "exec",
420427
default = Label("//src/scala/scripts:scrooge_worker"),
421428
allow_files = True,
422429
),
423430
"_implicit_compile_deps": attr.label_list(
424431
providers = [JavaInfo],
425432
default = [
426433
Label(
427-
"//scala/private/toolchain_deps:scala_library_classpath",
428-
),
429-
Label(
430-
"//external:io_bazel_rules_scala/dependency/thrift/libthrift",
431-
),
432-
Label(
433-
"//external:io_bazel_rules_scala/dependency/thrift/scrooge_core",
434-
),
435-
Label(
436-
"//external:io_bazel_rules_scala/dependency/thrift/util_core",
437-
),
438-
Label(
439-
"//external:io_bazel_rules_scala/dependency/thrift/javax_annotation_api",
434+
"@io_bazel_rules_scala//twitter_scrooge:aspect_compile_classpath",
440435
),
441436
],
442437
),
@@ -457,11 +452,15 @@ scrooge_scala_aspect = aspect(
457452
default = Label(
458453
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac",
459454
),
455+
cfg = "exec",
460456
),
461457
},
462458
),
463459
required_aspect_providers = common_aspect_providers,
464-
toolchains = ["@io_bazel_rules_scala//scala:toolchain_type"],
460+
toolchains = [
461+
"@io_bazel_rules_scala//scala:toolchain_type",
462+
"@io_bazel_rules_scala//twitter_scrooge/toolchain:scrooge_toolchain_type",
463+
],
465464
)
466465

467466
scrooge_java_aspect = aspect(
@@ -471,11 +470,17 @@ scrooge_java_aspect = aspect(
471470
common_attrs,
472471
{
473472
"_java_toolchain": attr.label(default = Label("@bazel_tools//tools/jdk:current_java_toolchain")),
474-
"_host_javabase": attr.label(default = Label("@bazel_tools//tools/jdk:current_java_runtime"), cfg = "host"),
473+
"_host_javabase": attr.label(
474+
default = Label("@bazel_tools//tools/jdk:current_java_runtime"),
475+
cfg = "exec",
476+
),
475477
},
476478
),
477479
required_aspect_providers = common_aspect_providers,
478-
toolchains = ["@io_bazel_rules_scala//scala:toolchain_type"],
480+
toolchains = [
481+
"@io_bazel_rules_scala//scala:toolchain_type",
482+
"@io_bazel_rules_scala//twitter_scrooge/toolchain:scrooge_toolchain_type",
483+
],
479484
fragments = ["java"],
480485
)
481486

@@ -545,16 +550,11 @@ scrooge_scala_import = rule(
545550
providers = [JavaInfo],
546551
default = [
547552
Label(
548-
"//scala/private/toolchain_deps:scala_library_classpath",
549-
),
550-
Label(
551-
"//external:io_bazel_rules_scala/dependency/thrift/libthrift",
552-
),
553-
Label(
554-
"//external:io_bazel_rules_scala/dependency/thrift/scrooge_core",
553+
"@io_bazel_rules_scala//twitter_scrooge:compile_classpath",
555554
),
556555
],
557556
),
558557
},
559558
provides = [ThriftInfo, JavaInfo, ScroogeImport],
559+
toolchains = ["@io_bazel_rules_scala//twitter_scrooge/toolchain:scrooge_toolchain_type"],
560560
)

0 commit comments

Comments
 (0)