blob: d6a2d91c581afaf9fb7333350106b32aa1353031 [file] [log] [blame]
# Copyright 2018 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 some Breakpad tools."""
from recipe_engine.recipe_api import Property
DEPS = [
"fuchsia/git",
"fuchsia/gitiles",
"fuchsia/upload",
"recipe_engine/context",
"recipe_engine/file",
"recipe_engine/json",
"recipe_engine/path",
"recipe_engine/platform",
"recipe_engine/step",
]
BREAKPAD_GIT = "https://chromium.googlesource.com/breakpad/breakpad"
DEPOT_TOOLS_GIT = "https://chromium.googlesource.com/chromium/tools/depot_tools.git"
PROPERTIES = {
"url": Property(kind=str, help="Git repository URL", default=BREAKPAD_GIT),
"ref": Property(kind=str, help="Git reference", default="refs/heads/master"),
}
def RunSteps(api, url, ref):
revision = api.gitiles.refs(url).get(ref, None)
depot_tools_path = api.path["start_dir"].join("depot_tools")
with api.context(infra_steps=True):
api.git.checkout(DEPOT_TOOLS_GIT, depot_tools_path)
# Use gclient to fetch the DEPS.
tree_root_dir = api.path["start_dir"].join("breakpad")
api.file.ensure_directory("makedirs breakpad", tree_root_dir)
with api.context(
infra_steps=True, cwd=tree_root_dir, env_prefixes={"PATH": [depot_tools_path]}
):
# The gclient root is breakpad/.
api.step(
"gclient config",
["gclient", "config", "--name=src", "--unmanaged", "-v", url,],
)
# This first sync seems redundant, but is necessary on a clean tree,
# otherwise the root git repo won't yet have been pulled, so there won't be
# anything for git to pin.
api.step("gclient sync", ["gclient", "sync",])
# The code is pulled by gclient sync inside breakpad/src, which is then
# pinned to the specified revision.
src_dir = tree_root_dir.join("src")
with api.context(cwd=src_dir):
api.step("pin git", ["git", "checkout", revision])
# This sync updates the dependencies to those matching |revision| as
# specified by DEPS in the root git repo.
api.step(
"gclient sync",
["gclient", "sync", "-v", "--output-json", api.json.output(),],
)
api.step.active_result.presentation.properties["got_revision"] = revision
# Build the two required tools, dump_syms and sym_upload using configure and
# make.
build_dir_relpath = ["src", "tools", api.platform.name]
dump_syms_relpath = build_dir_relpath + ["dump_syms", "dump_syms"]
build_dir = src_dir.join(*build_dir_relpath)
dump_syms_file = src_dir.join(*dump_syms_relpath)
with api.context(cwd=src_dir):
api.step("configure", ["./configure"])
# make targets must be relative paths.
api.step("build", ["make", api.path.join(*dump_syms_relpath),])
# Create a cipd package definition and then register the package.
api.upload.cipd_package(
"fuchsia/tools/breakpad/${platform}",
build_dir,
[api.upload.FilePath(dump_syms_file),],
{"git_revision": revision},
repository=url,
)
def GenTests(api):
revision = "9eac2058b70615519b2c4d8c6bdbfca1bd079e39"
refs_data = api.gitiles.refs("refs", ("refs/heads/master", revision))
yield (api.test("default") + refs_data)
yield (
api.test("new_version")
+ refs_data
+ api.step_data(
"cipd.cipd search fuchsia/tools/breakpad/${platform} "
+ "git_revision:"
+ revision,
api.json.output({"result": []}),
)
)