blob: 4ecb67e1c78fa9925ed0832781d1bdee22b1e649 [file] [log] [blame]
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed under the Apache License, Version 2.0
# that can be found in the LICENSE file.
"""Recipe for building Ninja."""
from PB.go.chromium.org.luci.common.proto.srcman.manifest import Manifest
from google.protobuf import json_format
DEPS = [
"fuchsia/git",
"fuchsia/macos_sdk",
"fuchsia/status_check",
"fuchsia/upload",
"recipe_engine/buildbucket",
"recipe_engine/cipd",
"recipe_engine/context",
"recipe_engine/file",
"recipe_engine/path",
"recipe_engine/platform",
"recipe_engine/raw_io",
"recipe_engine/step",
]
GIT_URL = "https://fuchsia.googlesource.com/third_party/github.com/ninja-build/ninja"
CIPD_SERVER_HOST = "chrome-infra-packages.appspot.com"
def RunSteps(api):
manifest = Manifest()
with api.step.nest("checkout sources"), api.context(infra_steps=True):
src_dir = api.path["start_dir"].join("ninja")
revision = api.git.checkout_from_build_input(src_dir, GIT_URL)
git_checkout = manifest.directories[str(src_dir)].git_checkout
git_checkout.repo_url = GIT_URL
git_checkout.revision = revision
with api.step.nest("ensure packages"), api.context(infra_steps=True):
cipd_dir = api.path["start_dir"].join("cipd")
pkgs = api.cipd.EnsureFile()
pkgs.add_package("fuchsia/third_party/clang/${platform}", "integration")
if api.platform.is_linux:
pkgs.add_package(
"fuchsia/third_party/sysroot/linux",
"git_revision:47910c0625ad625def7d9e21c9213c91eb9cfa51",
"sysroot",
)
pkgs.add_package(
"fuchsia/third_party/cmake/${platform}",
"git_revision:4f90fef85f6391e63dfae26bd6f290c59ea48e95",
)
pkgs.add_package(
"fuchsia/third_party/ninja/${platform}",
"git_revision:0ccc7886fd4694ae1372d29b4954e2dd3be118be",
)
ensured = api.cipd.ensure(cipd_dir, pkgs)
for subdir, pins in ensured.iteritems():
directory = manifest.directories[str(cipd_dir.join(subdir))]
directory.cipd_server_host = CIPD_SERVER_HOST
for pin in pins:
directory.cipd_package[pin.package].instance_id = pin.instance_id
json_manifest = json_format.MessageToJson(
manifest, preserving_proto_field_name=True
)
api.file.write_text(
"source manifest", src_dir.join("source_manifest.json"), json_manifest
)
build_dir = api.path["start_dir"].join("ninja_build_dir")
api.file.ensure_directory("create build dir", build_dir)
with api.macos_sdk(), api.context(cwd=build_dir):
options = [
"-GNinja",
"-DCMAKE_C_COMPILER=%s" % cipd_dir.join("bin", "clang"),
"-DCMAKE_CXX_COMPILER=%s" % cipd_dir.join("bin", "clang++"),
"-DCMAKE_ASM_COMPILER=%s" % cipd_dir.join("bin", "clang"),
"-DCMAKE_MAKE_PROGRAM=%s" % cipd_dir.join("ninja"),
"-DCMAKE_BUILD_TYPE=Release",
"-DCMAKE_INSTALL_PREFIX=",
]
if api.platform.is_linux:
options.extend(
[
"-DCMAKE_SYSROOT=%s" % cipd_dir.join("sysroot"),
# TODO(phosek): see https://github.com/ninja-build/ninja/issues/1821
"-DCMAKE_C_FLAGS=-DUSE_PPOLL",
"-DCMAKE_CXX_FLAGS=-DUSE_PPOLL",
]
)
elif api.platform.is_mac:
options.extend(
[
"-DCMAKE_SYSROOT=%s"
% 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"
),
).stdout.strip(),
]
+ [
"-DCMAKE_%s_LINKER_FLAGS=-nostdlib++ %s"
% (mode, cipd_dir.join("lib", "libc++.a"))
for mode in ["SHARED", "MODULE", "EXE"]
]
)
api.step("configure", [cipd_dir.join("bin", "cmake"),] + options + [src_dir])
api.step("build", [cipd_dir.join("ninja")])
api.step("test", [cipd_dir.join("ninja"), "test"])
if api.platform.is_linux:
api.step(
"strip",
[
cipd_dir.join("bin", "llvm-objcopy"),
"--strip-sections",
build_dir.join("ninja"),
],
)
elif api.platform.is_mac:
api.step("strip", ["xcrun", "strip", "-x", build_dir.join("ninja")])
ninja = build_dir.join("ninja" + (".exe" if api.platform.is_win else ""))
step_result = api.step(
"ninja version",
[ninja, "--version"],
stdout=api.raw_io.output(),
step_test_data=lambda: api.raw_io.test_api.stream_output("1.9.0.git"),
)
ninja_version = step_result.stdout.strip()
# Upload the installation to isolate.
api.upload.upload_isolated(build_dir, [api.upload.FilePath(ninja)])
if api.buildbucket.builder_id.bucket == "prod":
# Upload the installation to CIPD for production builds.
api.upload.cipd_package(
"fuchsia/third_party/ninja/${platform}",
build_dir,
[api.upload.FilePath(ninja)],
{"git_revision": revision},
repository=GIT_URL,
extra_tags={"version": ninja_version},
)
def GenTests(api):
for platform in ("linux", "mac", "win"):
yield (
api.status_check.test(platform)
+ api.platform.name(platform)
+ api.buildbucket.ci_build(
project="fuchsia", bucket="prod", git_repo=GIT_URL, revision="a" * 40,
)
)