diff options
Diffstat (limited to 'compiler_wrapper/build.py')
-rwxr-xr-x | compiler_wrapper/build.py | 178 |
1 files changed, 102 insertions, 76 deletions
diff --git a/compiler_wrapper/build.py b/compiler_wrapper/build.py index f98b2549..930c2cfb 100755 --- a/compiler_wrapper/build.py +++ b/compiler_wrapper/build.py @@ -1,12 +1,11 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# Copyright 2019 The Chromium OS Authors. All rights reserved. +# Copyright 2019 The ChromiumOS Authors # 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 @@ -16,87 +15,114 @@ 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 + 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( + "--version_suffix", + help="A string appended to the computed version of the wrapper. This " + "is appeneded directly without any delimiter.", + ) + 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 + # These seem unnecessary, and might lead to breakages with Go's ldflag + # parsing. Don't allow them. + if "'" in version: + raise ValueError("`version` should not contain single quotes") + + ldFlags = [ + "-X", + "main.ConfigName=" + args.config, + "-X", + "main.UseCCache=" + args.use_ccache, + "-X", + "main.UseLlvmNext=" + args.use_llvm_next, + "-X", + # Quote this, as `version` may have spaces in it. + "'main.Version=" + version + "'", + ] + + # If the wrapper is intended for ChromeOS, 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() + 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] + 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() + args = parse_args() + build_dir = os.path.dirname(__file__) + version = read_version(build_dir) + if args.version_suffix: + version += args.version_suffix + # 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() |