OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # | 2 # |
3 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 3 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
4 # for details. All rights reserved. Use of this source code is governed by a | 4 # for details. All rights reserved. Use of this source code is governed by a |
5 # BSD-style license that can be found in the LICENSE file. | 5 # BSD-style license that can be found in the LICENSE file. |
6 # | 6 # |
7 | 7 |
8 import optparse | 8 import optparse |
9 import os | 9 import os |
10 import re | 10 import re |
(...skipping 12 matching lines...) Expand all Loading... |
23 Couldn't find the arm cross compiler. | 23 Couldn't find the arm cross compiler. |
24 To make sure that you have the arm cross compilation tools installed, run: | 24 To make sure that you have the arm cross compilation tools installed, run: |
25 | 25 |
26 $ wget http://src.chromium.org/chrome/trunk/src/build/install-build-deps.sh | 26 $ wget http://src.chromium.org/chrome/trunk/src/build/install-build-deps.sh |
27 OR | 27 OR |
28 $ svn co http://src.chromium.org/chrome/trunk/src/build; cd build | 28 $ svn co http://src.chromium.org/chrome/trunk/src/build; cd build |
29 Then, | 29 Then, |
30 $ chmod u+x install-build-deps.sh | 30 $ chmod u+x install-build-deps.sh |
31 $ ./install-build-deps.sh --arm --no-chromeos-fonts | 31 $ ./install-build-deps.sh --arm --no-chromeos-fonts |
32 """ | 32 """ |
33 DEFAULT_ARM_CROSS_COMPILER_PATH = '/usr' | 33 DEFAULT_ARM_CROSS_COMPILER_PATH = '/usr/bin' |
| 34 |
34 | 35 |
35 def BuildOptions(): | 36 def BuildOptions(): |
36 result = optparse.OptionParser() | 37 result = optparse.OptionParser() |
37 result.add_option("-m", "--mode", | 38 result.add_option("-m", "--mode", |
38 help='Build variants (comma-separated).', | 39 help='Build variants (comma-separated).', |
39 metavar='[all,debug,release]', | 40 metavar='[all,debug,release]', |
40 default='debug') | 41 default='debug') |
41 result.add_option("-v", "--verbose", | 42 result.add_option("-v", "--verbose", |
42 help='Verbose output.', | 43 help='Verbose output.', |
43 default=False, action="store_true") | 44 default=False, action="store_true") |
44 result.add_option("-a", "--arch", | 45 result.add_option("-a", "--arch", |
45 help='Target architectures (comma-separated).', | 46 help='Target architectures (comma-separated).', |
46 metavar='[all,ia32,x64,simarm,arm,simmips,mips]', | 47 metavar='[all,ia32,x64,simarm,arm,simmips,mips]', |
47 default=utils.GuessArchitecture()) | 48 default=utils.GuessArchitecture()) |
48 result.add_option("--os", | 49 result.add_option("--os", |
49 help='Target OSs (comma-separated).', | 50 help='Target OSs (comma-separated).', |
50 metavar='[all,host,android]', | 51 metavar='[all,host,android]', |
51 default='host') | 52 default='host') |
| 53 result.add_option("-t", "--toolchain", |
| 54 help='Cross-compiler toolchain path', |
| 55 default=None) |
52 result.add_option("-j", | 56 result.add_option("-j", |
53 help='The number of parallel jobs to run.', | 57 help='The number of parallel jobs to run.', |
54 metavar=HOST_CPUS, | 58 metavar=HOST_CPUS, |
55 default=str(HOST_CPUS)) | 59 default=str(HOST_CPUS)) |
56 (vs_directory, vs_executable) = utils.GuessVisualStudioPath() | 60 (vs_directory, vs_executable) = utils.GuessVisualStudioPath() |
57 result.add_option("--devenv", | 61 result.add_option("--devenv", |
58 help='Path containing devenv.com on Windows', | 62 help='Path containing devenv.com on Windows', |
59 default=vs_directory) | 63 default=vs_directory) |
60 result.add_option("--executable", | 64 result.add_option("--executable", |
61 help='Name of the devenv.com/msbuild executable on Windows (varies for ' | 65 help='Name of the devenv.com/msbuild executable on Windows (varies for ' |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 print "Unknown os %s" % os | 98 print "Unknown os %s" % os |
95 return False | 99 return False |
96 if os != HOST_OS: | 100 if os != HOST_OS: |
97 if os != 'android': | 101 if os != 'android': |
98 print "Unsupported target os %s" % os | 102 print "Unsupported target os %s" % os |
99 return False | 103 return False |
100 if not HOST_OS in ['linux']: | 104 if not HOST_OS in ['linux']: |
101 print ("Cross-compilation to %s is not supported on host os %s." | 105 print ("Cross-compilation to %s is not supported on host os %s." |
102 % (os, HOST_OS)) | 106 % (os, HOST_OS)) |
103 return False | 107 return False |
104 if not arch in ['ia32']: | 108 if not arch in ['ia32', 'arm']: |
105 print ("Cross-compilation to %s is not supported for architecture %s." | 109 print ("Cross-compilation to %s is not supported for architecture %s." |
106 % (os, arch)) | 110 % (os, arch)) |
107 return False | 111 return False |
108 # We have not yet tweaked the v8 dart build to work with the Android | 112 # We have not yet tweaked the v8 dart build to work with the Android |
109 # NDK/SDK, so don't try to build it. | 113 # NDK/SDK, so don't try to build it. |
110 if args == []: | 114 if args == []: |
111 print "For android builds you must specify a target, such as 'samples'." | 115 print "For android builds you must specify a target, such as 'runtime'." |
112 return False | 116 return False |
113 if 'v8' in args: | 117 if 'v8' in args: |
114 print "The v8 target is not supported for android builds." | 118 print "The v8 target is not supported for android builds." |
115 return False | 119 return False |
116 return True | 120 return True |
117 | 121 |
118 | 122 |
119 def SetTools(arch, toolchainprefix): | 123 def SetTools(arch, target_os, toolchainprefix): |
120 toolsOverride = None | 124 toolsOverride = None |
| 125 |
| 126 # For Android, by default use the toolchain from third_party/android_tools. |
| 127 if target_os == 'android' and toolchainprefix == None: |
| 128 android_toolchain = GetAndroidToolchainDir(HOST_OS, arch) |
| 129 if arch == 'arm': |
| 130 toolchainprefix = os.path.join( |
| 131 android_toolchain, 'arm-linux-androideabi') |
| 132 if arch == 'ia32': |
| 133 toolchainprefix = os.path.join( |
| 134 android_toolchain, 'i686-linux-android') |
| 135 |
| 136 # For ARM Linux, by default use the Linux distribution's cross-compiler. |
121 if arch == 'arm' and toolchainprefix == None: | 137 if arch == 'arm' and toolchainprefix == None: |
122 # Here, we specify the hf compiler. If this changes, we must also remove | 138 # We specify the hf compiler. If this changes, we must also remove |
123 # the ARM_FLOAT_ABI_HARD define in configurations_make.gypi. | 139 # the ARM_FLOAT_ABI_HARD define in configurations_make.gypi. |
124 toolchainprefix = (DEFAULT_ARM_CROSS_COMPILER_PATH + | 140 toolchainprefix = (DEFAULT_ARM_CROSS_COMPILER_PATH + |
125 "/bin/arm-linux-gnueabihf") | 141 "/arm-linux-gnueabihf") |
| 142 |
| 143 # TODO(zra): Find a default MIPS Linux cross-compiler? |
| 144 |
| 145 # Override the Android toolchain's linker to handle some complexity in the |
| 146 # linker arguments that gyp has trouble with. |
| 147 linker = "" |
| 148 if target_os == 'android': |
| 149 linker = os.path.join(DART_ROOT, 'tools', 'android_link.py') |
| 150 elif toolchainprefix: |
| 151 linker = toolchainprefix + "-g++" |
| 152 |
126 if toolchainprefix: | 153 if toolchainprefix: |
127 toolsOverride = { | 154 toolsOverride = { |
128 "CC.target" : toolchainprefix + "-gcc", | 155 "CC.target" : toolchainprefix + "-gcc", |
129 "CXX.target" : toolchainprefix + "-g++", | 156 "CXX.target" : toolchainprefix + "-g++", |
130 "AR.target" : toolchainprefix + "-ar", | 157 "AR.target" : toolchainprefix + "-ar", |
131 "LINK.target": toolchainprefix + "-g++", | 158 "LINK.target": linker, |
132 "NM.target" : toolchainprefix + "-nm", | 159 "NM.target" : toolchainprefix + "-nm", |
133 } | 160 } |
134 return toolsOverride | 161 return toolsOverride |
135 | 162 |
136 | 163 |
137 def CheckDirExists(path, docstring): | 164 def CheckDirExists(path, docstring): |
138 if not os.path.isdir(path): | 165 if not os.path.isdir(path): |
139 raise Exception('Could not find %s directory %s' | 166 raise Exception('Could not find %s directory %s' |
140 % (docstring, path)) | 167 % (docstring, path)) |
141 | 168 |
142 | 169 |
143 def SetCrossCompilationEnvironment(host_os, target_os, target_arch, old_path): | 170 def GetAndroidToolchainDir(host_os, target_arch): |
144 global THIRD_PARTY_ROOT | 171 global THIRD_PARTY_ROOT |
145 if host_os not in ['linux']: | 172 if host_os not in ['linux']: |
146 raise Exception('Unsupported host os %s' % host_os) | 173 raise Exception('Unsupported host os %s' % host_os) |
147 if target_os not in ['android']: | 174 if target_arch not in ['ia32', 'arm']: |
148 raise Exception('Unsupported target os %s' % target_os) | |
149 if target_arch not in ['ia32']: | |
150 raise Exception('Unsupported target architecture %s' % target_arch) | 175 raise Exception('Unsupported target architecture %s' % target_arch) |
151 | 176 |
| 177 # Set up path to the Android NDK. |
152 CheckDirExists(THIRD_PARTY_ROOT, 'third party tools'); | 178 CheckDirExists(THIRD_PARTY_ROOT, 'third party tools'); |
153 android_tools = os.path.join(THIRD_PARTY_ROOT, 'android_tools') | 179 android_tools = os.path.join(THIRD_PARTY_ROOT, 'android_tools') |
154 CheckDirExists(android_tools, 'Android tools') | 180 CheckDirExists(android_tools, 'Android tools') |
155 android_ndk_root = os.path.join(android_tools, 'ndk') | 181 android_ndk_root = os.path.join(android_tools, 'ndk') |
156 CheckDirExists(android_ndk_root, 'Android NDK') | 182 CheckDirExists(android_ndk_root, 'Android NDK') |
157 android_sdk_root = os.path.join(android_tools, 'sdk') | |
158 CheckDirExists(android_sdk_root, 'Android SDK') | |
159 | 183 |
160 os.environ['ANDROID_NDK_ROOT'] = android_ndk_root | 184 # Set up the directory of the Android NDK cross-compiler toolchain. |
161 os.environ['ANDROID_SDK_ROOT'] = android_sdk_root | 185 toolchain_arch = 'arm-linux-androideabi-4.6' |
162 | 186 if target_arch == 'ia32': |
163 toolchain_arch = 'x86-4.4.3' | 187 toolchain_arch = 'x86-4.6' |
164 toolchain_dir = 'linux-x86' | 188 toolchain_dir = 'linux-x86' |
165 android_toolchain = os.path.join(android_ndk_root, | 189 android_toolchain = os.path.join(android_ndk_root, |
166 'toolchains', toolchain_arch, | 190 'toolchains', toolchain_arch, |
167 'prebuilt', toolchain_dir, 'bin') | 191 'prebuilt', toolchain_dir, 'bin') |
168 CheckDirExists(android_toolchain, 'Android toolchain') | 192 CheckDirExists(android_toolchain, 'Android toolchain') |
169 | 193 |
170 os.environ['ANDROID_TOOLCHAIN'] = android_toolchain | 194 return android_toolchain |
171 | |
172 android_sdk_version = 15 | |
173 | |
174 android_sdk_tools = os.path.join(android_sdk_root, 'tools') | |
175 CheckDirExists(android_sdk_tools, 'Android SDK tools') | |
176 | |
177 android_sdk_platform_tools = os.path.join(android_sdk_root, 'platform-tools') | |
178 CheckDirExists(android_sdk_platform_tools, 'Android SDK platform tools') | |
179 | |
180 pathList = [old_path, | |
181 android_ndk_root, | |
182 android_sdk_tools, | |
183 android_sdk_platform_tools, | |
184 # for Ninja - maybe don't need? | |
185 android_toolchain | |
186 ] | |
187 os.environ['PATH'] = ':'.join(pathList) | |
188 | |
189 gypDefinesList = [ | |
190 'target_arch=ia32', | |
191 'OS=%s' % target_os, | |
192 'android_build_type=0', | |
193 'host_os=%s' % host_os, | |
194 'linux_fpic=1', | |
195 'release_optimize=s', | |
196 'linux_use_tcmalloc=0', | |
197 'android_sdk=%s', os.path.join(android_sdk_root, 'platforms', | |
198 'android-%d' % android_sdk_version), | |
199 'android_sdk_tools=%s' % android_sdk_platform_tools | |
200 ] | |
201 | |
202 os.environ['GYP_DEFINES'] = ' '.join(gypDefinesList) | |
203 | 195 |
204 | 196 |
205 def Execute(args): | 197 def Execute(args): |
206 process = subprocess.Popen(args) | 198 process = subprocess.Popen(args) |
207 process.wait() | 199 process.wait() |
208 if process.returncode != 0: | 200 if process.returncode != 0: |
209 raise Exception(args[0] + " failed") | 201 raise Exception(args[0] + " failed") |
210 | |
211 | |
212 def GClientRunHooks(): | |
213 Execute(['gclient', 'runhooks']) | |
214 | |
215 | |
216 def RunhooksIfNeeded(host_os, mode, arch, target_os): | |
217 if host_os != 'linux': | |
218 return | |
219 build_root = utils.GetBuildRoot(host_os) | |
220 build_cookie_path = os.path.join(build_root, 'lastHooksTargetOS.txt') | |
221 | |
222 old_target_os = None | |
223 try: | |
224 with open(build_cookie_path) as f: | |
225 old_target_os = f.read(1024) | |
226 except IOError as e: | |
227 pass | |
228 if target_os != old_target_os: | |
229 try: | |
230 os.mkdir(build_root) | |
231 except OSError as e: | |
232 pass | |
233 with open(build_cookie_path, 'w') as f: | |
234 f.write(target_os) | |
235 GClientRunHooks() | |
236 | 202 |
237 | 203 |
238 def CurrentDirectoryBaseName(): | 204 def CurrentDirectoryBaseName(): |
239 """Returns the name of the current directory""" | 205 """Returns the name of the current directory""" |
240 return os.path.relpath(os.curdir, start=os.pardir) | 206 return os.path.relpath(os.curdir, start=os.pardir) |
241 | 207 |
242 | 208 |
243 def FilterEmptyXcodebuildSections(process): | 209 def FilterEmptyXcodebuildSections(process): |
244 """ | 210 """ |
245 Filter output from xcodebuild so empty sections are less verbose. | 211 Filter output from xcodebuild so empty sections are less verbose. |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 # Determine which targets to build. By default we build the "all" target. | 312 # Determine which targets to build. By default we build the "all" target. |
347 if len(args) == 0: | 313 if len(args) == 0: |
348 if HOST_OS == 'macos': | 314 if HOST_OS == 'macos': |
349 targets = ['All'] | 315 targets = ['All'] |
350 else: | 316 else: |
351 targets = ['all'] | 317 targets = ['all'] |
352 else: | 318 else: |
353 targets = args | 319 targets = args |
354 | 320 |
355 filter_xcodebuild_output = False | 321 filter_xcodebuild_output = False |
356 # Remember path | |
357 old_path = os.environ['PATH'] | |
358 # Build all targets for each requested configuration. | 322 # Build all targets for each requested configuration. |
359 for target in targets: | 323 for target in targets: |
360 for target_os in options.os: | 324 for target_os in options.os: |
361 for mode in options.mode: | 325 for mode in options.mode: |
362 for arch in options.arch: | 326 for arch in options.arch: |
363 os.environ['DART_BUILD_MODE'] = mode | 327 os.environ['DART_BUILD_MODE'] = mode |
364 build_config = utils.GetBuildConf(mode, arch) | 328 build_config = utils.GetBuildConf(mode, arch, target_os) |
365 if HOST_OS == 'macos': | 329 if HOST_OS == 'macos': |
366 filter_xcodebuild_output = True | 330 filter_xcodebuild_output = True |
367 project_file = 'dart.xcodeproj' | 331 project_file = 'dart.xcodeproj' |
368 if os.path.exists('dart-%s.gyp' % CurrentDirectoryBaseName()): | 332 if os.path.exists('dart-%s.gyp' % CurrentDirectoryBaseName()): |
369 project_file = 'dart-%s.xcodeproj' % CurrentDirectoryBaseName() | 333 project_file = 'dart-%s.xcodeproj' % CurrentDirectoryBaseName() |
370 args = ['xcodebuild', | 334 args = ['xcodebuild', |
371 '-project', | 335 '-project', |
372 project_file, | 336 project_file, |
373 '-target', | 337 '-target', |
374 target, | 338 target, |
(...skipping 30 matching lines...) Expand all Loading... |
405 options.j, | 369 options.j, |
406 'BUILDTYPE=' + build_config, | 370 'BUILDTYPE=' + build_config, |
407 ] | 371 ] |
408 if target_os != HOST_OS: | 372 if target_os != HOST_OS: |
409 args += ['builddir_name=' + utils.GetBuildDir(HOST_OS, target_os)] | 373 args += ['builddir_name=' + utils.GetBuildDir(HOST_OS, target_os)] |
410 if options.verbose: | 374 if options.verbose: |
411 args += ['V=1'] | 375 args += ['V=1'] |
412 | 376 |
413 args += [target] | 377 args += [target] |
414 | 378 |
415 if target_os != HOST_OS: | 379 toolchainprefix = options.toolchain |
416 SetCrossCompilationEnvironment( | 380 toolsOverride = SetTools(arch, target_os, toolchainprefix) |
417 HOST_OS, target_os, arch, old_path) | |
418 | |
419 RunhooksIfNeeded(HOST_OS, mode, arch, target_os) | |
420 | |
421 toolchainprefix = None | |
422 if target_os == 'android': | |
423 toolchainprefix = ('%s/i686-linux-android' | |
424 % os.environ['ANDROID_TOOLCHAIN']) | |
425 toolsOverride = SetTools(arch, toolchainprefix) | |
426 if toolsOverride: | 381 if toolsOverride: |
427 printToolOverrides = target_os != 'android' | |
428 for k, v in toolsOverride.iteritems(): | 382 for k, v in toolsOverride.iteritems(): |
429 args.append( k + "=" + v) | 383 args.append( k + "=" + v) |
430 if printToolOverrides: | 384 if options.verbose: |
431 print k + " = " + v | 385 print k + " = " + v |
432 if not os.path.isfile(toolsOverride['CC.target']): | 386 if not os.path.isfile(toolsOverride['CC.target']): |
433 if arch == 'arm': | 387 if arch == 'arm': |
434 print arm_cc_error | 388 print arm_cc_error |
435 else: | 389 else: |
436 print "Couldn't find compiler: %s" % toolsOverride['CC.target'] | 390 print "Couldn't find compiler: %s" % toolsOverride['CC.target'] |
437 return 1 | 391 return 1 |
438 | 392 |
439 | 393 |
440 print ' '.join(args) | 394 print ' '.join(args) |
(...skipping 10 matching lines...) Expand all Loading... |
451 process.wait() | 405 process.wait() |
452 if process.returncode != 0: | 406 if process.returncode != 0: |
453 print "BUILD FAILED" | 407 print "BUILD FAILED" |
454 return 1 | 408 return 1 |
455 | 409 |
456 return 0 | 410 return 0 |
457 | 411 |
458 | 412 |
459 if __name__ == '__main__': | 413 if __name__ == '__main__': |
460 sys.exit(Main()) | 414 sys.exit(Main()) |
OLD | NEW |