diff --git a/BUILD b/BUILD index 199b2b9fb3..bf2f00a66e 100644 --- a/BUILD +++ b/BUILD @@ -1,4 +1,4 @@ -load("@io_bazel_rules_go//go:def.bzl", "gazelle", "go_prefix", "go_path") +load("@io_bazel_rules_go//go:def.bzl", "gazelle", "go_prefix", "go_path", "go_vet_test") load("@io_bazel_rules_go//go/private:lines_sorted_test.bzl", "lines_sorted_test") load("@io_bazel_rules_go//proto:go_proto_library.bzl", "go_google_protobuf") @@ -46,3 +46,8 @@ go_path( ], tags = ["manual"], ) + +go_vet_test( + name = "vet", + data = [":all_srcs"] +) \ No newline at end of file diff --git a/go/def.bzl b/go/def.bzl index 62f4090f3b..270f6bde81 100644 --- a/go/def.bzl +++ b/go/def.bzl @@ -26,9 +26,12 @@ load("@io_bazel_rules_go//go/private:wrappers.bzl", _go_binary_macro = "go_binary_macro", _go_test_macro = "go_test_macro", ) -load("@io_bazel_rules_go//go/private:path.bzl", +load("@io_bazel_rules_go//go/private/tools:path.bzl", _go_path = "go_path", ) +load("@io_bazel_rules_go//go/private/tools:vet.bzl", + _go_vet_test = "go_vet_test", +) GoLibrary = _GoLibrary """ @@ -126,6 +129,11 @@ go_path = _go_path "mode": attr.string(default="link", values=["link", "copy"]) # Whether to copy files or produce soft links """ +go_vet_test = _go_vet_test +""" + go_vet_test +""" + # Compatability shims def cgo_genrule(name, tags=[], **kwargs): diff --git a/go/private/BUILD b/go/private/BUILD index 72593b4af7..c26acb3002 100644 --- a/go/private/BUILD +++ b/go/private/BUILD @@ -1,5 +1,5 @@ filegroup( name = "all_rules", - srcs = glob(["*.bzl"]), + srcs = glob(["*.bzl"]) + ["//go/private/tools:all_rules"], visibility = ["//visibility:public"], ) diff --git a/go/private/tools/BUILD b/go/private/tools/BUILD new file mode 100644 index 0000000000..72593b4af7 --- /dev/null +++ b/go/private/tools/BUILD @@ -0,0 +1,5 @@ +filegroup( + name = "all_rules", + srcs = glob(["*.bzl"]), + visibility = ["//visibility:public"], +) diff --git a/go/private/path.bzl b/go/private/tools/path.bzl similarity index 95% rename from go/private/path.bzl rename to go/private/tools/path.bzl index 034c96b279..92b377338a 100644 --- a/go/private/path.bzl +++ b/go/private/tools/path.bzl @@ -63,7 +63,7 @@ and ctx.template_action(template=src, output=out, substitutions={}) elif ctx.attr.mode == "link": ctx.action( - command='ln -s $(realpath "$1") "$2"', + command='ln -s $(readlink "$1") "$2"', arguments=[src.path, out.path], inputs=[src], outputs=[out], @@ -79,7 +79,7 @@ and gopath, _, _ = envscript.short_path.rpartition("/") ctx.file_action(envscript, content=""" export GOROOT="{goroot}" -export GOPATH=$(realpath "{gopath}") +export GOPATH="$(pwd)/{gopath}") """.format( goroot=go_toolchain.root.path, gopath = gopath, @@ -99,7 +99,7 @@ go_path = rule( _go_path_impl, attrs = { "deps": attr.label_list(providers=[GoLibrary]), - "mode": attr.string(default="link", values=["link", "copy"]), + "mode": attr.string(default="copy", values=["link", "copy"]), "_go_toolchain": attr.label(default = Label("@io_bazel_rules_go_toolchain//:go_toolchain")), }, ) \ No newline at end of file diff --git a/go/private/tools/vet.bzl b/go/private/tools/vet.bzl new file mode 100644 index 0000000000..112cbf39fc --- /dev/null +++ b/go/private/tools/vet.bzl @@ -0,0 +1,68 @@ +# 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("@io_bazel_rules_go//go/private:providers.bzl", "GoPath") +load("@io_bazel_rules_go//go/private:common.bzl", "get_go_toolchain") + +def _go_vet_generate_impl(ctx): + print(""" +EXPERIMENTAL: the go_vet_test rule is still very experimental +Please do not rely on it for production use, but feel free to use it and file issues +""") + go_toolchain = get_go_toolchain(ctx) + script_file = ctx.new_file(ctx.label.name+".bash") + gopath = [] + files = ctx.files.data + [go_toolchain.go] + gopath = [] + packages = [] + for data in ctx.attr.data: + entry = data[GoPath] + gopath += [entry.gopath] + packages += [package.dir for package in entry.packages] + ctx.file_action(output=script_file, executable=True, content=""" +export GOROOT="{goroot}" +export GOPATH="{gopath}" +{go} tool vet {packages} +""".format( + go=go_toolchain.go.path, + goroot=go_toolchain.root.path, + gopath=":".join(['$(pwd)/{})'.format(entry) for entry in gopath]), + packages=" ".join(packages), + )) + return struct( + files = depset([script_file]), + runfiles = ctx.runfiles(files, collect_data = True), + ) + +_go_vet_generate = rule( + _go_vet_generate_impl, + attrs = { + "data": attr.label_list(providers=[GoPath], cfg = "data"), + "_go_toolchain": attr.label(default = Label("@io_bazel_rules_go_toolchain//:go_toolchain")), + }, +) + +def go_vet_test(name, data, **kwargs): + script_name = "generate_"+name + _go_vet_generate( + name=script_name, + data=data, + tags = ["manual"], + ) + native.sh_test( + name=name, + srcs=[script_name], + data=data, + **kwargs + ) \ No newline at end of file