blob: c43b0396d85069441d93c70dca15d9630764ec9c [file] [log] [blame]
#!/usr/bin/env python
# Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
"""Used to run pub before the SDK has been built"""
import argparse
import os
import platform
import subprocess
import sys
SCRIPT_DIR = os.path.dirname(sys.argv[0])
DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))
PUB_PATH = os.path.join(DART_ROOT, 'sdk/lib/_internal/pub/bin/pub.dart')
CANARY_PATH = os.path.join(DART_ROOT, 'tools', 'canary.dart')
usage = """run_pub.py --package-root=<package root>"""
def BuildArguments():
result = argparse.ArgumentParser(usage=usage)
result.add_argument("--package-root", help="package root", default=None)
result.add_argument("--dart-executable", help="dart binary", default=None)
return result
def ProcessOptions(options, args):
return ((options.package_root != None) and
(options.dart_executable != None))
def GetPrebuiltDartExecutablePath(suffix):
osdict = {'Darwin':'macos', 'Linux':'linux', 'Windows':'windows'}
system = platform.system()
executable_name = 'dart'
if system == 'Windows':
executable_name = 'dart.exe'
try:
osname = osdict[system]
except KeyError:
print >>sys.stderr, ('WARNING: platform "%s" not supported') % (system)
return None;
return os.path.join(DART_ROOT,
'tools',
'testing',
'bin',
osname,
executable_name + suffix)
def RunPub(dart, pkg_root, args):
return subprocess.call([dart, '--package-root=' + pkg_root, PUB_PATH] + args)
def TryRunningExecutable(dart_executable, pkg_root):
try:
return subprocess.call([dart_executable,
'--package-root=' + pkg_root,
CANARY_PATH]) == 42
except:
return False;
def DisplayBootstrapWarning():
print """\
WARNING: Your system cannot run the prebuilt Dart executable. Using the
bootstrap Dart executable will make Debug builds long.
Please see Wiki for instructions on replacing prebuilt Dart executable.
https://code.google.com/p/dart/wiki/ReplacingPrebuiltDartExecutable
"""
def FindDartExecutable(fallback_executable, package_root):
# If requested, use the bootstrap binary instead of the prebuilt
# executable.
if os.getenv('DART_USE_BOOTSTRAP_BIN') != None:
return fallback_executable
# Try to find a working prebuilt dart executable.
dart_executable = GetPrebuiltDartExecutablePath('')
if TryRunningExecutable(dart_executable, package_root):
return dart_executable
dart_executable = GetPrebuiltDartExecutablePath('-arm')
if TryRunningExecutable(dart_executable, package_root):
return dart_executable
dart_executable = GetPrebuiltDartExecutablePath('-mips')
if TryRunningExecutable(dart_executable, package_root):
return dart_executable
# If the system cannot execute a prebuilt dart executable, use the bootstrap
# executable instead.
DisplayBootstrapWarning()
return fallback_executable
def main():
# Parse the options.
parser = BuildArguments()
(options, args) = parser.parse_known_args()
if not ProcessOptions(options, args):
parser.print_help()
return 1
dart_executable = FindDartExecutable(options.dart_executable,
options.package_root)
return RunPub(dart_executable, options.package_root, args)
if __name__ == '__main__':
sys.exit(main())