| Index: dart/tools/build.py
|
| ===================================================================
|
| --- dart/tools/build.py (revision 31530)
|
| +++ dart/tools/build.py (working copy)
|
| @@ -30,8 +30,9 @@
|
| $ chmod u+x install-build-deps.sh
|
| $ ./install-build-deps.sh --arm --no-chromeos-fonts
|
| """
|
| -DEFAULT_ARM_CROSS_COMPILER_PATH = '/usr'
|
| +DEFAULT_ARM_CROSS_COMPILER_PATH = '/usr/bin'
|
|
|
| +
|
| def BuildOptions():
|
| result = optparse.OptionParser()
|
| result.add_option("-m", "--mode",
|
| @@ -49,6 +50,9 @@
|
| help='Target OSs (comma-separated).',
|
| metavar='[all,host,android]',
|
| default='host')
|
| + result.add_option("-t", "--toolchain",
|
| + help='Cross-compiler toolchain path',
|
| + default=None)
|
| result.add_option("-j",
|
| help='The number of parallel jobs to run.',
|
| metavar=HOST_CPUS,
|
| @@ -101,14 +105,14 @@
|
| print ("Cross-compilation to %s is not supported on host os %s."
|
| % (os, HOST_OS))
|
| return False
|
| - if not arch in ['ia32']:
|
| + if not arch in ['ia32', 'arm']:
|
| print ("Cross-compilation to %s is not supported for architecture %s."
|
| % (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 'samples'."
|
| + print "For android builds you must specify a target, such as 'runtime'."
|
| return False
|
| if 'v8' in args:
|
| print "The v8 target is not supported for android builds."
|
| @@ -116,19 +120,42 @@
|
| return True
|
|
|
|
|
| -def SetTools(arch, toolchainprefix):
|
| +def SetTools(arch, target_os, toolchainprefix):
|
| toolsOverride = None
|
| +
|
| + # For Android, by default use the toolchain from third_party/android_tools.
|
| + if target_os == 'android' and toolchainprefix == None:
|
| + android_toolchain = GetAndroidToolchainDir(HOST_OS, arch)
|
| + if arch == 'arm':
|
| + toolchainprefix = os.path.join(
|
| + android_toolchain, 'arm-linux-androideabi')
|
| + if arch == 'ia32':
|
| + toolchainprefix = os.path.join(
|
| + android_toolchain, 'i686-linux-android')
|
| +
|
| + # For ARM Linux, by default use the Linux distribution's cross-compiler.
|
| if arch == 'arm' and toolchainprefix == None:
|
| - # Here, we specify the hf compiler. If this changes, we must also remove
|
| + # We specify the hf compiler. If this changes, we must also remove
|
| # the ARM_FLOAT_ABI_HARD define in configurations_make.gypi.
|
| toolchainprefix = (DEFAULT_ARM_CROSS_COMPILER_PATH +
|
| - "/bin/arm-linux-gnueabihf")
|
| + "/arm-linux-gnueabihf")
|
| +
|
| + # TODO(zra): Find a default MIPS Linux cross-compiler?
|
| +
|
| + # Override the Android toolchain's linker to handle some complexity in the
|
| + # linker arguments that gyp has trouble with.
|
| + linker = ""
|
| + if target_os == 'android':
|
| + linker = os.path.join(DART_ROOT, 'tools', 'android_link.py')
|
| + elif toolchainprefix:
|
| + linker = toolchainprefix + "-g++"
|
| +
|
| if toolchainprefix:
|
| toolsOverride = {
|
| "CC.target" : toolchainprefix + "-gcc",
|
| "CXX.target" : toolchainprefix + "-g++",
|
| "AR.target" : toolchainprefix + "-ar",
|
| - "LINK.target": toolchainprefix + "-g++",
|
| + "LINK.target": linker,
|
| "NM.target" : toolchainprefix + "-nm",
|
| }
|
| return toolsOverride
|
| @@ -140,101 +167,40 @@
|
| % (docstring, path))
|
|
|
|
|
| -def SetCrossCompilationEnvironment(host_os, target_os, target_arch, old_path):
|
| +def GetAndroidToolchainDir(host_os, target_arch):
|
| 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']:
|
| + if target_arch not in ['ia32', 'arm']:
|
| raise Exception('Unsupported target architecture %s' % target_arch)
|
|
|
| + # Set up path to the Android NDK.
|
| 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'
|
| + # Set up the directory of the Android NDK cross-compiler toolchain.
|
| + toolchain_arch = 'arm-linux-androideabi-4.6'
|
| + if target_arch == 'ia32':
|
| + toolchain_arch = 'x86-4.6'
|
| + toolchain_dir = 'linux-x86_64'
|
| 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
|
| + return android_toolchain
|
|
|
| - android_sdk_version = 15
|
|
|
| - 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):
|
| process = subprocess.Popen(args)
|
| process.wait()
|
| if process.returncode != 0:
|
| - raise Exception(args[0] + " failed")
|
| + raise Exception(args[0] + " failed")
|
|
|
|
|
| -def GClientRunHooks():
|
| - Execute(['gclient', 'runhooks'])
|
| -
|
| -
|
| -def RunhooksIfNeeded(host_os, mode, arch, target_os):
|
| - if host_os != 'linux':
|
| - return
|
| - 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)
|
| @@ -353,15 +319,13 @@
|
| targets = args
|
|
|
| filter_xcodebuild_output = False
|
| - # Remember path
|
| - old_path = os.environ['PATH']
|
| # Build all targets for each requested configuration.
|
| for target in targets:
|
| for target_os in options.os:
|
| for mode in options.mode:
|
| for arch in options.arch:
|
| os.environ['DART_BUILD_MODE'] = mode
|
| - build_config = utils.GetBuildConf(mode, arch)
|
| + build_config = utils.GetBuildConf(mode, arch, target_os)
|
| if HOST_OS == 'macos':
|
| filter_xcodebuild_output = True
|
| project_file = 'dart.xcodeproj'
|
| @@ -412,22 +376,12 @@
|
|
|
| args += [target]
|
|
|
| - 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)
|
| + toolchainprefix = options.toolchain
|
| + toolsOverride = SetTools(arch, target_os, toolchainprefix)
|
| if toolsOverride:
|
| - printToolOverrides = target_os != 'android'
|
| for k, v in toolsOverride.iteritems():
|
| args.append( k + "=" + v)
|
| - if printToolOverrides:
|
| + if options.verbose:
|
| print k + " = " + v
|
| if not os.path.isfile(toolsOverride['CC.target']):
|
| if arch == 'arm':
|
|
|