| Index: tools/build.py
|
| diff --git a/tools/build.py b/tools/build.py
|
| index 1d1b8c805eb612d53389e92c512eeb5369442e54..480a4740c54835fd08738a866034503d7c36a75b 100755
|
| --- a/tools/build.py
|
| +++ b/tools/build.py
|
| @@ -15,6 +15,9 @@ import utils
|
| HOST_OS = utils.GuessOS()
|
| HOST_CPUS = utils.GuessCpus()
|
| armcompilerlocation = '/opt/codesourcery/arm-2009q1'
|
| +SCRIPT_DIR = os.path.dirname(sys.argv[0])
|
| +DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))
|
| +THIRD_PARTY_ROOT = os.path.join(DART_ROOT, 'third_party')
|
|
|
| def BuildOptions():
|
| result = optparse.OptionParser()
|
| @@ -29,6 +32,9 @@ def BuildOptions():
|
| help='Target architectures (comma-separated).',
|
| metavar='[all,ia32,x64,simarm,arm]',
|
| default=utils.GuessArchitecture())
|
| + result.add_option("--os",
|
| + help='Target OS',
|
| + default=utils.GuessOS()),
|
| result.add_option("-j",
|
| help='The number of parallel jobs to run.',
|
| metavar=HOST_CPUS,
|
| @@ -39,7 +45,7 @@ def BuildOptions():
|
| return result
|
|
|
|
|
| -def ProcessOptions(options):
|
| +def ProcessOptions(options, args):
|
| if options.arch == 'all':
|
| options.arch = 'ia32,x64'
|
| if options.mode == 'all':
|
| @@ -54,19 +60,110 @@ def ProcessOptions(options):
|
| if not arch in ['ia32', 'x64', 'simarm', 'arm']:
|
| print "Unknown arch %s" % arch
|
| return False
|
| + if options.os != HOST_OS:
|
| + if options.os != 'android':
|
| + print "Unsupported target os %s" % options.os
|
| + return False
|
| + if not HOST_OS in ['linux']:
|
| + print ("Cross-compilation to %s is not supported on host os %s."
|
| + % (options.os, HOST_OS))
|
| + return False
|
| + if not arch in ['ia32']:
|
| + print ("Cross-compilation to %s is not supported for architecture %s."
|
| + % (options.os, arch))
|
| + return False
|
| + # We have not yet tweaked the v8 dart build to work with the Android
|
| + # NDK/SDK, so don't try to build it.
|
| + if args == []:
|
| + print "For android builds you must specify a target, such as 'dart'."
|
| + return False
|
| + if 'v8' in args:
|
| + print "The v8 target is not supported for android builds."
|
| + return False
|
| return True
|
|
|
|
|
| -def setTools(arch):
|
| - if arch == 'arm':
|
| +def SetTools(arch, toolchainprefix):
|
| + toolsOverride = None
|
| + if arch == 'arm' and toolchainprefix == None:
|
| + toolchainprefix = armcompilerlocation + "/bin/arm-none-linux-gnueabi"
|
| + if toolchainprefix:
|
| toolsOverride = {
|
| - "CC" : armcompilerlocation + "/bin/arm-none-linux-gnueabi-gcc",
|
| - "CXX" : armcompilerlocation + "/bin/arm-none-linux-gnueabi-g++",
|
| - "AR" : armcompilerlocation + "/bin/arm-none-linux-gnueabi-ar",
|
| - "LINK": armcompilerlocation + "/bin/arm-none-linux-gnueabi-g++",
|
| - "NM" : armcompilerlocation + "/bin/arm-none-linux-gnueabi-nm",
|
| + "CC" : toolchainprefix + "-gcc",
|
| + "CXX" : toolchainprefix + "-g++",
|
| + "AR" : toolchainprefix + "-ar",
|
| + "LINK": toolchainprefix + "-g++",
|
| + "NM" : toolchainprefix + "-nm",
|
| }
|
| - return toolsOverride
|
| + return toolsOverride
|
| +
|
| +
|
| +def CheckDirExists(path, docstring):
|
| + if not os.path.isdir(path):
|
| + raise Exception('Could not find %s directory %s'
|
| + % (docstring, path))
|
| +
|
| +
|
| +def SetCrossCompilationEnvironment(host_os, target_os, target_arch, old_path):
|
| + global THIRD_PARTY_ROOT
|
| + if host_os not in ['linux']:
|
| + raise Exception('Unsupported host os %s' % host_os)
|
| + if target_os not in ['android']:
|
| + raise Exception('Unsupported target os %s' % target_os)
|
| + if target_arch not in ['ia32']:
|
| + raise Exception('Unsupported target architecture %s' % target_arch)
|
| +
|
| + CheckDirExists(THIRD_PARTY_ROOT, 'third party tools');
|
| + android_tools = os.path.join(THIRD_PARTY_ROOT, 'android_tools')
|
| + CheckDirExists(android_tools, 'Android tools')
|
| + android_ndk_root = os.path.join(android_tools, 'ndk')
|
| + CheckDirExists(android_ndk_root, 'Android NDK')
|
| + android_sdk_root = os.path.join(android_tools, 'sdk')
|
| + CheckDirExists(android_sdk_root, 'Android SDK')
|
| +
|
| + os.environ['ANDROID_NDK_ROOT'] = android_ndk_root
|
| + os.environ['ANDROID_SDK_ROOT'] = android_sdk_root
|
| +
|
| + toolchain_arch = 'x86-4.4.3'
|
| + toolchain_dir = 'linux-x86'
|
| + android_toolchain = os.path.join(android_ndk_root,
|
| + 'toolchains', toolchain_arch,
|
| + 'prebuilt', toolchain_dir, 'bin')
|
| + CheckDirExists(android_toolchain, 'Android toolchain')
|
| +
|
| + os.environ['ANDROID_TOOLCHAIN'] = android_toolchain
|
| +
|
| + android_sdk_version = 9
|
| +
|
| + android_sdk_tools = os.path.join(android_sdk_root, 'tools')
|
| + CheckDirExists(android_sdk_tools, 'Android SDK tools')
|
| +
|
| + android_sdk_platform_tools = os.path.join(android_sdk_root, 'platform-tools')
|
| + CheckDirExists(android_sdk_platform_tools, 'Android SDK platform tools')
|
| +
|
| + pathList = [old_path,
|
| + android_ndk_root,
|
| + android_sdk_tools,
|
| + android_sdk_platform_tools,
|
| + # for Ninja - maybe don't need?
|
| + android_toolchain
|
| + ]
|
| + os.environ['PATH'] = ':'.join(pathList)
|
| +
|
| + gypDefinesList = [
|
| + 'target_arch=ia32',
|
| + 'OS=%s' % target_os,
|
| + 'android_build_type=0',
|
| + 'host_os=%s' % host_os,
|
| + 'linux_fpic=1',
|
| + 'release_optimize=s',
|
| + 'linux_use_tcmalloc=0',
|
| + 'android_sdk=%s', os.path.join(android_sdk_root, 'platforms',
|
| + 'android-%d' % android_sdk_version),
|
| + 'android_sdk_tools=%s' % android_sdk_platform_tools
|
| + ]
|
| +
|
| + os.environ['GYP_DEFINES'] = ' '.join(gypDefinesList)
|
|
|
|
|
| def Execute(args):
|
| @@ -77,16 +174,41 @@ def Execute(args):
|
| raise Error(args[0] + " failed")
|
|
|
|
|
| +def GClientRunHooks():
|
| + Execute(['gclient', 'runhooks'])
|
| +
|
| +
|
| +def RunhooksIfNeeded(host_os, mode, arch, target_os):
|
| + build_root = utils.GetBuildRoot(host_os)
|
| + build_cookie_path = os.path.join(build_root, 'lastHooksTargetOS.txt')
|
| +
|
| + old_target_os = None
|
| + try:
|
| + with open(build_cookie_path) as f:
|
| + old_target_os = f.read(1024)
|
| + except IOError as e:
|
| + pass
|
| + if target_os != old_target_os:
|
| + try:
|
| + os.mkdir(build_root)
|
| + except OSError as e:
|
| + pass
|
| + with open(build_cookie_path, 'w') as f:
|
| + f.write(target_os)
|
| + GClientRunHooks()
|
| +
|
| +
|
| def CurrentDirectoryBaseName():
|
| """Returns the name of the current directory"""
|
| return os.path.relpath(os.curdir, start=os.pardir)
|
|
|
| +
|
| def Main():
|
| utils.ConfigureJava()
|
| # Parse the options.
|
| parser = BuildOptions()
|
| (options, args) = parser.parse_args()
|
| - if not ProcessOptions(options):
|
| + if not ProcessOptions(options, args):
|
| parser.print_help()
|
| return 1
|
| # Determine which targets to build. By default we build the "all" target.
|
| @@ -97,6 +219,11 @@ def Main():
|
| target = 'all'
|
| else:
|
| target = args[0]
|
| +
|
| + target_os = options.os
|
| +
|
| + # Remember path
|
| + old_path = os.environ['PATH']
|
| # Build the targets for each requested configuration.
|
| for mode in options.mode:
|
| for arch in options.arch:
|
| @@ -149,11 +276,23 @@ def Main():
|
|
|
| args += [target]
|
|
|
| - toolsOverride = setTools(arch)
|
| + if target_os != HOST_OS:
|
| + SetCrossCompilationEnvironment(
|
| + HOST_OS, target_os, arch, old_path)
|
| +
|
| + RunhooksIfNeeded(HOST_OS, mode, arch, target_os)
|
| +
|
| + toolchainprefix = None
|
| + if target_os == 'android':
|
| + toolchainprefix = ('%s/i686-linux-android'
|
| + % os.environ['ANDROID_TOOLCHAIN'])
|
| + toolsOverride = SetTools(arch, toolchainprefix)
|
| if toolsOverride:
|
| + printToolOverrides = target_os != 'android'
|
| for k, v in toolsOverride.iteritems():
|
| args.append( k + "=" + v)
|
| - print k + " = " + v
|
| + if printToolOverrides:
|
| + print k + " = " + v
|
|
|
| print ' '.join(args)
|
| process = subprocess.Popen(args)
|
|
|