Skip to content

Commit

Permalink
Create work-around wrappers for pure attribute on go_binary and go_test
Browse files Browse the repository at this point in the history
This enables cgo when cross-compiling certain tests and binaries to
Linux, while disabling cgo for Windows and Darwin.
  • Loading branch information
ixdy committed Feb 23, 2019
1 parent 52aab6f commit 7a938eb
Show file tree
Hide file tree
Showing 15 changed files with 150 additions and 62 deletions.
4 changes: 2 additions & 2 deletions build/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,8 @@ filegroup(
"//cmd/genyaml",
"//cmd/kubemark", # TODO: server platforms only
"//cmd/linkcheck",
"//test/e2e:e2e.test",
"//test/e2e_node:e2e_node.test", # TODO: server platforms only
"//test/e2e:e2e.test_binary",
"//test/e2e_node:e2e_node.test_binary", # TODO: server platforms only
"//vendor/github.com/onsi/ginkgo/ginkgo",
],
)
Expand Down
103 changes: 103 additions & 0 deletions build/go.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# Copyright 2019 The Kubernetes Authors.
#
# 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:def.bzl", "go_binary", "go_test")

# Defines several go_binary rules to work around a Bazel issue which makes
# the pure attribute on go_binary not configurable.
# The name provided will have cgo enabled if targeting Linux, and will
# be a pure go binary otherwise. Additionally, if targeting Windows, the
# output filename will have a .exe suffix.
def go_binary_conditional_pure(name, tags = None, **kwargs):
tags = tags or []
tags.append("manual")
go_binary(
name = "_%s-cgo" % name,
out = name,
pure = "off",
tags = tags,
**kwargs
)

# Define a rule for both Unix and Windows exe suffixes.
[go_binary(
name = "_%s-pure" % out,
out = out,
pure = "on",
tags = tags,
**kwargs
) for out in [name, name + ".exe"]]

# The real magic, where we work around the pure attribute not being
# configurable: select the appropriate go_binary rule above based on the
# configured platform.
native.alias(
name = name,
actual = select({
"@io_bazel_rules_go//go/platform:linux": ":_%s-cgo" % name,
"@io_bazel_rules_go//go/platform:windows": ":_%s.exe-pure" % name,
"//conditions:default": ":_%s-pure" % name,
}),
)

# Defines several go_test rules to work around a Bazel issue which makes
# the pure attribute on go_test not configurable.
# This also defines genrules to produce test binaries named ${out} and
# ${out}.exe, and an alias named ${out}_binary which automatically selects
# the correct filename suffix (i.e. with a .exe on Windows).
def go_test_conditional_pure(name, out, tags = None, **kwargs):
tags = tags or []
tags.append("manual")

go_test(
name = "_%s-cgo" % name,
pure = "off",
testonly = False,
tags = tags,
**kwargs
)

go_test(
name = "_%s-pure" % name,
pure = "on",
testonly = False,
tags = tags,
**kwargs
)

native.alias(
name = name,
actual = select({
"@io_bazel_rules_go//go/platform:linux": ":_%s-cgo" % name,
"//conditions:default": ":_%s-pure" % name,
}),
)

[native.genrule(
name = "gen_%s" % o,
srcs = [name],
outs = [o],
cmd = "cp $< $@;",
output_to_bindir = True,
executable = True,
tags = tags,
) for o in [out, out + ".exe"]]

native.alias(
name = "%s_binary" % out,
actual = select({
"@io_bazel_rules_go//go/platform:windows": ":gen_%s.exe" % out,
"//conditions:default": ":gen_%s" % out,
}),
)
2 changes: 1 addition & 1 deletion cluster/images/conformance/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ container_layer(
directory = "/usr/local/bin",
files = [
"//cmd/kubectl",
"//test/e2e:e2e.test",
"//test/e2e:e2e.test_binary",
"//vendor/github.com/onsi/ginkgo/ginkgo",
],
)
Expand Down
6 changes: 3 additions & 3 deletions cmd/gendocs/BUILD
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package(default_visibility = ["//visibility:public"])

load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
"//build:go.bzl",
go_binary = "go_binary_conditional_pure",
)
load("@io_bazel_rules_go//go:def.bzl", "go_library")

go_binary(
name = "gendocs",
Expand Down
5 changes: 4 additions & 1 deletion cmd/genkubedocs/BUILD
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package(default_visibility = ["//visibility:public"])

load(
"//build:go.bzl",
go_binary = "go_binary_conditional_pure",
)
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
"go_test",
)
Expand Down
6 changes: 3 additions & 3 deletions cmd/genman/BUILD
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package(default_visibility = ["//visibility:public"])

load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
"//build:go.bzl",
go_binary = "go_binary_conditional_pure",
)
load("@io_bazel_rules_go//go:def.bzl", "go_library")

go_binary(
name = "genman",
Expand Down
6 changes: 3 additions & 3 deletions cmd/genswaggertypedocs/BUILD
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package(default_visibility = ["//visibility:public"])

load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
"//build:go.bzl",
go_binary = "go_binary_conditional_pure",
)
load("@io_bazel_rules_go//go:def.bzl", "go_library")

