blob: 1cbc3c22cfa252dead5f9b31a82340ca3b121483 [file] [log] [blame]
# Copyright 2019 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 CMake."""
from PB.go.chromium.org.luci.common.proto.srcman.manifest import Manifest
from google.protobuf import json_format
import re
DEPS = [
'fuchsia/git',
'fuchsia/goma',
'fuchsia/macos_sdk',
'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/source_manifest',
'recipe_engine/step',
]
GIT_URL = 'https://fuchsia.googlesource.com/third_party/github.com/Kitware/CMake'
CIPD_SERVER_HOST = 'chrome-infra-packages.appspot.com'
def RunSteps(api):
api.goma.ensure()
manifest = Manifest()
with api.step.nest('checkout sources'), api.context(infra_steps=True):
gitiles_commit = api.buildbucket.build_input.gitiles_commit
repository = ('https://%s/%s' %
(gitiles_commit.host, gitiles_commit.project) if
gitiles_commit.host and gitiles_commit.project else GIT_URL)
ref = gitiles_commit.id or 'refs/heads/master'
src_dir = api.path['start_dir'].join('cmake')
revision = api.git.checkout(repository, path=src_dir, ref=ref)
git_checkout = manifest.directories[str(src_dir)].git_checkout
git_checkout.repo_url = repository
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()
if api.platform.is_linux or api.platform.is_mac:
pkgs.add_package('fuchsia/third_party/clang/${platform}', 'goma')
if api.platform.is_linux:
pkgs.add_package('fuchsia/sysroot/${platform}',
'git_revision:a28dfa20af063e5ca00634024c85732e20220419',
'sysroot')
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
staging_dir = api.path.mkdtemp('cmake')
build_dir = staging_dir.join('cmake_build_dir')
api.file.ensure_directory('create build dir', build_dir)
pkg_dir = staging_dir.join('cmake')
api.file.ensure_directory('create pkg dir', pkg_dir)
json_manifest = json_format.MessageToJson(
manifest, preserving_proto_field_name=True)
api.file.write_text('source manifest', pkg_dir.join('source_manifest.json'),
json_manifest)
api.source_manifest.set_json_manifest('checkout', json_manifest)
with api.context(cwd=build_dir):
api.step('bootstrap', [
src_dir.join('bootstrap'),
])
api.step('build', ['make'])
with api.context(env={'DESTDIR': pkg_dir}):
api.step('install', ['make', 'install'])
api.step('test', ['make', 'test'])
# TODO: We need to bootstrap CMake before we can build CMake using CMake
#api.step('configure cmake', [
# cipd_dir.join('bin', 'cmake'),
# '-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=',
# '-DCMAKE_USE_OPENSSL=OFF',
# src_dir,
#])
#api.step('build cmake', [cipd_dir.join('ninja')])
#with api.context(env={'DESTDIR': pkg_dir}):
# api.step('install cmake', [cipd_dir.join('ninja'), 'install'])
step_result = api.step(
'cmake version', [build_dir.join('bin', 'cmake'), '--version'],
stdout=api.raw_io.output(),
step_test_data=lambda: api.raw_io.test_api.stream_output(
'cmake version 3.9.20170826-g6285f-dirty'))
m = re.search(r'cmake version (\w+)', step_result.stdout)
assert m, 'Cannot determine CMake version'
cmake_version = m.group(1)
# Upload the installation to isolate.
api.upload.upload_isolated(pkg_dir)
if api.buildbucket.builder_id.bucket == 'prod':
# Upload the installation to CIPD for production builds.
api.upload.cipd_package(
'fuchsia/third_party/cmake/${platform}',
pkg_dir, [api.upload.DirectoryPath(pkg_dir)],
{'git_revision': revision},
repository=repository,
extra_tags={'version': cmake_version})
def GenTests(api):
for platform in ('linux', 'mac', 'win'):
yield (api.test(platform) + api.platform.name(platform) +
api.buildbucket.ci_build(
project='fuchsia',
bucket='prod',
git_repo=GIT_URL,
revision='a' * 40,
))