| #!/usr/bin/python |
| # Copyright 2018 The Tulsi Authors. All rights reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| """Invokes Bazel builds for the given target using Tulsi specific flags.""" |
| |
| |
| import argparse |
| import pipes |
| import subprocess |
| import sys |
| from bazel_build_settings import BUILD_SETTINGS |
| |
| |
| def _FatalError(msg, exit_code=1): |
| """Prints a fatal error message to stderr and exits.""" |
| sys.stderr.write(msg) |
| sys.exit(exit_code) |
| |
| |
| def _BuildSettingsTargetForTargets(targets): |
| """Returns the singular target to use when fetching build settings.""" |
| return targets[0] if len(targets) == 1 else None |
| |
| |
| def _CreateCommand(targets, build_settings, test, release, |
| config, xcode_version, force_swift): |
| """Creates a Bazel command for targets with the specified settings.""" |
| target = _BuildSettingsTargetForTargets(targets) |
| bazel, startup, flags = build_settings.flags_for_target( |
| target, not release, config, is_swift_override=force_swift) |
| bazel_action = 'test' if test else 'build' |
| |
| command = [bazel] |
| command.extend(startup) |
| command.append(bazel_action) |
| command.extend(flags) |
| if xcode_version: |
| command.append('--xcode_version=%s' % xcode_version) |
| command.append('--tool_tag=tulsi:user_build') |
| command.extend(targets) |
| |
| return command |
| |
| |
| def _QuoteCommandForShell(cmd): |
| cmd = [pipes.quote(x) for x in cmd] |
| return ' '.join(cmd) |
| |
| |
| def _InterruptSafeCall(cmd): |
| p = subprocess.Popen(cmd) |
| try: |
| return p.wait() |
| except KeyboardInterrupt: |
| return p.wait() |
| |
| |
| def main(): |
| if not BUILD_SETTINGS: |
| _FatalError('Unable to fetch build settings. Please report a Tulsi bug.') |
| |
| default_config = BUILD_SETTINGS.defaultPlatformConfigId |
| config_options = BUILD_SETTINGS.platformConfigFlags |
| config_help = ( |
| 'Bazel apple config (used for flags). Default: {}').format(default_config) |
| |
| parser = argparse.ArgumentParser(description='Invoke a Bazel build or test ' |
| 'with the same flags as Tulsi.') |
| parser.add_argument('--test', dest='test', action='store_true', default=False) |
| parser.add_argument('--release', dest='release', action='store_true', |
| default=False) |
| parser.add_argument('--noprint_cmd', dest='print_cmd', action='store_false', |
| default=True) |
| parser.add_argument('--norun', dest='run', action='store_false', default=True) |
| parser.add_argument('--config', help=config_help, default=default_config, |
| choices=config_options) |
| parser.add_argument('--xcode_version', help='Bazel --xcode_version flag.') |
| parser.add_argument('--force_swift', dest='swift', action='store_true', |
| default=None, help='Forcibly treat the given targets ' |
| 'as containing Swift.') |
| parser.add_argument('--force_noswift', dest='swift', action='store_false', |
| default=None, help='Forcibly treat the given targets ' |
| 'as not containing Swift.') |
| parser.add_argument('targets', nargs='+') |
| |
| args = parser.parse_args() |
| command = _CreateCommand(args.targets, BUILD_SETTINGS, args.test, |
| args.release, args.config, args.xcode_version, |
| args.swift) |
| if args.print_cmd: |
| print _QuoteCommandForShell(command) |
| |
| if args.run: |
| return _InterruptSafeCall(command) |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |