blob: 775cb68ff1de784e8feec830fd4b5aeca39d9e06 [file] [log] [blame]
# Copyright 2020 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 and uploading jq to CIPD."""
DEPS = [
"fuchsia/archive",
"fuchsia/git",
"fuchsia/status_check",
"fuchsia/upload",
"recipe_engine/buildbucket",
"recipe_engine/cipd",
"recipe_engine/context",
"recipe_engine/path",
"recipe_engine/platform",
"recipe_engine/raw_io",
"recipe_engine/step",
]
JQ_REPO_URL = "https://fuchsia.googlesource.com/third_party/github.com/stedolan/jq"
JQ_REPO_REVISION = "a17dd3248a666d01be75f6b16be37e80e20b0954"
AUTOCONF_PKG = ("fuchsia/third_party/autoconf/${platform}", "version:2.69")
AUTOMAKE_PKG = ("fuchsia/third_party/automake/${platform}", "version:1.16.2")
BISON_PKG = ("fuchsia/third_party/bison/${platform}", "version:3.7")
LIBTOOL_PKG = ("fuchsia/third_party/libtool/${platform}", "version:2.4.6")
M4_PKG = ("fuchsia/third_party/m4/${platform}", "version:1.4.18")
MAKE_PKG = ("fuchsia/third_party/make/${platform}", "version:4.3")
GNU_BUILD_TOOL_PKGS = (
AUTOCONF_PKG,
AUTOMAKE_PKG,
BISON_PKG,
LIBTOOL_PKG,
M4_PKG,
MAKE_PKG,
)
CLANG_PKG = ("fuchsia/third_party/clang/${platform}", "integration")
LINUX_SYSROOT_PKG = (
"fuchsia/third_party/sysroot/linux",
"git_revision:c912d089c3d46d8982fdef76a50514cca79b6132",
"sysroot",
)
def sysroot(api, cipd_dir):
if api.platform.is_linux:
return cipd_dir.join(LINUX_SYSROOT_PKG[-1])
elif api.platform.is_mac: # pragma: no cover
# TODO(fxbug.dev/3043): Eventually use our own hermetic sysroot as for Linux.
step_result = api.step(
"xcrun",
["xcrun", "--sdk", "macosx", "--show-sdk-path"],
stdout=api.raw_io.output(name="sdk-path", add_output_log=True),
step_test_data=lambda: api.raw_io.test_api.stream_output(
"/some/xcode/path"
),
)
return step_result.stdout.strip()
raise api.step.StepFailure("unsupported platform") # pragma: no cover
def RunSteps(api):
cipd_dir = api.path["start_dir"].join("cipd")
src_dir = api.path["start_dir"].join("jq")
with api.context(infra_steps=True):
to_ensure = [CLANG_PKG] + list(GNU_BUILD_TOOL_PKGS)
if api.platform.is_linux:
to_ensure.append(LINUX_SYSROOT_PKG)
pkgs = api.cipd.EnsureFile()
for pkg in to_ensure:
pkgs.add_package(*pkg)
api.cipd.ensure(cipd_dir, pkgs)
with api.step.nest("checkout"):
api.git.checkout(
JQ_REPO_URL,
path=src_dir,
ref=JQ_REPO_REVISION,
recursive=True,
submodules=True,
)
install_dir = api.path["start_dir"].join("install")
with api.context(
cwd=src_dir,
env_prefixes={"PATH": [cipd_dir.join("bin")]},
# TODO(fxbug.dev/58251): remove environment variable when possible.
env={"M4": cipd_dir.join("bin", "m4")},
):
api.step(
"autoreconf", ["autoreconf", "--verbose", "--install", "--force"],
)
configure_flags = ["--sysroot=%s" % sysroot(api, cipd_dir), "-O3"]
if not api.platform.is_mac:
# TODO: LTO is currently failing on macOS
configure_flags.append("-flto")
configure_variables = {
"CC": "clang",
"CXX": "clang++",
"CFLAGS": " ".join(configure_flags),
"CPPFLAGS": " ".join(configure_flags),
"CXXFLAGS": " ".join(configure_flags),
"LDFLAGS": " ".join(configure_flags),
}
if api.platform.is_linux:
configure_variables.update(
{
"AR": "llvm-ar",
"RANLIB": "llvm-ranlib",
"NM": "llvm-nm",
"STRIP": "llvm-strip",
"OBJCOPY": "llvm-objcopy",
}
)
api.step(
"configure",
[
"./configure",
"--with-oniguruma=builtin",
"--prefix=",
"--disable-dependency-tracking",
"--disable-shared",
"--enable-all-static",
]
+ sorted(["%s=%s" % (k, v) for k, v in configure_variables.iteritems()]),
)
api.step("make", ["make", "-j%d" % api.platform.cpu_count])
api.step("make check", ["make", "check"])
api.step(
"make install", ["make", "install", "DESTDIR=%s" % install_dir],
)
if api.buildbucket.builder_id.bucket == "ci":
api.archive.upload(install_dir, output_property="isolated")
if api.buildbucket.builder_id.bucket == "prod":
# TODO: factor this out into a host_build recipe module.
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],
)
api.upload.cipd_package(
"fuchsia/third_party/jq/%s" % platform,
install_dir,
[api.upload.DirectoryPath(install_dir)],
{"git_revision": JQ_REPO_REVISION},
)
def GenTests(api):
yield api.status_check.test("ci") + api.buildbucket.ci_build(
project="fuchsia", bucket="ci",
) + api.platform.name("linux")
yield api.status_check.test("prod") + api.buildbucket.ci_build(
project="fuchsia", bucket="prod",
) + api.platform.name("mac")