Move implicits to toolchain and some other stuff (#92)
* move implicits to kotlin toolchain, tidy up srcs and fix bug, remove proto from workspace till 0.16
* Update README.md
straighten out comment.
diff --git a/.bazelproject b/.bazelproject
index 03a69f4..73d0819 100644
--- a/.bazelproject
+++ b/.bazelproject
@@ -17,6 +17,7 @@
.
targets:
+ -//docs/...
//kotlin/builder:for_ide
//:all_tests
//examples/...
diff --git a/README.md b/README.md
index 9bfe029..2c8f572 100644
--- a/README.md
+++ b/README.md
@@ -3,6 +3,8 @@
[Skydoc documentation](https://bazelbuild.github.io/rules_kotlin)
# Announcements
+* <b>Jun 29, 2018.</b> The commits from this date forward are compatible with bazel `>=0.14`. JDK9 host issues were
+ fixed as well some other deprecations. I recommend skipping `0.15.0` if you are on a Mac.
* <b>May 25, 2018.</b> Test "friend" support. A single friend dep can be provided to `kt_jvm_test` which allows the test
to access internal members of the module under test.
* <b>February 15, 2018.</b> Toolchains for the JVM rules. Currently this allow tweaking:
diff --git a/WORKSPACE b/WORKSPACE
index f7146f8..c69d24f 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -14,11 +14,11 @@
workspace(name="io_bazel_rules_kotlin")
load("//kotlin/internal:bootstrap.bzl",github_archive="github_archive")
-github_archive(
- name = "com_google_protobuf",
- repo = "google/protobuf",
- commit = "106ffc04be1abf3ff3399f54ccf149815b287dd9",
-)
+#github_archive(
+# name = "com_google_protobuf",
+# repo = "google/protobuf",
+# commit = "106ffc04be1abf3ff3399f54ccf149815b287dd9",
+#)
github_archive(
name = "build_bazel_rules_nodejs",
diff --git a/kotlin/builder/BUILD b/kotlin/builder/BUILD
index a268bbf..b14900b 100644
--- a/kotlin/builder/BUILD
+++ b/kotlin/builder/BUILD
@@ -23,7 +23,9 @@
# Common depset for the builder.
_COMMON_DEPS = [
- "//kotlin/builder/proto",
+ "//kotlin/builder/proto:deps",
+ "//kotlin/builder/proto:kotlin_model",
+ "//kotlin/builder/proto:worker",
"@com_github_jetbrains_kotlin//:preloader",
"@io_bazel_rules_kotlin_com_google_protobuf_protobuf_java//jar",
"@io_bazel_rules_kotlin_com_google_protobuf_protobuf_java_util//jar",
diff --git a/kotlin/builder/proto/BUILD b/kotlin/builder/proto/BUILD
index 5d5550f..8bc369b 100644
--- a/kotlin/builder/proto/BUILD
+++ b/kotlin/builder/proto/BUILD
@@ -12,45 +12,45 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-
-proto_library(
- name = "kotlin_model_proto",
- srcs = [":kotlin_model.proto"],
- visibility=["//visibility:public"]
-)
-
-java_proto_library(
- name = "kotlin_model_java_proto",
- deps = [":kotlin_model_proto"]
-)
-
-_PROTO_LIBS=["deps", "worker_protocol"]
-
-[proto_library(
- name="%s_proto" % lib,
- srcs=["%s.proto" % lib]
- ) for lib in _PROTO_LIBS]
-
-[java_proto_library(
- name="%s_java_proto" % lib,
- deps=["%s_proto" % lib],
- ) for lib in _PROTO_LIBS]
+# commented out till 0.16 is released. We aren't prebuilding the libraries at the moment so it's fine.
+#proto_library(
+# name = "kotlin_model_proto",
+# srcs = [":kotlin_model.proto"],
+# visibility=["//visibility:public"]
+#)
+#
+#java_proto_library(
+# name = "kotlin_model_java_proto",
+# deps = [":kotlin_model_proto"]
+#)
+#
+#_PROTO_LIBS=["deps", "worker_protocol"]
+#
+#[proto_library(
+# name="%s_proto" % lib,
+# srcs=["%s.proto" % lib]
+# ) for lib in _PROTO_LIBS]
+#
+#[java_proto_library(
+# name="%s_java_proto" % lib,
+# deps=["%s_proto" % lib],
+# ) for lib in _PROTO_LIBS]
+#
java_import(
- name = "proto",
- jars = [
- "jars/libdeps_proto-speed.jar",
- "jars/libworker_protocol_proto-speed.jar",
- "jars/libkotlin_model_proto-speed.jar"
- ],
+ name = "deps",
+ jars = ["jars/libdeps_proto-speed.jar"],
visibility = ["//kotlin/builder:__subpackages__"]
)
-filegroup(
- name = "files",
- srcs = [
- "jars/libdeps_proto-speed.jar",
- "jars/libworker_protocol_proto-speed.jar"
- ],
+java_import(
+ name = "worker",
+ jars = ["jars/libworker_protocol_proto-speed.jar"],
+ visibility = ["//kotlin/builder:__subpackages__"]
+)
+
+java_import(
+ name = "kotlin_model",
+ jars = ["jars/libkotlin_model_proto-speed.jar"],
visibility = ["//kotlin/builder:__subpackages__"]
)
\ No newline at end of file
diff --git a/kotlin/internal/compile.bzl b/kotlin/internal/compile.bzl
index b444c16..e08429a 100644
--- a/kotlin/internal/compile.bzl
+++ b/kotlin/internal/compile.bzl
@@ -18,7 +18,7 @@
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):
+def _kotlin_do_compile_action(ctx, rule_kind, output_jar, compile_jars, module_name, friend_paths, srcs):
"""Internal macro that sets up a Kotlin compile action.
This macro only supports a single Kotlin compile operation for a rule.
@@ -35,8 +35,7 @@
sourcegen_directory=_declare_output_directory(ctx, "jvm", "sourcegenfiles")
temp_directory=_declare_output_directory(ctx, "jvm", "temp")
-
- tc=ctx.toolchains[kt.defs.TOOLCHAIN_TYPE]
+ toolchain=ctx.toolchains[kt.defs.TOOLCHAIN_TYPE]
args = [
"--target_label", ctx.label,
@@ -51,21 +50,18 @@
"--output_jdeps", ctx.outputs.jdeps.path,
"--classpath", "\n".join([f.path for f in compile_jars.to_list()]),
"--kotlin_friend_paths", "\n".join(friend_paths.to_list()),
- "--kotlin_jvm_target", tc.jvm_target,
- "--kotlin_api_version", tc.api_version,
- "--kotlin_language_version", tc.language_version,
+ "--kotlin_jvm_target", toolchain.jvm_target,
+ "--kotlin_api_version", toolchain.api_version,
+ "--kotlin_language_version", toolchain.language_version,
"--kotlin_module_name", module_name,
- "--kotlin_passthrough_flags", "-Xcoroutines=%s" % tc.coroutines
+ "--kotlin_passthrough_flags", "-Xcoroutines=%s" % toolchain.coroutines
]
- if len(srcs) == 0 and len(src_jars) == 0:
- fail("srcs did not contain kotlin/java files or any srcjars")
+ if (len(srcs.kt) + len(srcs.java)) > 0:
+ args += ["--sources", "\n".join([s.path for s in (srcs.kt + srcs.java)])]
- if len(srcs) > 0:
- args += ["--sources", "\n".join(srcs)]
-
- if len(src_jars) > 0:
- args += ["--source_jars", "\n".join([sj.path for sj in src_jars])]
+ if len(srcs.src_jars) > 0:
+ args += ["--source_jars", "\n".join([sj.path for sj in srcs.src_jars])]
# Collect and prepare plugin descriptor for the worker.
plugin_info=plugins.merge_plugin_infos(ctx.attr.plugins + ctx.attr.deps)
@@ -76,19 +72,17 @@
args_file = ctx.actions.declare_file(ctx.label.name + ".jar-2.params")
ctx.actions.write(args_file, "\n".join(args))
- # When a stratetegy isn't provided for the worker and the workspace is fresh then certain deps are not available under
- # external/@com_github_jetbrains_kotlin/... that is why the classpath is added explicetly.
- compile_inputs = (
- depset([args_file]) +
- ctx.files.srcs +
- compile_jars +
- ctx.files._kotlin_compiler_classpath +
- ctx.files._kotlin_home +
- ctx.files._jdk)
+ progress_message = "Compiling Kotlin %s { kt: %d, java: %d, srcjars: %d }" % (
+ ctx.label,
+ len(srcs.kt),
+ len(srcs.java),
+ len(srcs.src_jars)
+ )
- ctx.action(
+ inputs, _, input_manifests = ctx.resolve_command(tools = [toolchain.kotlinbuilder])
+ ctx.actions.run(
mnemonic = "KotlinCompile",
- inputs = compile_inputs,
+ inputs = depset([args_file]) + inputs + ctx.files.srcs + compile_jars,
outputs = [
output_jar,
ctx.outputs.jdeps,
@@ -97,16 +91,17 @@
temp_directory,
generated_classes_directory
],
- executable = ctx.executable._kotlinw,
+ executable = toolchain.kotlinbuilder.files_to_run.executable,
execution_requirements = {"supports-workers": "1"},
arguments = ["@" + args_file.path],
- progress_message="Compiling %d Kotlin source files to %s" % (len(ctx.files.srcs), output_jar.short_path),
+ progress_message = progress_message,
+ input_manifests = input_manifests
)
def _select_std_libs(ctx):
- return ctx.files._kotlin_std
+ return ctx.toolchains[kt.defs.TOOLCHAIN_TYPE].jvm_stdlibs
-def _make_java_provider(ctx, input_deps=[], auto_deps=[], src_jars=[]):
+def _make_java_provider(ctx, srcs, input_deps=[], auto_deps=[]):
"""Creates the java_provider for a Kotlin target.
This macro is distinct from the kotlin_make_providers as collecting the java_info is useful before the DefaultInfo is
@@ -122,6 +117,7 @@
Returns:
A JavaInfo provider.
"""
+ runtime = ctx.toolchains[kt.defs.TOOLCHAIN_TYPE].jvm_runtime
deps=utils.collect_all_jars(input_deps)
exported_deps=utils.collect_all_jars(getattr(ctx.attr, "exports", []))
@@ -129,7 +125,7 @@
my_runtime_jars = exported_deps.transitive_runtime_jars + [ctx.outputs.jar]
my_transitive_compile_jars = my_compile_jars + deps.transitive_compile_time_jars + exported_deps.transitive_compile_time_jars + auto_deps
- my_transitive_runtime_jars = my_runtime_jars + deps.transitive_runtime_jars + exported_deps.transitive_runtime_jars + [ctx.file._kotlin_runtime] + auto_deps
+ my_transitive_runtime_jars = my_runtime_jars + deps.transitive_runtime_jars + exported_deps.transitive_runtime_jars + runtime + auto_deps
# collect the runtime jars from the runtime_deps attribute.
for jar in ctx.attr.runtime_deps:
@@ -139,13 +135,13 @@
use_ijar = False,
# A list or set of output source jars that contain the uncompiled source files including the source files
# generated by annotation processors if the case.
- source_jars= src_jars + utils.actions.maybe_make_srcsjar(ctx),
+ source_jars = utils.actions.maybe_make_srcsjar(ctx, srcs),
# A list or a set of jars that should be used at compilation for a given target.
compile_time_jars = my_compile_jars,
# A list or a set of jars that should be used at runtime for a given target.
- runtime_jars=my_runtime_jars,
- transitive_compile_time_jars= my_transitive_compile_jars,
- transitive_runtime_jars=my_transitive_runtime_jars
+ runtime_jars = my_runtime_jars,
+ transitive_compile_time_jars = my_transitive_compile_jars,
+ transitive_runtime_jars = my_transitive_runtime_jars
)
def _make_providers(ctx, java_info, module_name, transitive_files=depset(order="default")):
@@ -207,13 +203,10 @@
deps = ctx.attr.deps + getattr(ctx.attr, "friends", [])
- srcs = []
- src_jars = []
- for f in ctx.files.srcs:
- if f.path.endswith(".kt") or f.path.endswith(".java"):
- srcs.append(f.path)
- elif f.path.endswith(".srcjar"):
- src_jars.append(f)
+ srcs = utils.partition_srcs(ctx.files.srcs)
+
+ if (len(srcs.kt) + len(srcs.java) == 0) and len(srcs.src_jars) == 0:
+ fail("no sources provided")
# setup the compile action.
_kotlin_do_compile_action(
@@ -223,8 +216,7 @@
compile_jars = utils.collect_jars_for_compile(deps) + kotlin_auto_deps,
module_name = module_name,
friend_paths = friend_paths,
- srcs = srcs,
- src_jars = src_jars
+ srcs = srcs
)
# setup the merge action if needed.
@@ -232,7 +224,7 @@
utils.actions.fold_jars(ctx, output_jar, output_merge_list)
# create the java provider but the kotlin and default provider cannot be created here.
- return _make_java_provider(ctx, deps, kotlin_auto_deps, src_jars)
+ return _make_java_provider(ctx, srcs, deps, kotlin_auto_deps)
compile = struct(
compile_action = _compile_action,
diff --git a/kotlin/internal/utils.bzl b/kotlin/internal/utils.bzl
index d7890a4..fd34a66 100644
--- a/kotlin/internal/utils.bzl
+++ b/kotlin/internal/utils.bzl
@@ -30,6 +30,25 @@
module_name = (ctx.label.package.lstrip("/").replace("/","_") + "-" + ctx.label.name.replace("/", "_"))
return module_name
+def _partition_srcs(srcs):
+ kt_srcs = []
+ java_srcs = []
+ src_jars = []
+
+ for f in srcs:
+ if f.path.endswith(".kt"):
+ kt_srcs.append(f)
+ elif f.path.endswith(".java"):
+ java_srcs.append(f)
+ elif f.path.endswith(".srcjar"):
+ src_jars.append(f)
+
+ return struct (
+ kt = kt_srcs,
+ java = java_srcs,
+ src_jars = src_jars
+ )
+
# DEPSET UTILS #################################################################################################################################################
def _select_compile_jars(dep):
"""selects the correct compile time jar from a java provider"""
@@ -141,25 +160,32 @@
return resources_jar_output
# SRC JARS #####################################################################################################################################################
-def _maybe_make_srcsjar_action(ctx):
- if len(ctx.files.srcs) > 0:
+def _maybe_make_srcsjar_action(ctx, srcs):
+ source_files = srcs.kt + srcs.java
+ if (len(source_files) + len(srcs.src_jars)) > 0:
output_srcjar = ctx.actions.declare_file(ctx.label.name + "-sources.jar")
+
args = ["--output", output_srcjar.path]
- for i in ctx.files.srcs:
- args += ["--resources", i.path]
+
+ for sj in srcs.src_jars:
+ args += ["--sources", sj.path]
+
+ for sf in source_files:
+ args += ["--resources", sf.path]
ctx.action(
mnemonic = "KotlinPackageSources",
- inputs = ctx.files.srcs,
+ inputs = source_files + srcs.src_jars,
outputs = [output_srcjar],
executable = ctx.executable._singlejar,
arguments = args,
- progress_message="Creating Kotlin srcjar from %d srcs" % len(ctx.files.srcs),
+ progress_message="Creating Kotlin srcjar from %d srcs" % len(source_files),
)
return [output_srcjar]
else:
return []
+
# PACKAGE JARS #################################################################################################################################################
def _fold_jars_action(ctx, output_jar, input_jars):
args=["--output", output_jar.path]
@@ -213,5 +239,6 @@
collect_all_jars = _collect_all_jars,
collect_jars_for_compile = _collect_jars_for_compile,
restore_label = _restore_label,
- derive_module_name = _derive_module_name
+ derive_module_name = _derive_module_name,
+ partition_srcs = _partition_srcs
)
diff --git a/kotlin/kotlin.bzl b/kotlin/kotlin.bzl
index 91da083..2ecd9a5 100644
--- a/kotlin/kotlin.bzl
+++ b/kotlin/kotlin.bzl
@@ -119,52 +119,17 @@
)
load("//third_party/jvm:workspace.bzl", _maven_dependencies="maven_dependencies")
-# _kt.defs.KT_COMPILER_REPO can't be used till skydoc is removed
-KT_COMPILER_REPO="com_github_jetbrains_kotlin"
-
-
########################################################################################################################
# Rule Attributes
########################################################################################################################
_implicit_deps = {
- "_kotlin_compiler_classpath": attr.label_list(
- allow_files = True,
- default = [
- Label("@" + KT_COMPILER_REPO + "//:compiler"),
- Label("@" + KT_COMPILER_REPO + "//:reflect"),
- Label("@" + KT_COMPILER_REPO + "//:script-runtime"),
- ],
- ),
- "_kotlin_home": attr.label(
- default = Label("@" + KT_COMPILER_REPO + "//:home"),
- allow_files = True,
- cfg = "host",
- ),
- "_kotlinw": attr.label(
- default = Label("//kotlin/builder"),
- executable = True,
- cfg = "host",
- ),
- "_kotlin_runtime": attr.label(
- single_file = True,
- default = Label("@" + KT_COMPILER_REPO + "//:runtime"),
- ),
- "_kotlin_std": attr.label_list(default = [
- Label("@" + KT_COMPILER_REPO + "//:stdlib"),
- Label("@" + KT_COMPILER_REPO + "//:stdlib-jdk7"),
- Label("@" + KT_COMPILER_REPO + "//:stdlib-jdk8"),
- ]),
"_kotlin_toolchain": attr.label_list(
default = [
Label("@io_bazel_rules_kotlin//kotlin:kt_toolchain_ide_info"),
],
+ cfg="host",
allow_files = False,
),
- "_kotlin_reflect": attr.label(
- single_file = True,
- default =
- Label("@" + KT_COMPILER_REPO + "//:reflect"),
- ),
"_singlejar": attr.label(
executable = True,
cfg = "host",
@@ -183,12 +148,10 @@
default = Label("@bazel_tools//tools/jdk:java"),
allow_files = True,
),
- "_jdk": attr.label(
- default = Label("@bazel_tools//tools/jdk"),
+ "_java_stub_template": attr.label(
cfg = "host",
- allow_files = True,
+ default = Label("@kt_java_stub_template//file"),
),
- "_java_stub_template": attr.label(default = Label("@kt_java_stub_template//file")),
}
_common_attr = dict(_implicit_deps.items() + {
diff --git a/kotlin/toolchains.bzl b/kotlin/toolchains.bzl
index 9666b88..64359ab 100644
--- a/kotlin/toolchains.bzl
+++ b/kotlin/toolchains.bzl
@@ -43,8 +43,21 @@
```
"""
+_KT_COMPILER_REPO="com_github_jetbrains_kotlin"
+
# The toolchain rules are not made private, at least the jvm ones so that they may be introspected in Intelij.
_common_attrs = {
+ "kotlin_home": attr.label(
+ default = Label("@" + _KT_COMPILER_REPO + "//:home"),
+ allow_files = True,
+ cfg = "host"
+ ),
+ "kotlinbuilder": attr.label(
+ default = Label("//kotlin/builder"),
+ executable = True,
+ allow_files = True,
+ cfg = "host",
+ ),
"language_version": attr.string(
default = "1.2",
values = [
@@ -70,6 +83,17 @@
}
_kt_jvm_attrs = dict(_common_attrs.items() + {
+ "jvm_runtime": attr.label(
+ single_file = True,
+ default = Label("@" + _KT_COMPILER_REPO + "//:runtime"),
+ ),
+ "jvm_stdlibs": attr.label_list(
+ default = [
+ Label("@" + _KT_COMPILER_REPO + "//:stdlib"),
+ Label("@" + _KT_COMPILER_REPO + "//:stdlib-jdk7"),
+ Label("@" + _KT_COMPILER_REPO + "//:stdlib-jdk8"),
+ ]
+ ),
"jvm_target": attr.string(
default = "1.8",
values = [
@@ -84,8 +108,16 @@
label = _utils.restore_label(ctx.label),
language_version = ctx.attr.language_version,
api_version = ctx.attr.api_version,
+ coroutines = ctx.attr.coroutines,
+
jvm_target = ctx.attr.jvm_target,
- coroutines = ctx.attr.coroutines
+
+
+ kotlinbuilder = ctx.attr.kotlinbuilder,
+ kotlin_home = ctx.files.kotlin_home,
+
+ jvm_runtime = ctx.files.jvm_runtime,
+ jvm_stdlibs = ctx.files.jvm_stdlibs
)
return struct(providers=[toolchain])