blob: fcb9dd74a5b6aa1b6ab87b818b1abfbc161bdc7c [file] [log] [blame]
# Copyright 2014 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
load(
"//go/private:providers.bzl",
"GoSDK",
)
def _go_sdk_impl(ctx):
package_list = ctx.file.package_list
if package_list == None:
package_list = ctx.actions.declare_file("packages.txt")
_build_package_list(ctx, ctx.files.srcs, ctx.file.root_file, package_list)
return [GoSDK(
goos = ctx.attr.goos,
goarch = ctx.attr.goarch,
root_file = ctx.file.root_file,
package_list = package_list,
libs = ctx.files.libs,
headers = ctx.files.headers,
srcs = ctx.files.srcs,
tools = ctx.files.tools,
go = ctx.executable.go,
)]
go_sdk = rule(
_go_sdk_impl,
attrs = {
"goos": attr.string(
mandatory = True,
doc = "The host OS the SDK was built for",
),
"goarch": attr.string(
mandatory = True,
doc = "The host architecture the SDK was built for",
),
"root_file": attr.label(
mandatory = True,
allow_single_file = True,
doc = "A file in the SDK root directory. Used to determine GOROOT.",
),
"package_list": attr.label(
allow_single_file = True,
doc = ("A text file containing a list of packages in the " +
"standard library that may be imported."),
),
"libs": attr.label_list(
allow_files = [".a"],
doc = ("Pre-compiled .a files for the standard library, " +
"built for the execution platform"),
),
"headers": attr.label_list(
allow_files = [".h"],
doc = (".h files from pkg/include that may be included in " +
"assembly sources"),
),
"srcs": attr.label_list(
allow_files = True,
doc = "Source files for packages in the standard library",
),
"tools": attr.label_list(
allow_files = True,
cfg = "exec",
doc = ("List of executable files in the SDK built for " +
"the execution platform, excluding the go binary"),
),
"go": attr.label(
mandatory = True,
allow_single_file = True,
executable = True,
cfg = "exec",
doc = "The go binary",
),
},
doc = ("Collects information about a Go SDK. The SDK must have a normal " +
"GOROOT directory structure."),
provides = [GoSDK],
)
def _package_list_impl(ctx):
_build_package_list(ctx, ctx.files.srcs, ctx.file.root_file, ctx.outputs.out)
return [DefaultInfo(files = depset([ctx.outputs.out]))]
package_list = rule(
_package_list_impl,
attrs = {
"srcs": attr.label_list(
allow_files = True,
doc = "Source files for packages in the standard library",
),
"root_file": attr.label(
mandatory = True,
allow_single_file = True,
doc = "A file in the SDK root directory. Used to determine GOROOT.",
),
"out": attr.output(
mandatory = True,
doc = "File to write. Must be 'packages.txt'.",
# Gazelle depends on this file directly. It has to be an output
# attribute because Bazel has no other way of knowing what rule
# produces this file.
# TODO(jayconrod): Update Gazelle and simplify this.
),
},
)
def _build_package_list(ctx, srcs, root_file, out):
packages = {}
src_dir = root_file.dirname + "/src/"
for src in srcs:
pkg_src_dir = src.dirname
if not pkg_src_dir.startswith(src_dir):
continue
pkg_name = pkg_src_dir[len(src_dir):]
packages[pkg_name] = None
content = "\n".join(sorted(packages.keys())) + "\n"
ctx.actions.write(out, content)