Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(295)

Unified Diff: tools/build.py

Issue 10823209: Add support for building the Dart VM for Android OS. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Removed unused script tools/android/envsetup.sh Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)
« runtime/tools/utils.py ('K') | « runtime/vm/vm.gypi ('k') | tools/gyp/configurations.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698