You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.0 KiB
103 lines
3.0 KiB
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
# Copyright 2019 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
"""Build script that builds a binary from a bundle."""
|
|
|
|
from __future__ import print_function
|
|
|
|
import argparse
|
|
import os.path
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument(
|
|
'--config',
|
|
required=True,
|
|
choices=['cros.hardened', 'cros.nonhardened', 'cros.host', 'android'])
|
|
parser.add_argument('--use_ccache', required=True, choices=['true', 'false'])
|
|
parser.add_argument(
|
|
'--use_llvm_next', required=True, choices=['true', 'false'])
|
|
parser.add_argument('--output_file', required=True, type=str)
|
|
parser.add_argument(
|
|
'--static',
|
|
choices=['true', 'false'],
|
|
help='If true, produce a static wrapper. Autodetects a good value if '
|
|
'unspecified.')
|
|
args = parser.parse_args()
|
|
|
|
if args.static is None:
|
|
args.static = 'cros' not in args.config
|
|
else:
|
|
args.static = args.static == 'true'
|
|
|
|
return args
|
|
|
|
|
|
def calc_go_args(args, version, build_dir):
|
|
ldFlags = [
|
|
'-X',
|
|
'main.ConfigName=' + args.config,
|
|
'-X',
|
|
'main.UseCCache=' + args.use_ccache,
|
|
'-X',
|
|
'main.UseLlvmNext=' + args.use_llvm_next,
|
|
'-X',
|
|
'main.Version=' + version,
|
|
]
|
|
|
|
# If the wrapper is intended for Chrome OS, we need to use libc's exec.
|
|
extra_args = []
|
|
if not args.static:
|
|
extra_args += ['-tags', 'libc_exec']
|
|
|
|
if args.config == 'android':
|
|
# If android_llvm_next_flags.go DNE, we'll get an obscure "no
|
|
# llvmNextFlags" build error; complaining here is clearer.
|
|
if not os.path.exists(
|
|
os.path.join(build_dir, 'android_llvm_next_flags.go')):
|
|
sys.exit('In order to build the Android wrapper, you must have a local '
|
|
'android_llvm_next_flags.go file; please see '
|
|
'cros_llvm_next_flags.go.')
|
|
extra_args += ['-tags', 'android_llvm_next_flags']
|
|
|
|
return [
|
|
'go', 'build', '-o',
|
|
os.path.abspath(args.output_file), '-ldflags', ' '.join(ldFlags)
|
|
] + extra_args
|
|
|
|
|
|
def read_version(build_dir):
|
|
version_path = os.path.join(build_dir, 'VERSION')
|
|
if os.path.exists(version_path):
|
|
with open(version_path, 'r') as r:
|
|
return r.read()
|
|
|
|
last_commit_msg = subprocess.check_output(
|
|
['git', '-C', build_dir, 'log', '-1', '--pretty=%B'], encoding='utf-8')
|
|
# Use last found change id to support reverts as well.
|
|
change_ids = re.findall(r'Change-Id: (\w+)', last_commit_msg)
|
|
if not change_ids:
|
|
sys.exit("Couldn't find Change-Id in last commit message.")
|
|
return change_ids[-1]
|
|
|
|
|
|
def main():
|
|
args = parse_args()
|
|
build_dir = os.path.dirname(__file__)
|
|
version = read_version(build_dir)
|
|
# Note: Go does not support using absolute package names.
|
|
# So we run go inside the directory of the the build file.
|
|
sys.exit(
|
|
subprocess.call(calc_go_args(args, version, build_dir), cwd=build_dir))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|