blob: 923ce616fb06be8634024940d39d4962a03fe34e [file] [log] [blame]
# Copyright 2017 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Recipe for building Go toolchain."""
from recipe_engine.recipe_api import Property
DEPS = [
"fuchsia/buildbucket_util",
"fuchsia/checkout",
"fuchsia/git",
"fuchsia/go",
"fuchsia/macos_sdk",
"fuchsia/upload",
"recipe_engine/cipd",
"recipe_engine/context",
"recipe_engine/file",
"recipe_engine/path",
"recipe_engine/platform",
"recipe_engine/step",
]
PROPERTIES = {
"platform": Property(kind=str, help="CIPD platform for the target", default=None),
}
# Files and directories to clean up before and after a build, mirroring what go
# itself does for a release.
# See https://github.com/golang/build/blob/6c34d49dff4864185cb351d06518ce3a76efb6a2/cmd/release/release.go#L240:L248
PREBUILD_CLEAN_FILES = [
".gitattributes",
".gitignore",
".hgignore",
".hgtags",
"misc/dashboard",
"misc/makerelease",
]
PREBUILD_CLEAN_DIRS = [
".git",
".github",
]
# See https://github.com/golang/build/blob/6c34d49dff4864185cb351d06518ce3a76efb6a2/cmd/release/release.go#L464:L467
POSTBUILD_CLEAN_FILES = [
"VERSION.cache",
]
POSTBUILD_CLEAN_DIRS = [
"pkg/bootstrap",
"pkg/obj",
]
FUCHSIA_THIRD_PARTY_GO_REPO = "https://fuchsia.googlesource.com/third_party/go"
def RunSteps(api, platform):
# TODO: factor this out into a host_build recipe module.
host_platform = "%s-%s" % (
api.platform.name.replace("win", "windows"),
{"intel": {32: "386", 64: "amd64",}, "arm": {32: "armv6", 64: "arm64",},}[
api.platform.arch
][api.platform.bits],
)
target_platform = platform or host_platform
go_dir = api.path["start_dir"].join("go")
revision = api.git.checkout_from_build_input(
path=go_dir, repo=FUCHSIA_THIRD_PARTY_GO_REPO, rebase_merges=True
)
cipd_os, cipd_cpu = target_platform.split("-")
goos = cipd_os.replace("mac", "darwin")
goarch = cipd_cpu.replace("armv6", "arm")
env = {"GOOS": goos, "GOARCH": goarch, "GOROOT_BOOTSTRAP": api.go.go_root}
with api.macos_sdk(), api.context(cwd=go_dir.join("src"), env=env):
with api.step.nest("pre-build file removal"):
for filename in PREBUILD_CLEAN_FILES:
api.file.remove(filename, go_dir.join(filename))
for dirname in PREBUILD_CLEAN_DIRS:
api.file.rmtree(dirname, go_dir.join(dirname))
api.step("build", [go_dir.join("src", "make.bash")])
if host_platform == target_platform:
with api.context(env_prefixes={"PATH": [go_dir.join("bin")]}):
run_bash = go_dir.join("src", "run.bash")
api.step("test", [run_bash, "--no-rebuild"])
# Remove after testing, as some tests may rely on the contents.
with api.step.nest("post-build file removal"):
for filename in POSTBUILD_CLEAN_FILES:
api.file.remove(filename, go_dir.join(filename))
for dirname in POSTBUILD_CLEAN_DIRS:
api.file.rmtree(dirname, go_dir.join(dirname))
if api.buildbucket_util.is_tryjob:
return
go_version = api.file.read_text(
"read go version", go_dir.join("VERSION"), test_data="go1.8"
).strip()
assert go_version, "Cannot determine Go version"
api.upload.cipd_package(
"fuchsia/go/" + target_platform,
go_dir,
[api.upload.DirectoryPath(go_dir)],
{"git_revision": revision},
repository=FUCHSIA_THIRD_PARTY_GO_REPO,
extra_tags={"version": go_version},
)
def GenTests(api):
def props():
return {
"platform": "linux-amd64",
"checkout.project": "integration",
"checkout.manifest": "third_party/go",
"checkout.remote": "https://fuchsia.googlesource.com/third_party/go",
}
yield api.checkout.test("cq", properties=props(), tryjob=True)
yield (
api.checkout.test("ci", properties=props(), tryjob=False)
+ api.step_data(
"cipd.cipd search fuchsia/go/linux-amd64 git_revision:deadbeef",
api.cipd.example_search("fuchsia/go/linux-amd64", []),
)
)