#!/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())

#!/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())

#!/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. Prints a fatal error message to stderr and exits. Returns the singular target to use when fetching build settings. Creates a Bazel command for targets with the specified settings.