go_binary(
name = "genswaggertypedocs",
Expand Down
6 changes: 3 additions & 3 deletions cmd/genyaml/BUILD
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package(default_visibility = ["//visibility:public"])

load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
"//build:go.bzl",
go_binary = "go_binary_conditional_pure",
)
load("@io_bazel_rules_go//go:def.bzl", "go_library")

go_binary(
name = "genyaml",
Expand Down
6 changes: 3 additions & 3 deletions cmd/hyperkube/BUILD
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package(default_visibility = ["//visibility:public"])

load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
"//build:go.bzl",
go_binary = "go_binary_conditional_pure",
)
load("@io_bazel_rules_go//go:def.bzl", "go_library")
load("//pkg/version:def.bzl", "version_x_defs")

go_binary(
Expand Down
6 changes: 3 additions & 3 deletions cmd/kubelet/BUILD
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package(default_visibility = ["//visibility:public"])

load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
"//build:go.bzl",
go_binary = "go_binary_conditional_pure",
)
load("@io_bazel_rules_go//go:def.bzl", "go_library")
load("//pkg/version:def.bzl", "version_x_defs")

go_binary(
Expand Down
6 changes: 3 additions & 3 deletions cmd/kubemark/BUILD
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package(default_visibility = ["//visibility:public"])

load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
"//build:go.bzl",
go_binary = "go_binary_conditional_pure",
)
load("@io_bazel_rules_go//go:def.bzl", "go_library")

go_binary(
name = "kubemark",
Expand Down
6 changes: 3 additions & 3 deletions cmd/linkcheck/BUILD
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package(default_visibility = ["//visibility:public"])

load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
"//build:go.bzl",
go_binary = "go_binary_conditional_pure",
)
load("@io_bazel_rules_go//go:def.bzl", "go_library")

go_binary(
name = "linkcheck",
Expand Down
18 changes: 4 additions & 14 deletions test/e2e/BUILD
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package(default_visibility = ["//visibility:public"])

load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
"//build:go.bzl",
go_test = "go_test_conditional_pure",
)
load("@io_bazel_rules_go//go:def.bzl", "go_library")

go_test(
name = "go_default_test",
srcs = ["e2e_test.go"],
out = "e2e.test",
embed = [":go_default_library"],
tags = ["e2e"],
deps = [
Expand Down Expand Up @@ -78,17 +79,6 @@ go_library(
],
)

# This is a handwritten rule. Do not delete, it will not be regenerated by
# update-bazel.sh.
genrule(
name = "gen_e2e.test",
testonly = 1,
srcs = [":go_default_test"],
outs = ["e2e.test"],
cmd = "srcs=($(SRCS)); cp $$(dirname $${srcs[0]})/go_default_test $@;",
output_to_bindir = 1,
)

filegroup(
name = "package-srcs",
srcs = glob(["**"]),
Expand Down
16 changes: 6 additions & 10 deletions test/e2e_kubeadm/BUILD
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package(default_visibility = ["//visibility:public"])

load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
load(
"//build:go.bzl",
go_test = "go_test_conditional_pure",
)
load("@io_bazel_rules_go//go:def.bzl", "go_library")

go_test(
name = "go_default_test",
srcs = [
"e2e_kubeadm_suite_test.go",
"kubeadm_test.go",
],
out = "e2e_kubeadm.test",
embed = [":go_default_library"],
tags = ["e2e"],
deps = [
Expand All @@ -32,15 +37,6 @@ filegroup(
visibility = ["//visibility:private"],
)

genrule(
name = "gen_e2e_kubeadm.test",
testonly = 1,
srcs = [":go_default_test"],
outs = ["e2e_kubeadm.test"],
cmd = "srcs=($(SRCS)); cp $$(dirname $${srcs[0]})/go_default_test $@;",
output_to_bindir = 1,
)

filegroup(
name = "all-srcs",
srcs = [
Expand Down
16 changes: 6 additions & 10 deletions test/e2e_node/BUILD
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package(default_visibility = ["//visibility:public"])

load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
load(
"//build:go.bzl",
go_test = "go_test_conditional_pure",
)
load("@io_bazel_rules_go//go:def.bzl", "go_library")

go_library(
name = "go_default_library",
Expand Down Expand Up @@ -106,6 +110,7 @@ go_test(
"summary_test.go",
"volume_manager_test.go",
],
out = "e2e_node.test",
embed = [":go_default_library"],
tags = ["e2e"],
deps = [
Expand Down Expand Up @@ -180,15 +185,6 @@ go_test(
}),
)

genrule(
name = "gen_e2e_node.test",
testonly = 1,
srcs = [":go_default_test"],
outs = ["e2e_node.test"],
cmd = "srcs=($(SRCS)); cp $$(dirname $${srcs[0]})/go_default_test $@;",
output_to_bindir = 1,
)

filegroup(
name = "package-srcs",
srcs = glob(["**"]),
Expand Down

0 comments on commit 7a938eb

Please sign in to comment.