From d47b079fc60d7d4581fafba51fe72aa327fee648 Mon Sep 17 00:00:00 2001 From: Oscar Boykin Date: Sat, 16 Jun 2018 12:19:10 -1000 Subject: [PATCH 1/7] WIP: aspect-based scrooge implementation --- thrift/thrift.bzl | 41 ++-- tools/bazel.rc | 4 +- twitter_scrooge/twitter_scrooge.bzl | 283 ++++++++++------------------ 3 files changed, 115 insertions(+), 213 deletions(-) diff --git a/thrift/thrift.bzl b/thrift/thrift.bzl index c1b8a60ac..fa5c9eff8 100644 --- a/thrift/thrift.bzl +++ b/thrift/thrift.bzl @@ -5,10 +5,16 @@ _thrift_filetype = FileType([".thrift"]) ThriftInfo = provider(fields = [ "srcs", # The source files in this rule "transitive_srcs", # the transitive version of the above - "external_jars", # external jars of thrift files - "transitive_external_jars" # transitive version of the above ]) +def empty_thrift_info(): + return ThriftInfo(srcs = depset(), transitive_srcs = depset()) + +def merge_thrift_infos(tis): + return ThriftInfo( + srcs = depset(transitive = [t.srcs for t in tis]), + transitive_srcs = depset(transitive = [t.transitive_srcs for t in tis])) + def _common_prefix(strings): pref = None for s in strings: @@ -62,7 +68,6 @@ def _thrift_library_impl(ctx): zipper_arg_path = ctx.actions.declare_file( "%s_zipper_args" % ctx.outputs.libarchive.path) ctx.actions.write(zipper_arg_path, zipper_args) - _valid_thrift_deps(ctx.attr.deps) # We move the files and touch them so that the output file is a purely deterministic # product of the _content_ of the inputs cmd = """ @@ -96,20 +101,18 @@ rm {out}.contents progress_message = "making empty thrift archive %s" % ctx.label, ) + src_files = [ctx.outputs.libarchive] + for f in ctx.attr.external_jars: + src_files.extend(f.files.to_list()) + + srcs_depset = depset(src_files) transitive_srcs = depset( - [ctx.outputs.libarchive], - transitive = _collect_thrift_srcs(ctx.attr.deps)) - jarfiles = _collect_thrift_external_jars(ctx.attr.deps) - for jar in ctx.attr.external_jars: - jarfiles.append(depset(jar.files)) - transitive_external_jars = depset(transitive = jarfiles) + transitive = _collect_thrift_srcs(ctx.attr.deps) + [srcs_depset]) return [ ThriftInfo( - srcs = ctx.outputs.libarchive, + srcs = srcs_depset, transitive_srcs = transitive_srcs, - external_jars = ctx.attr.external_jars, - transitive_external_jars = transitive_external_jars, ) ] @@ -119,17 +122,6 @@ def _collect_thrift_srcs(targets): ds.append(target[ThriftInfo].transitive_srcs) return ds -def _collect_thrift_external_jars(targets): - ds = [] - for target in targets: - ds.append(target[ThriftInfo].transitive_external_jars) - return ds - -def _valid_thrift_deps(targets): - for target in targets: - if not ThriftInfo in target: - fail("thrift_library can only depend on thrift_library", target) - # Some notes on the raison d'etre of thrift_library vs. code gen specific # targets. The idea is to be able to separate concerns -- thrift_library is # concerned purely with the ownership and organization of thrift files. It @@ -142,7 +134,7 @@ thrift_library = rule( implementation = _thrift_library_impl, attrs = { "srcs": attr.label_list(allow_files = _thrift_filetype), - "deps": attr.label_list(), + "deps": attr.label_list(providers = [ThriftInfo]), #TODO this is not necessarily the best way to do this... the goal # is that we want thrifts to be able to be imported via an absolute # path. But the thrift files have no clue what part of their path @@ -168,4 +160,5 @@ thrift_library = rule( allow_files = True) }, outputs = {"libarchive": "lib%{name}.jar"}, + provides = [ThriftInfo], ) diff --git a/tools/bazel.rc b/tools/bazel.rc index 451816bf6..f932a0086 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -1,2 +1,2 @@ -build --experimental_local_disk_cache -build --experimental_local_disk_cache_path=.bazel_cache +#build --experimental_local_disk_cache +#build --experimental_local_disk_cache_path=.bazel_cache diff --git a/twitter_scrooge/twitter_scrooge.bzl b/twitter_scrooge/twitter_scrooge.bzl index 6dda175d4..d080f1a39 100644 --- a/twitter_scrooge/twitter_scrooge.bzl +++ b/twitter_scrooge/twitter_scrooge.bzl @@ -11,7 +11,10 @@ load( load("//scala/private:common.bzl", "write_manifest", "collect_srcjars", "collect_jars") -load("//thrift:thrift.bzl", "ThriftInfo") +load("//thrift:thrift.bzl", + "ThriftInfo", + "merge_thrift_infos", + "empty_thrift_info") _jar_filetype = FileType([".jar"]) @@ -72,134 +75,54 @@ def twitter_scrooge(): name = 'io_bazel_rules_scala/dependency/thrift/util_logging', actual = '@util_logging//jar') -def _collect_transitive_srcs(targets): - r = [] - for target in targets: - if ThriftInfo in target: - r.append(target[ThriftInfo].transitive_srcs) - return depset(transitive = r) - -def _collect_owned_srcs(targets): - r = [] - for _target in targets: - if hasattr(_target, "extra_information"): - for target in _target.extra_information: - if hasattr(target, "scrooge_srcjar"): - r.append(target.scrooge_srcjar.transitive_owned_srcs) - return depset(transitive = r) - -def _collect_external_jars(targets): - r = [] - for target in targets: - if ThriftInfo in target: - thrift = target[ThriftInfo] - for jar in thrift.external_jars: - r.extend(_jar_filetype.filter(jar.files)) - r.extend(_jar_filetype.filter(thrift.transitive_external_jars)) - return depset(r) - -def collect_extra_srcjars(targets): - srcjar = [] - srcjars = [] - for target in targets: - if hasattr(target, "extra_information"): - for _target in target.extra_information: - srcjar.append(_target.srcjars.srcjar) - srcjars.append(_target.srcjars.transitive_srcjars) - return depset(srcjar, transitive = srcjars) - -def _collect_immediate_srcs(targets): - srcs = [] - for target in targets: - if ThriftInfo in target: - srcs.append(target[ThriftInfo].srcs) - return depset(srcs) - -def _assert_set_is_subset(want, have): - missing = [] - for e in want: - if e not in have: - missing.append(e) - if len(missing) > 0: - fail( - 'scrooge_srcjar target must depend on scrooge_srcjar targets sufficient to ' - + 'cover the transitive graph of thrift files. Uncovered sources: ' + - str(missing)) def _colon_paths(data): return ':'.join([f.path for f in sorted(data)]) -def _list_to_map(items): - map_result = {} - for item in items: - map_result[item] = None - return map_result - -def _gen_scrooge_srcjar_impl(ctx): - remote_jars = [] - for target in ctx.attr.remote_jars: - remote_jars.append(depset(_jar_filetype.filter(target.files))) - - # deduplicate these - remote_jars = depset(transitive = remote_jars).to_list() - - # These are JARs that are declared externally and only have Thrift files - # in them. - external_jars = _collect_external_jars(ctx.attr.deps).to_list() - - # These are the thrift sources whose generated code we will "own" as a target - immediate_thrift_srcs = _collect_immediate_srcs(ctx.attr.deps).to_list() - - # This is the set of sources which is covered by any scala_library - # or scala_scrooge_gen targets that are depended on by this. This is - # necessary as we only compile the sources we own, and rely on other - # targets compiling the rest (for the benefit of caching and correctness). - transitive_owned_srcs = _collect_owned_srcs(ctx.attr.deps) - - # These are the thrift sources in the dependency graph. They are necessary - # to generate the code, but are not "owned" by this target and will not - # be in the resultant source jar - transitive_thrift_srcs = depset(transitive = [ - transitive_owned_srcs, - _collect_transitive_srcs(ctx.attr.deps) - ]).to_list() - - only_transitive_thrift_srcs = [] - for src in transitive_thrift_srcs: - if src not in _list_to_map(immediate_thrift_srcs): - only_transitive_thrift_srcs.append(src) +ScroogeAspectInfo = provider( + fields = [ + "thrift_info", + "src_jars", + "java_info", + ]) + +ScroogeInfo = provider( + fields = [ + "aspect_info", + ] +) - # We want to ensure that the thrift sources which we do not own (but need - # in order to generate code) have targets which will compile them. - _assert_set_is_subset( - _list_to_map(only_transitive_thrift_srcs), - _list_to_map(transitive_owned_srcs.to_list())) +def merge_scrooge_aspect_info(scrooges): + return ScroogeAspectInfo( + src_jars = depset(transitive = [s.src_jars for s in scrooges]), + thrift_info = merge_thrift_infos([s.thrift_info for s in scrooges]), + java_info = java_common.merge([s.java_info for s in scrooges])) +def _compile_to_scala(ctx, label, compile_thrifts, include_thrifts, jar_output): # bazel worker arguments cannot be empty so we pad to ensure non-empty # and drop it off on the other side # https://github.com/bazelbuild/bazel/issues/3329 worker_arg_pad = "_" path_content = "\n".join([ worker_arg_pad + _colon_paths(ps) for ps in [ - immediate_thrift_srcs, only_transitive_thrift_srcs, remote_jars, - external_jars + compile_thrifts, include_thrifts, [], [] ] ]) worker_content = "{output}\n{paths}\n{flags}".format( - output = ctx.outputs.srcjar.path, + output = jar_output.path, paths = path_content, flags = worker_arg_pad + ':'.join([ - '--with-finagle' if ctx.attr.with_finagle else '', + # '--with-finagle' if ctx.attr.with_finagle else '', + '' ])) argfile = ctx.actions.declare_file( - "%s_worker_input" % ctx.label.name, sibling = ctx.outputs.srcjar) + "%s_worker_input" % label.name, sibling = jar_output) ctx.actions.write(output = argfile, content = worker_content) ctx.actions.run( executable = ctx.executable._pluck_scrooge_scala, - inputs = remote_jars + only_transitive_thrift_srcs + external_jars + - immediate_thrift_srcs + [argfile], - outputs = [ctx.outputs.srcjar], + inputs = compile_thrifts + include_thrifts + [argfile], + outputs = [jar_output], mnemonic = "ScroogeRule", progress_message = "creating scrooge files %s" % ctx.label, execution_requirements = {"supports-workers": "1"}, @@ -211,96 +134,82 @@ def _gen_scrooge_srcjar_impl(ctx): # In either case (worker or not), they will be jvm flags which will # be correctly handled since the executable is a jvm app that will # consume the flags on startup. - arguments = ["--jvm_flag=%s" % flag for flag in ctx.attr.jvm_flags] + - ["@" + argfile.path], + #arguments = ["--jvm_flag=%s" % flag for flag in ctx.attr.jvm_flags] + + arguments = ["@" + argfile.path], ) - deps_jars = collect_jars(ctx.attr.deps) - - scalaattr = struct( - outputs = None, - compile_jars = deps_jars.compile_jars, - transitive_runtime_jars = deps_jars.transitive_runtime_jars, - ) - - transitive_srcjars = depset(transitive = [ - collect_srcjars(ctx.attr.deps), - collect_extra_srcjars(ctx.attr.deps) - ]) - - srcjarsattr = struct( - srcjar = ctx.outputs.srcjar, - transitive_srcjars = transitive_srcjars, - ) - - return struct( - scala = scalaattr, - srcjars = srcjarsattr, - extra_information = [ - struct( - srcjars = srcjarsattr, - scrooge_srcjar = struct( - transitive_owned_srcs = depset( - immediate_thrift_srcs, - transitive = [transitive_owned_srcs])), - ) - ], - ) - -scrooge_scala_srcjar = rule( - _gen_scrooge_srcjar_impl, +#### +# if we have a thrift target here, then we get all +# the srcjars of its dependencies and the thrifts +# we compute pass the deps as the extra thrifts, +# we then create a new srcjar for the current target +# we compute the transitive srcjars and transitive thriftjars +# return those in a provider. +# +# if we have another ScroogeSrc, we pass that through. +# finally, the scrooge_scala_library takes all the ScroogeSrcs +# and just calls the scala compiler only on the srcjars, but also +# returns the merged ScroogeSrc. +# +# not clear if the above is correct since we want to make sure +# we invoke scalac once on each thrift jar, so we may need to make +# sure to run scalac inside the aspect as well, otherwise we +# may call it over and over in diamond cases. +def _scrooge_aspect_impl(target, ctx): + if ThriftInfo in target: + # in this branch we need to generate the scrooge_src + target_ti = target[ThriftInfo] + # we sort so the inputs are always the same for caching + compile_thrifts = sorted(target_ti.srcs.to_list()) + transitive_ti = merge_thrift_infos( + [d[ScroogeAspectInfo].thrift_info for d in ctx.rule.attr.deps] + [target_ti] + ) + # we sort so the inputs are always the same for caching + compile_thrift_map = {} + for ct in compile_thrifts: + compile_thrift_map[ct] = True + include_thrifts = sorted([trans for trans in transitive_ti.transitive_srcs.to_list() if trans not in compile_thrift_map]) + scrooge_file = ctx.actions.declare_file(target.label.name + "_scrooge.srcjar", sibling = sorted(target.files.to_list())[0]) + _compile_to_scala(ctx, target.label, compile_thrifts, include_thrifts, scrooge_file) + + deps_ji = java_common.merge([d[ScroogeAspectInfo].java_info for d in ctx.rule.attr.deps]) + # TODO + # this function should be somewhere so we can compose scala compilation + # java_info = compile_scala(ctx, [], [scrooge_file], deps_ji, srcjar_may_contain_java = False) + java_info = deps_ji # this is wrong, but just to make things somewhat run + + return [ScroogeAspectInfo(src_jars = depset([scrooge_file]), thrift_info = transitive_ti, java_info = java_info)] + elif ScroogeInfo in target: + # in this branch we are just getting the already constructed aspect info + return [target[ScroogeInfo].aspect_info] + else: + fail("expected scrooge_scala_library or thrift_library as a dep: " + str(dir(target)) + str(ctx.rule)) + +scrooge_aspect = aspect( + implementation = _scrooge_aspect_impl, + attr_aspects = ['deps'], attrs = { - "deps": attr.label_list(mandatory = True), - #TODO we should think more about how we want to deal - # with these sorts of things... this basically - # is saying that we have a jar with a bunch - # of thrifts that we want to depend on. Seems like - # that should be a concern of thrift_library? we have - # it here through because we need to show that it is - # "covered," as well as needing the thrifts to - # do the code gen. - "remote_jars": attr.label_list(), - "jvm_flags": attr. - string_list(), # the jvm flags to use with the generator - "with_finagle": attr.bool(default = False), "_pluck_scrooge_scala": attr.label( executable = True, cfg = "host", default = Label("//src/scala/scripts:generator"), allow_files = True), }, - outputs = { - "srcjar": "lib%{name}.srcjar", - }, + required_aspect_providers = [[ScroogeInfo], [ThriftInfo]], ) -def scrooge_scala_library(name, - deps = [], - remote_jars = [], - jvm_flags = [], - visibility = None, - with_finagle = False): - srcjar = name + '_srcjar' - scrooge_scala_srcjar( - name = srcjar, - deps = deps, - remote_jars = remote_jars, - visibility = visibility, - with_finagle = with_finagle, - ) +def _scrooge_scala_library_impl(ctx): + aspect_info = merge_scrooge_aspect_info([dep[ScroogeAspectInfo] for dep in ctx.attr.deps]) + return [ScroogeInfo(aspect_info = aspect_info), aspect_info.java_info] + +scrooge_scala_library = rule( + implementation = _scrooge_scala_library_impl, + attrs = { + 'deps' : attr.label_list(aspects = [scrooge_aspect]), + 'remote_jars' : attr.label_list(), + 'jvm_flags' : attr.string_list(), + 'with_finagle': attr.bool(default = False), + }, + provides = [ScroogeInfo], +) - # deps from macro invocation would come via srcjar - # however, retained to make dependency analysis via aspects easier - scala_library( - name = name, - deps = deps + remote_jars + [ - srcjar, "//external:io_bazel_rules_scala/dependency/thrift/libthrift", - "//external:io_bazel_rules_scala/dependency/thrift/scrooge_core" - ], - exports = deps + remote_jars + [ - "//external:io_bazel_rules_scala/dependency/thrift/libthrift", - "//external:io_bazel_rules_scala/dependency/thrift/scrooge_core", - ], - jvm_flags = jvm_flags, - visibility = visibility, - ) From e1cf910e12e0da2f9a36d3a8ca7c1c0462d28ac5 Mon Sep 17 00:00:00 2001 From: Oscar Boykin Date: Tue, 26 Jun 2018 17:37:32 -1000 Subject: [PATCH 2/7] Get the aspect working --- scala/private/common.bzl | 10 +- scala/private/rule_impls.bzl | 52 +---- .../scalarules/test/twitter_scrooge/BUILD | 14 +- .../thrift/bare_jar_thrifts/BUILD | 11 +- .../thrift/bare_jar_thrifts/bare_jar_1/BUILD | 15 +- .../bare_jar_1/bare_jar_1_scrooge.jar | Bin 0 -> 23734 bytes .../thrift/bare_jar_thrifts/bare_jar_2/BUILD | 15 +- .../bare_jar_2/bare_jar_2_scrooge.jar | Bin 0 -> 23734 bytes .../bare_jar_thrifts_scrooge.jar | Bin 0 -> 23741 bytes thrift/thrift.bzl | 38 +++- thrift/thrift_info.bzl | 6 + twitter_scrooge/twitter_scrooge.bzl | 205 +++++++++++++----- 12 files changed, 239 insertions(+), 127 deletions(-) create mode 100755 test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1/bare_jar_1_scrooge.jar create mode 100755 test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2/bare_jar_2_scrooge.jar create mode 100755 test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_thrifts_scrooge.jar create mode 100644 thrift/thrift_info.bzl diff --git a/scala/private/common.bzl b/scala/private/common.bzl index a97765579..e32a93f6d 100644 --- a/scala/private/common.bzl +++ b/scala/private/common.bzl @@ -1,10 +1,14 @@ def write_manifest(ctx): + main_class = getattr(ctx.attr, "main_class", None) + write_manifest_file(ctx.actions, ctx.outputs.manifest, main_class) + +def write_manifest_file(actions, output_file, main_class): # TODO(bazel-team): I don't think this classpath is what you want manifest = "Class-Path: \n" - if getattr(ctx.attr, "main_class", ""): - manifest += "Main-Class: %s\n" % ctx.attr.main_class + if main_class: + manifest += "Main-Class: %s\n" % main_class - ctx.actions.write(output = ctx.outputs.manifest, content = manifest) + actions.write(output = output_file, content = manifest) def collect_srcjars(targets): srcjars = [] diff --git a/scala/private/rule_impls.bzl b/scala/private/rule_impls.bzl index bd2769030..54465f5c3 100644 --- a/scala/private/rule_impls.bzl +++ b/scala/private/rule_impls.bzl @@ -132,25 +132,11 @@ def _expand_location(ctx, flags): def _join_path(args, sep = ","): return sep.join([f.path for f in args]) -def compile_scala(ctx, - target_label, - output, - manifest, - statsfile, - sources, - cjars, - all_srcjars, - buildijar, - transitive_compile_jars, - plugins, - resource_strip_prefix, - resources, - resource_jars, - labels, - in_scalacopts, - print_compile_time, - expect_java_output, - scalac_jvm_flags = []): +def compile_scala(ctx, target_label, output, manifest, statsfile, sources, + cjars, all_srcjars, buildijar, transitive_compile_jars, + plugins, resource_strip_prefix, resources, resource_jars, + labels, in_scalacopts, print_compile_time, expect_java_output, + scalac_jvm_flags): ijar_output_path = "" ijar_cmd_path = "" if buildijar: @@ -254,12 +240,13 @@ StatsfileOutput: {statsfile_output} output = argfile, content = scalac_args + optional_scalac_args) outs = [output, statsfile] + ins = (compiler_classpath_jars.to_list() + all_srcjars.to_list() + + list(sources) + plugins_list + dependency_analyzer_plugin_jars + + classpath_resources + resources + resource_jars + [manifest, argfile]) if buildijar: outs.extend([ctx.outputs.ijar]) - ins = ( - compiler_classpath_jars.to_list() + all_srcjars.to_list() + list(sources) - + plugins_list + dependency_analyzer_plugin_jars + classpath_resources + - resources + resource_jars + [manifest, ctx.executable._ijar, argfile]) + ins.extend([ctx.executable._ijar]) + ctx.actions.run( inputs = ins, outputs = outs, @@ -567,28 +554,9 @@ def _lib(ctx, non_macro_lib): scala = scalaattr, providers = [java_provider], runfiles = runfiles, - # This is a free monoid given to the graph for the purpose of - # extensibility. This is necessary when one wants to create - # new targets which want to leverage a scala_library. For example, - # new_target1 -> scala_library -> new_target2. There might be - # information that new_target2 needs to get from new_target1, - # but we do not want to have to change scala_library to pass - # this information through. extra_information allows passing - # this information through, and it is up to the new_targets - # to filter and make sense of this information. - # unfortunately, we need to see this for scrooge and protobuf to work, - # but those are generating srcjar, so they should really come in via srcs - extra_information=_collect_extra_information(ctx.attr.deps + ctx.attr.srcs), jars_to_labels = jars.jars2labels, ) -def _collect_extra_information(targets): - r = [] - for target in targets: - if hasattr(target, "extra_information"): - r.extend(target.extra_information) - return r - def scala_library_impl(ctx): return _lib(ctx, True) diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD b/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD index 4544c2200..6e5e95530 100644 --- a/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD +++ b/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD @@ -1,5 +1,6 @@ load("//scala:scala.bzl", "scala_binary", "scala_library") load("//twitter_scrooge:twitter_scrooge.bzl", "scrooge_scala_library") +load("//thrift:thrift.bzl", "thrift_library") scrooge_scala_library( name = "scrooge1", @@ -83,21 +84,12 @@ scrooge_scala_library( scrooge_scala_library( name = "bare_thrift_scrooge", visibility = ["//visibility:public"], - deps = [ + exports = [ ":scroogebarejar1", ":scroogebarejar2", - "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts", - ], -) - -scrooge_scala_library( - name = "thrift_with_remote_jar", - remote_jars = [ - "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts:barejar_java_import", ], - visibility = ["//visibility:public"], deps = [ - "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2", + "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts", ], ) diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/BUILD b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/BUILD index 222344c73..2f783d875 100644 --- a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/BUILD +++ b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/BUILD @@ -1,20 +1,23 @@ load("//thrift:thrift.bzl", "thrift_library") -filegroup( +java_import( name = "barejar", - srcs = ["bare-thrift.jar"], + jars = ["bare-thrift.jar"], visibility = ["//visibility:public"], ) java_import( name = "barejar_java_import", - jars = ["bare-thrift.jar"], + jars = ["bare_jar_thrifts_scrooge.jar"], visibility = ["//visibility:public"], ) thrift_library( name = "bare_jar_thrifts", - external_jars = [":barejar"], + external_jars = [ + ":barejar", + ":barejar_java_import", + ], visibility = ["//visibility:public"], deps = [ "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1", diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1/BUILD b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1/BUILD index e9a523805..80e1fb4de 100644 --- a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1/BUILD +++ b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1/BUILD @@ -1,13 +1,22 @@ load("//thrift:thrift.bzl", "thrift_library") -filegroup( +java_import( name = "barejar1", - srcs = ["bare-thrift-1.jar"], + jars = ["bare-thrift-1.jar"], + visibility = ["//visibility:public"], +) + +java_import( + name = "bare_jar_1_remote", + jars = ["bare_jar_1_scrooge.jar"], visibility = ["//visibility:public"], ) thrift_library( name = "bare_jar_1", - external_jars = [":barejar1"], + external_jars = [ + ":barejar1", + ":bare_jar_1_remote", + ], visibility = ["//visibility:public"], ) diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1/bare_jar_1_scrooge.jar b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1/bare_jar_1_scrooge.jar new file mode 100755 index 0000000000000000000000000000000000000000..b735617e4111587bbdab5f7fc97bd6028a7ba6ad GIT binary patch literal 23734 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 literal 0 HcmV?d00001 diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2/BUILD b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2/BUILD index 5d794d139..62bf77f6d 100644 --- a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2/BUILD +++ b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2/BUILD @@ -1,13 +1,22 @@ load("//thrift:thrift.bzl", "thrift_library") -filegroup( +java_import( name = "barejar2", - srcs = ["bare-thrift-2.jar"], + jars = ["bare-thrift-2.jar"], + visibility = ["//visibility:public"], +) + +java_import( + name = "bare_jar_2_remote", + jars = ["bare_jar_2_scrooge.jar"], visibility = ["//visibility:public"], ) thrift_library( name = "bare_jar_2", - external_jars = [":barejar2"], + external_jars = [ + ":barejar2", + ":bare_jar_2_remote", + ], visibility = ["//visibility:public"], ) diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2/bare_jar_2_scrooge.jar b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2/bare_jar_2_scrooge.jar new file mode 100755 index 0000000000000000000000000000000000000000..a15e21ef0a8575a9064e16e92e15474b7f62dadf GIT binary patch literal 23734 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

7|<4c4O2s@x3f1u@0aDRGA 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 Date: Tue, 26 Jun 2018 17:47:42 -1000 Subject: [PATCH 3/7] fix a comment --- thrift/thrift.bzl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/thrift/thrift.bzl b/thrift/thrift.bzl index ef20016bd..ae96ab214 100644 --- a/thrift/thrift.bzl +++ b/thrift/thrift.bzl @@ -165,7 +165,9 @@ thrift_library = rule( "absolute_prefix": attr.string(default = '', mandatory = False), "absolute_prefixes": attr.string_list(), # This is a list of JARs which only contain Thrift files - # these files will be compiled as part of the current target + # these files will NOT be compiled as part of the current target, + # but the current thrifts do include these. It should also include + # the compiled versions of these thrifts "external_jars": attr.label_list(), "_zipper": attr.label( executable = True, From dcfda86d31cefe9aaf799266b403b4d1e6b7d626 Mon Sep 17 00:00:00 2001 From: Oscar Boykin Date: Wed, 27 Jun 2018 13:05:37 -1000 Subject: [PATCH 4/7] go ahead and be more strict --- .../scripts/TwitterScroogeGenerator.scala | 2 +- .../scalarules/test/twitter_scrooge/BUILD | 24 +++-- .../prefix_test/e/f/b/c/d/BUILD | 4 +- thrift/thrift.bzl | 62 ++++------- thrift/thrift_info.bzl | 2 - twitter_scrooge/twitter_scrooge.bzl | 102 ++++++++---------- 6 files changed, 88 insertions(+), 108 deletions(-) diff --git a/src/scala/scripts/TwitterScroogeGenerator.scala b/src/scala/scripts/TwitterScroogeGenerator.scala index f2b53cd65..5b1f01a30 100644 --- a/src/scala/scripts/TwitterScroogeGenerator.scala +++ b/src/scala/scripts/TwitterScroogeGenerator.scala @@ -97,7 +97,7 @@ class ScroogeGenerator extends Processor { val intersect = allFilesInZips(onlyTransitiveThriftSrcJars) .intersect(immediateThriftSrcs) - if (intersect.nonEmpty) + if (intersect.iterator.filter(_.endsWith(".thrift")).nonEmpty) sys.error("onlyTransitiveThriftSrcs and immediateThriftSrcs should " + s"have not intersection, found: ${intersect.mkString(",")}") diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD b/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD index 6e5e95530..fc819dec6 100644 --- a/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD +++ b/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD @@ -5,19 +5,21 @@ load("//thrift:thrift.bzl", "thrift_library") scrooge_scala_library( name = "scrooge1", visibility = ["//visibility:public"], - deps = [ + exports = [ ":scrooge2_a", ":scrooge2_b", ":scrooge3", - "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift", ], + deps = ["//test/src/main/scala/scalarules/test/twitter_scrooge/thrift"], ) scrooge_scala_library( name = "scrooge2_a", visibility = ["//visibility:public"], - deps = [ + exports = [ ":scrooge3", + ], + deps = [ "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2:thrift2_a", ], ) @@ -25,8 +27,10 @@ scrooge_scala_library( scrooge_scala_library( name = "scrooge2_b", visibility = ["//visibility:public"], - deps = [ + exports = [ ":scrooge3", + ], + deps = [ "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2:thrift2_b", ], ) @@ -40,8 +44,10 @@ scrooge_scala_library( scrooge_scala_library( name = "scrooge2", visibility = ["//visibility:public"], - deps = [ + exports = [ ":scrooge3", + ], + deps = [ "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2:thrift2_a", "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2:thrift2_b", ], @@ -50,8 +56,10 @@ scrooge_scala_library( scrooge_scala_library( name = "scrooge4", visibility = ["//visibility:public"], - deps = [ + exports = [ ":scrooge2", + ], + deps = [ "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift4", ], ) @@ -59,8 +67,10 @@ scrooge_scala_library( scrooge_scala_library( name = "scrooge4a", visibility = ["//visibility:public"], - deps = [ + exports = [ ":scrooge4", + ], + deps = [ "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift4:thrift4a", ], ) diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/prefix_test/e/f/b/c/d/BUILD b/test/src/main/scala/scalarules/test/twitter_scrooge/prefix_test/e/f/b/c/d/BUILD index bbc8c1937..311e2c649 100644 --- a/test/src/main/scala/scalarules/test/twitter_scrooge/prefix_test/e/f/b/c/d/BUILD +++ b/test/src/main/scala/scalarules/test/twitter_scrooge/prefix_test/e/f/b/c/d/BUILD @@ -15,8 +15,10 @@ thrift_library( scrooge_scala_library( name = "d", visibility = ["//visibility:public"], + exports = [ + "//test/src/main/scala/scalarules/test/twitter_scrooge/prefix_test/a/b/c/d", + ], deps = [ ":b_thrift", - "//test/src/main/scala/scalarules/test/twitter_scrooge/prefix_test/a/b/c/d", ], ) diff --git a/thrift/thrift.bzl b/thrift/thrift.bzl index ae96ab214..b330be676 100644 --- a/thrift/thrift.bzl +++ b/thrift/thrift.bzl @@ -3,19 +3,12 @@ load("@io_bazel_rules_scala//thrift:thrift_info.bzl", "ThriftInfo") def empty_thrift_info(): - return ThriftInfo( - srcs = depset(), - transitive_srcs = depset(), - external_jars = depset(), - transitive_external_jars = depset()) + return ThriftInfo(srcs = depset(), transitive_srcs = depset()) def merge_thrift_infos(tis): return ThriftInfo( srcs = depset(transitive = [t.srcs for t in tis]), - transitive_srcs = depset(transitive = [t.transitive_srcs for t in tis]), - external_jars = depset(transitive = [t.external_jars for t in tis]), - transitive_external_jars = depset( - transitive = [t.transitive_external_jars for t in tis])) + transitive_srcs = depset(transitive = [t.transitive_srcs for t in tis])) def _common_prefix(strings): pref = None @@ -40,8 +33,6 @@ def _thrift_library_impl(ctx): ] src_paths = [f.path for f in ctx.files.srcs] - if len(src_paths) <= 0 and len(ctx.attr.external_jars) <= 0: - fail("we require at least one thrift file in a target") zipper_args = "\n".join(src_paths) + "\n" if len(prefixes) > 0: @@ -66,6 +57,13 @@ def _thrift_library_impl(ctx): zipper_args = "\n".join( ["%s=%s" % (src[endpos + 1:], src) for src in src_paths]) + "\n" + # external jars are references to things srcs may depend on + # ARE built as part of this target, but are not combined + # into the output jar. They are includede in the ThriftInfo provider + externals = [] + for f in ctx.attr.external_jars: + externals.extend(f.files.to_list()) + if len(src_paths) > 0: zipper_arg_path = ctx.actions.declare_file( "%s_zipper_args" % ctx.outputs.libarchive.path) @@ -88,7 +86,7 @@ rm -f {out} progress_message = "making thrift archive %s (%s files)" % (ctx.label, len(src_paths)), ) - srcs_depset = depset([ctx.outputs.libarchive]) + srcs_depset = depset([ctx.outputs.libarchive] + externals) else: # we still have to create the output we declared ctx.actions.run_shell( @@ -103,34 +101,18 @@ rm {out}.contents zipper = ctx.executable._zipper.path), progress_message = "making empty thrift archive %s" % ctx.label, ) - srcs_depset = depset() - - # external jars are references to thrift we depend on, - # BUT WE DON'T BUILD. When we build the code, the code can - # do a thrift include to this, but we won't generate the source or bytecode. - remotes = [] - for f in ctx.attr.external_jars: - remotes.extend(f.files.to_list()) + srcs_depset = depset(externals) transitive_srcs = depset( - transitive = _collect_thrift_srcs(ctx.attr.deps) + [srcs_depset]) - transitive_external_jars = depset( - remotes, - transitive = [ - d[ThriftInfo].transitive_external_jars for d in ctx.attr.deps - ]) + transitive = _collect_thrift_srcs(ctx.attr.deps, srcs_depset)) - return [ - ThriftInfo( - srcs = srcs_depset, - transitive_srcs = transitive_srcs, - external_jars = depset(remotes), - transitive_external_jars = transitive_external_jars, - ) - ] + return [ThriftInfo( + srcs = srcs_depset, + transitive_srcs = transitive_srcs, + )] -def _collect_thrift_srcs(targets): - ds = [] +def _collect_thrift_srcs(targets, init): + ds = [init] for target in targets: ds.append(target[ThriftInfo].transitive_srcs) return ds @@ -164,11 +146,9 @@ thrift_library = rule( # created by this is created in such a way that absolute imports work... "absolute_prefix": attr.string(default = '', mandatory = False), "absolute_prefixes": attr.string_list(), - # This is a list of JARs which only contain Thrift files - # these files will NOT be compiled as part of the current target, - # but the current thrifts do include these. It should also include - # the compiled versions of these thrifts - "external_jars": attr.label_list(), + # This is a list of JARs which only Thrift files + # these files WILL be compiled as part of the current target + "external_jars": attr.label_list(allow_files = [".jar"]), "_zipper": attr.label( executable = True, cfg = "host", diff --git a/thrift/thrift_info.bzl b/thrift/thrift_info.bzl index f33fbfd0b..3602614f5 100644 --- a/thrift/thrift_info.bzl +++ b/thrift/thrift_info.bzl @@ -1,6 +1,4 @@ ThriftInfo = provider(fields = [ "srcs", # The source files in this rule "transitive_srcs", # the transitive version of the above - "external_jars", # external jars of thrift files - "transitive_external_jars", # transitive version of the above ]) diff --git a/twitter_scrooge/twitter_scrooge.bzl b/twitter_scrooge/twitter_scrooge.bzl index 10ce8bc53..302cac2ae 100644 --- a/twitter_scrooge/twitter_scrooge.bzl +++ b/twitter_scrooge/twitter_scrooge.bzl @@ -109,8 +109,9 @@ def _compile_to_scala(ctx, label, compile_thrifts, include_thrifts, jar_output): output = jar_output.path, paths = path_content, flags = worker_arg_pad + ':'.join([ - # '--with-finagle' if ctx.attr.with_finagle else '', - '' + # always add finagle option which is a no-op if there are no services + # we could put "include_services" on thrift_info, if needed + '--with-finagle', ])) argfile = ctx.actions.declare_file( @@ -222,57 +223,43 @@ def _provider_for_file(jar_file): # sure to run scalac inside the aspect as well, otherwise we # may call it over and over in diamond cases. def _scrooge_aspect_impl(target, ctx): - if ThriftInfo in target: - # in this branch we need to generate the scrooge_src - target_ti = target[ThriftInfo] + # in this branch we need to generate the scrooge_src + target_ti = target[ThriftInfo] + # we sort so the inputs are always the same for caching + compile_thrifts = sorted(target_ti.srcs.to_list()) + transitive_ti = merge_thrift_infos( + [d[ScroogeAspectInfo].thrift_info + for d in ctx.rule.attr.deps] + [target_ti]) + deps = [d[ScroogeAspectInfo].java_info for d in ctx.rule.attr.deps] + imps = [j[JavaInfo] for j in ctx.attr._implicit_compile_deps] + if compile_thrifts: # we sort so the inputs are always the same for caching - compile_thrifts = sorted(target_ti.srcs.to_list()) - transitive_ti = merge_thrift_infos( - [d[ScroogeAspectInfo].thrift_info - for d in ctx.rule.attr.deps] + [target_ti]) - deps = [d[ScroogeAspectInfo].java_info for d in ctx.rule.attr.deps] - external_deps = [ - _provider_for_file(d) - for d in sorted(transitive_ti.transitive_external_jars.to_list()) - ] - imps = [j[JavaInfo] for j in ctx.attr._implicit_compile_deps] - if compile_thrifts: - # we sort so the inputs are always the same for caching - compile_thrift_map = {} - for ct in compile_thrifts: - compile_thrift_map[ct] = True - include_thrifts = sorted([ - trans for trans in transitive_ti.transitive_srcs.to_list() - if trans not in compile_thrift_map - ] + transitive_ti.transitive_external_jars.to_list()) - scrooge_file = ctx.actions.declare_file( - target.label.name + "_scrooge.srcjar", sibling = compile_thrifts[0]) - _compile_to_scala(ctx, target.label, compile_thrifts, include_thrifts, - scrooge_file) - - src_jars = depset([scrooge_file]) - java_info = _compile_scala(ctx, target.label, scrooge_file, - deps + external_deps, imps) - - else: - # this target only has external thrifts/dependencies - src_jars = depset() - java_info = _empty_java_info(deps + external_deps, imps) - - return [ - ScroogeAspectInfo( - src_jars = src_jars, - thrift_info = transitive_ti, - java_info = java_info) - ] - elif ScroogeInfo in target: - print("warning, %s using scrooge as deps is deprecated, please use exports" - % target) - # in this branch we are just getting the already constructed aspect info - return [target[ScroogeInfo].aspect_info] + compile_thrift_map = {} + for ct in compile_thrifts: + compile_thrift_map[ct] = True + include_thrifts = sorted([ + trans for trans in transitive_ti.transitive_srcs.to_list() + if trans not in compile_thrift_map + ]) + scrooge_file = ctx.actions.declare_file( + target.label.name + "_scrooge.srcjar") + _compile_to_scala(ctx, target.label, compile_thrifts, include_thrifts, + scrooge_file) + + src_jars = depset([scrooge_file]) + java_info = _compile_scala(ctx, target.label, scrooge_file, deps, imps) + else: - fail("expected scrooge_scala_library or thrift_library as a dep: " + - str(dir(target)) + str(ctx.rule)) + # this target is only an aggregation target + src_jars = depset() + java_info = _empty_java_info(deps, imps) + + return [ + ScroogeAspectInfo( + src_jars = src_jars, + thrift_info = transitive_ti, + java_info = java_info) + ] scrooge_aspect = aspect( implementation = _scrooge_aspect_impl, @@ -302,22 +289,25 @@ scrooge_aspect = aspect( ), ]), }, - required_aspect_providers = [[ThriftInfo], - [ScroogeInfo]], + required_aspect_providers = [[ThriftInfo]], toolchains = ['@io_bazel_rules_scala//scala:toolchain_type'], ) def _scrooge_scala_library_impl(ctx): aspect_info = merge_scrooge_aspect_info( [dep[ScroogeAspectInfo] for dep in ctx.attr.deps]) - exports = [exp[JavaInfo] for exp in ctx.attr.exports] - all_java = java_common.merge(exports + [aspect_info.java_info]) + if ctx.attr.exports: + exports = [exp[JavaInfo] for exp in ctx.attr.exports] + all_java = java_common.merge(exports + [aspect_info.java_info]) + else: + all_java = aspect_info.java_info return [ScroogeInfo(aspect_info = aspect_info), all_java] scrooge_scala_library = rule( implementation = _scrooge_scala_library_impl, attrs = { - 'deps': attr.label_list(aspects = [scrooge_aspect]), + 'deps': attr.label_list( + aspects = [scrooge_aspect], providers = [ThriftInfo]), 'exports': attr.label_list(providers = [JavaInfo]), }, provides = [ScroogeInfo, JavaInfo], From 0f693aba7431438b6408b59dad49334b3cbc3564 Mon Sep 17 00:00:00 2001 From: Oscar Boykin Date: Wed, 27 Jun 2018 13:25:28 -1000 Subject: [PATCH 5/7] remove scrooge.jars, fix comments --- .../thrift/bare_jar_thrifts/BUILD | 7 ----- .../thrift/bare_jar_thrifts/bare_jar_1/BUILD | 15 +--------- .../bare_jar_1/bare_jar_1_scrooge.jar | Bin 23734 -> 0 bytes .../thrift/bare_jar_thrifts/bare_jar_2/BUILD | 15 +--------- .../bare_jar_2/bare_jar_2_scrooge.jar | Bin 23734 -> 0 bytes .../bare_jar_thrifts_scrooge.jar | Bin 23741 -> 0 bytes thrift/thrift.bzl | 2 +- twitter_scrooge/twitter_scrooge.bzl | 27 ++---------------- 8 files changed, 6 insertions(+), 60 deletions(-) delete mode 100755 test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1/bare_jar_1_scrooge.jar delete mode 100755 test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2/bare_jar_2_scrooge.jar delete mode 100755 test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_thrifts_scrooge.jar diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/BUILD b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/BUILD index 2f783d875..7ba56931a 100644 --- a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/BUILD +++ b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/BUILD @@ -6,17 +6,10 @@ java_import( visibility = ["//visibility:public"], ) -java_import( - name = "barejar_java_import", - jars = ["bare_jar_thrifts_scrooge.jar"], - visibility = ["//visibility:public"], -) - thrift_library( name = "bare_jar_thrifts", external_jars = [ ":barejar", - ":barejar_java_import", ], visibility = ["//visibility:public"], deps = [ diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1/BUILD b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1/BUILD index 80e1fb4de..53dd5f7b2 100644 --- a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1/BUILD +++ b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1/BUILD @@ -1,22 +1,9 @@ load("//thrift:thrift.bzl", "thrift_library") -java_import( - name = "barejar1", - jars = ["bare-thrift-1.jar"], - visibility = ["//visibility:public"], -) - -java_import( - name = "bare_jar_1_remote", - jars = ["bare_jar_1_scrooge.jar"], - visibility = ["//visibility:public"], -) - thrift_library( name = "bare_jar_1", external_jars = [ - ":barejar1", - ":bare_jar_1_remote", + "bare-thrift-1.jar", ], visibility = ["//visibility:public"], ) diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1/bare_jar_1_scrooge.jar b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_1/bare_jar_1_scrooge.jar deleted file mode 100755 index b735617e4111587bbdab5f7fc97bd6028a7ba6ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23734 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 diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2/BUILD b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2/BUILD index 62bf77f6d..5a461f36d 100644 --- a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2/BUILD +++ b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2/BUILD @@ -1,22 +1,9 @@ load("//thrift:thrift.bzl", "thrift_library") -java_import( - name = "barejar2", - jars = ["bare-thrift-2.jar"], - visibility = ["//visibility:public"], -) - -java_import( - name = "bare_jar_2_remote", - jars = ["bare_jar_2_scrooge.jar"], - visibility = ["//visibility:public"], -) - thrift_library( name = "bare_jar_2", external_jars = [ - ":barejar2", - ":bare_jar_2_remote", + "bare-thrift-2.jar", ], visibility = ["//visibility:public"], ) diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2/bare_jar_2_scrooge.jar b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/bare_jar_thrifts/bare_jar_2/bare_jar_2_scrooge.jar deleted file mode 100755 index a15e21ef0a8575a9064e16e92e15474b7f62dadf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23734 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

7|<4c4O2s@x3f1u@0aDRGA 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 Date: Wed, 27 Jun 2018 14:19:34 -1000 Subject: [PATCH 6/7] setup DefaultInfo to declare outputs --- .../thrift/thrift2/thrift4/BUILD | 8 +++++++- twitter_scrooge/twitter_scrooge.bzl | 20 ++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift4/BUILD b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift4/BUILD index 7eb9a0e16..3b987ef4a 100644 --- a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift4/BUILD +++ b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift4/BUILD @@ -4,11 +4,17 @@ thrift_library( name = "thrift4", srcs = ["Thrift4.thrift"], visibility = ["//visibility:public"], + deps = [ + "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2:thrift2_a", + ], ) thrift_library( name = "thrift4a", srcs = ["Thrift4a.thrift"], visibility = ["//visibility:public"], - deps = [":thrift4"], + deps = [ + ":thrift4", + "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2:thrift2_a", + ], ) diff --git a/twitter_scrooge/twitter_scrooge.bzl b/twitter_scrooge/twitter_scrooge.bzl index 4a94b5701..c6d43e084 100644 --- a/twitter_scrooge/twitter_scrooge.bzl +++ b/twitter_scrooge/twitter_scrooge.bzl @@ -83,6 +83,7 @@ def _colon_paths(data): ScroogeAspectInfo = provider(fields = [ "thrift_info", "src_jars", + "output_files", "java_info", ]) @@ -93,6 +94,7 @@ ScroogeInfo = provider(fields = [ def merge_scrooge_aspect_info(scrooges): return ScroogeAspectInfo( src_jars = depset(transitive = [s.src_jars for s in scrooges]), + output_files = depset(transitive = [s.output_files for s in scrooges]), thrift_info = merge_thrift_infos([s.thrift_info for s in scrooges]), java_info = java_common.merge([s.java_info for s in scrooges])) @@ -144,9 +146,9 @@ def _compiled_jar_file(actions, scrooge_jar): compiled_jar = without_suffix + "jar" return actions.declare_file(compiled_jar, sibling = scrooge_jar) -def _compile_scala(ctx, label, scrooge_jar, deps_java_info, implicit_deps): +def _compile_scala(ctx, label, output, scrooge_jar, deps_java_info, + implicit_deps): - output = _compiled_jar_file(ctx.actions, scrooge_jar) manifest = ctx.actions.declare_file( label.name + "_MANIFEST.MF", sibling = scrooge_jar) write_manifest_file(ctx.actions, manifest, None) @@ -226,16 +228,21 @@ def _scrooge_aspect_impl(target, ctx): scrooge_file) src_jars = depset([scrooge_file]) - java_info = _compile_scala(ctx, target.label, scrooge_file, deps, imps) + output = _compiled_jar_file(ctx.actions, scrooge_file) + outs = depset([output]) + java_info = _compile_scala(ctx, target.label, output, scrooge_file, deps, + imps) else: # this target is only an aggregation target src_jars = depset() + outs = depset() java_info = _empty_java_info(deps, imps) return [ ScroogeAspectInfo( src_jars = src_jars, + output_files = outs, thrift_info = transitive_ti, java_info = java_info) ] @@ -280,7 +287,10 @@ def _scrooge_scala_library_impl(ctx): all_java = java_common.merge(exports + [aspect_info.java_info]) else: all_java = aspect_info.java_info - return [ScroogeInfo(aspect_info = aspect_info), all_java] + return [ + DefaultInfo(files = aspect_info.output_files), + ScroogeInfo(aspect_info = aspect_info), all_java + ] scrooge_scala_library = rule( implementation = _scrooge_scala_library_impl, @@ -289,5 +299,5 @@ scrooge_scala_library = rule( aspects = [scrooge_aspect], providers = [ThriftInfo]), 'exports': attr.label_list(providers = [JavaInfo]), }, - provides = [ScroogeInfo, JavaInfo], + provides = [DefaultInfo, ScroogeInfo, JavaInfo], ) From ddef410361637286e4292e0f549102af34a699fc Mon Sep 17 00:00:00 2001 From: Oscar Boykin Date: Wed, 27 Jun 2018 16:24:52 -1000 Subject: [PATCH 7/7] add scrooge_scala_import --- .../scalarules/test/twitter_scrooge/BUILD | 15 ++++ .../test/twitter_scrooge/thrift/thrift2/BUILD | 7 ++ .../thrift/thrift2/thrift3/BUILD | 8 +++ .../thrift2/thrift3/thrift3_scrooge.jar | Bin 0 -> 47534 bytes twitter_scrooge/twitter_scrooge.bzl | 65 +++++++++++++++--- 5 files changed, 87 insertions(+), 8 deletions(-) create mode 100755 test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift3/thrift3_scrooge.jar diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD b/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD index fc819dec6..035430847 100644 --- a/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD +++ b/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD @@ -35,6 +35,13 @@ scrooge_scala_library( ], ) +scrooge_scala_library( + name = "scrooge2_b_imp", + deps = [ + "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2:thrift2_b_imp", + ], +) + scrooge_scala_library( name = "scrooge3", visibility = ["//visibility:public"], @@ -129,6 +136,14 @@ scala_library( deps = [":scrooge3"], ) +scala_library( + name = "justscrooge3_import", + srcs = ["JustScrooge3.scala"], + deps = [ + "//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift3:thrift3_import", + ], +) + scala_library( name = "scrooge2_both", srcs = ["Scrooge2.scala"], diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/BUILD b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/BUILD index 59aab526f..5fd9913aa 100644 --- a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/BUILD +++ b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/BUILD @@ -13,3 +13,10 @@ thrift_library( visibility = ["//visibility:public"], deps = ["//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift3"], ) + +thrift_library( + name = "thrift2_b_imp", + srcs = ["Thrift2_B.thrift"], + visibility = ["//visibility:public"], + deps = ["//test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift3:thrift3_import"], +) diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift3/BUILD b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift3/BUILD index b117f4dce..a474c3e50 100644 --- a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift3/BUILD +++ b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift3/BUILD @@ -1,7 +1,15 @@ load("//thrift:thrift.bzl", "thrift_library") +load("//twitter_scrooge:twitter_scrooge.bzl", "scrooge_scala_import") thrift_library( name = "thrift3", srcs = ["Thrift3.thrift"], visibility = ["//visibility:public"], ) + +scrooge_scala_import( + name = "thrift3_import", + scala_jars = ["thrift3_scrooge.jar"], + thrift_jars = ["libthrift3.jar"], + visibility = ["//visibility:public"], +) diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift3/thrift3_scrooge.jar b/test/src/main/scala/scalarules/test/twitter_scrooge/thrift/thrift2/thrift3/thrift3_scrooge.jar new file mode 100755 index 0000000000000000000000000000000000000000..0e0f1c989d5459ddd066c6cd68d0b1afca882651 GIT binary patch literal 47534 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

!TQmRF;M2HJ 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 literal 0 HcmV?d00001 diff --git a/twitter_scrooge/twitter_scrooge.bzl b/twitter_scrooge/twitter_scrooge.bzl index c6d43e084..e582be7c9 100644 --- a/twitter_scrooge/twitter_scrooge.bzl +++ b/twitter_scrooge/twitter_scrooge.bzl @@ -91,6 +91,11 @@ ScroogeInfo = provider(fields = [ "aspect_info", ]) +ScroogeImport = provider(fields = [ + "java_info", + "thrift_info", +]) + def merge_scrooge_aspect_info(scrooges): return ScroogeAspectInfo( src_jars = depset(transitive = [s.src_jars for s in scrooges]), @@ -205,13 +210,20 @@ def _empty_java_info(deps_java_info, implicit_deps): # or a scrooge_scala_library. Each thrift_library will be one scrooge # invocation assuming it has some sources. def _scrooge_aspect_impl(target, ctx): - target_ti = target[ThriftInfo] + if ScroogeImport in target: + target_import = target[ScroogeImport] + target_ti = target_import.thrift_info + deps = [target_import.java_info] + transitive_ti = target_ti + else: + target_ti = target[ThriftInfo] + deps = [d[ScroogeAspectInfo].java_info for d in ctx.rule.attr.deps] + transitive_ti = merge_thrift_infos( + [d[ScroogeAspectInfo].thrift_info + for d in ctx.rule.attr.deps] + [target_ti]) + # we sort so the inputs are always the same for caching compile_thrifts = sorted(target_ti.srcs.to_list()) - transitive_ti = merge_thrift_infos( - [d[ScroogeAspectInfo].thrift_info - for d in ctx.rule.attr.deps] + [target_ti]) - deps = [d[ScroogeAspectInfo].java_info for d in ctx.rule.attr.deps] imps = [j[JavaInfo] for j in ctx.attr._implicit_compile_deps] if compile_thrifts: # we sort so the inputs are always the same for caching @@ -275,7 +287,8 @@ scrooge_aspect = aspect( ), ]), }, - required_aspect_providers = [[ThriftInfo]], + required_aspect_providers = [[ThriftInfo], + [ScroogeImport]], toolchains = ['@io_bazel_rules_scala//scala:toolchain_type'], ) @@ -295,9 +308,45 @@ def _scrooge_scala_library_impl(ctx): scrooge_scala_library = rule( implementation = _scrooge_scala_library_impl, attrs = { - 'deps': attr.label_list( - aspects = [scrooge_aspect], providers = [ThriftInfo]), + 'deps': attr.label_list(aspects = [scrooge_aspect]), 'exports': attr.label_list(providers = [JavaInfo]), }, provides = [DefaultInfo, ScroogeInfo, JavaInfo], ) + +def _scrooge_scala_import_impl(ctx): + scala_jars = depset(ctx.files.scala_jars) + jars_ji = java_common.create_provider( + use_ijar = False, + compile_time_jars = scala_jars, + transitive_compile_time_jars = scala_jars, + transitive_runtime_jars = scala_jars) + java_info = java_common.merge( + [imp[JavaInfo] for imp in ctx.attr._implicit_compile_deps] + [jars_ji]) + # to make the thrift_info, we only put this in the + # transitive part + ti = ThriftInfo( + srcs = depset(), transitive_srcs = depset(ctx.files.thrift_jars)) + return [java_info, ti, ScroogeImport(java_info = java_info, thrift_info = ti)] + +# Allows you to consume thrifts and compiled jars from external repos +scrooge_scala_import = rule( + implementation = _scrooge_scala_import_impl, + attrs = { + "thrift_jars": attr.label_list(allow_files = [".jar"]), + "scala_jars": attr.label_list(allow_files = [".jar"]), + "_implicit_compile_deps": attr.label_list( + providers = [JavaInfo], + default = [ + Label( + "//external:io_bazel_rules_scala/dependency/scala/scala_library" + ), + Label( + "//external:io_bazel_rules_scala/dependency/thrift/libthrift" + ), + Label( + "//external:io_bazel_rules_scala/dependency/thrift/scrooge_core" + ), + ]), + }, + provides = [ThriftInfo, JavaInfo, ScroogeImport])