|  | load("@io_bazel_rules_go//go:def.bzl", "GoSource", "go_context") | 
|  |  | 
|  | # This implements the toolchain_library rule, which is used to generate a | 
|  | # rules_go compatible go_library-style target which contains toolchain.go.in | 
|  | # augmented with information about the Go SDK's toolchain used by Bazel. | 
|  | # | 
|  | # The library can then be used to build tools that call the `go` tool, for | 
|  | # example to perform static analysis or dependency management. | 
|  |  | 
|  | def _toolchain_library_impl(ctx): | 
|  | go = go_context(ctx) | 
|  |  | 
|  | importpath = ctx.attr.importpath | 
|  |  | 
|  | out = go.declare_file(go, ext = ".go") | 
|  | ctx.actions.expand_template( | 
|  | template = ctx.file._template, | 
|  | output = out, | 
|  | substitutions = { | 
|  | "GOROOT": go.sdk.root_file.dirname, | 
|  | "GOTOOL": go.go.path, | 
|  | }, | 
|  | ) | 
|  |  | 
|  | library = go.new_library(go) | 
|  | source = go.library_to_source(go, struct( | 
|  | srcs = [struct(files = [out])], | 
|  | deps = ctx.attr.deps, | 
|  | ), library, ctx.coverage_instrumented()) | 
|  |  | 
|  | # Hack: we want to inject runfiles into the generated GoSource, because | 
|  | # there's no other way to make rules_go pick up runfiles otherwise. | 
|  | runfiles = ctx.runfiles(files = [ | 
|  | go.go, | 
|  | go.sdk_root, | 
|  | ] + go.sdk_files) | 
|  | source = { | 
|  | key: getattr(source, key) | 
|  | for key in dir(source) | 
|  | if key not in ["to_json", "to_proto"] | 
|  | } | 
|  | source["runfiles"] = runfiles | 
|  | source = GoSource(**source) | 
|  |  | 
|  | return [ | 
|  | library, | 
|  | source, | 
|  | OutputGroupInfo( | 
|  | go_generated_srcs = depset([out]), | 
|  | ), | 
|  | ] | 
|  |  | 
|  | toolchain_library = rule( | 
|  | implementation = _toolchain_library_impl, | 
|  | attrs = { | 
|  | "importpath": attr.string( | 
|  | mandatory = True, | 
|  | ), | 
|  | "deps": attr.label_list(), | 
|  | "_template": attr.label( | 
|  | allow_single_file = True, | 
|  | default = ":toolchain.go.in", | 
|  | ), | 
|  | "_go_context_data": attr.label( | 
|  | default = "@io_bazel_rules_go//:go_context_data", | 
|  | ), | 
|  | }, | 
|  | toolchains = ["@io_bazel_rules_go//go:toolchain"], | 
|  | ) |