| # Non-predefined variables must be escaped with "$$" (e.g. "$$FOO"); see |
| # https://bazel.build/reference/be/make-variables#predefined_label_variables. |
| # Single quotes (as used for ownership) throw off Bazel, so they've been omitted at the |
| # expense of proper grammar. |
| _SCRIPT = """ |
| # Overwrite the users GOPATH to avoid conflicts between the go binary we are about to run |
| # and the GOPATH directory. Failure to do this leads to strange errors like: |
| # compile: version "go1.18.1" does not match go tool version "go1.18" |
| # |
| # It is important to call realpath first because we want to resolve the symlink of the |
| # go binary *first* before finding the grandparent directory. If we do not do this, |
| # go fails to embed files which are symlinks: https://github.com/bazelbuild/rules_go/issues/3178 |
| export GOROOT=$$(dirname $$(dirname $$(realpath $(rootpath @go_sdk//:bin/go)))) |
| |
| # Add the bin folder (containing go and gofmt and others) to the PATH |
| export PATH=$$GOROOT/bin:$$PATH |
| |
| # Change into the directory where Bazel was invoked. |
| # https://bazel.build/docs/user-manual#running-executables |
| cd $$BUILD_WORKING_DIRECTORY |
| |
| go $$@ |
| """ |
| |
| genrule( |
| name = "gen_script", |
| outs = ["go.sh"], |
| cmd = "echo '%s' > $@" % _SCRIPT, |
| exec_tools = [ |
| "@go_sdk//:files", |
| "@go_sdk//:bin/go", |
| ], |
| ) |
| |
| # Wrapper script around the Bazel-downloaded "go" binary. |
| # |
| # Some commands invoked via "go generate" expect the "go" and/or "gofmt" binaries to be in PATH. |
| # This script adds the Bazel-downloaded "go" and "gofmt" binaries to PATH, then forwards all |
| # command-line arguments to the "go" binary. |
| # |
| # Reference: https://bazel.build/reference/be/shell#sh_binary. |
| sh_binary( |
| name = "go", |
| srcs = ["go.sh"], |
| data = [ |
| "@go_sdk//:files", |
| ], |
| visibility = ["//visibility:public"], |
| ) |