Chromium Code Reviews| 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 shutil | 10 import shutil |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 217 with open(build_cookie_path, 'w') as f: | 217 with open(build_cookie_path, 'w') as f: |
| 218 f.write(target_os) | 218 f.write(target_os) |
| 219 GClientRunHooks() | 219 GClientRunHooks() |
| 220 | 220 |
| 221 | 221 |
| 222 def CurrentDirectoryBaseName(): | 222 def CurrentDirectoryBaseName(): |
| 223 """Returns the name of the current directory""" | 223 """Returns the name of the current directory""" |
| 224 return os.path.relpath(os.curdir, start=os.pardir) | 224 return os.path.relpath(os.curdir, start=os.pardir) |
| 225 | 225 |
| 226 | 226 |
| 227 def ParseXcodebuild(args): | 227 def FilterEmptyXcodebuildSections(process): |
| 228 """ | 228 """ |
| 229 Run xcodebuild and returns the process object. | 229 Filter output from xcodebuild so empty sections are less verbose. |
| 230 Output is parsed to filter out build actions that had no output. | 230 |
| 231 The output from xcodebuild looks like this: | |
| 232 | |
| 233 Build settings from command line: | |
| 234 SYMROOT = .../xcodebuild | |
| 235 | |
| 236 === BUILD AGGREGATE TARGET samples OF PROJECT dart WITH CONFIGURATION ReleaseIA3 2 === | |
|
kustermann
2013/04/05 15:31:01
You could abbreviate these lines with '...' so we
ahe
2013/04/05 15:45:44
Done.
| |
| 237 Check dependencies | |
| 238 | |
| 239 | |
| 240 === BUILD AGGREGATE TARGET upload_sdk OF PROJECT dart WITH CONFIGURATION Release IA32 === | |
| 241 Check dependencies | |
| 242 | |
| 243 PhaseScriptExecution "Action \"upload_sdk_py\"" xcodebuild/dart.build/ReleaseIA3 2/upload_sdk.build/Script-822253BD7234630D393BA4AC.sh | |
| 244 cd ... | |
| 245 /bin/sh -c .../xcodebuild/dart.build/ReleaseIA32/upload_sdk.build/Script-822 253BD7234630D393BA4AC.sh | |
| 246 | |
| 247 | |
| 248 ** BUILD SUCCEEDED ** | |
| 249 | |
| 231 """ | 250 """ |
| 232 | 251 |
| 233 def is_empty_chunk(chunk): | 252 def is_empty_chunk(chunk): |
| 234 empty_chunk = ['Check dependencies', '', ''] | 253 empty_chunk = ['Check dependencies', '', ''] |
| 235 return not chunk or (len(chunk) == 4 and chunk[1:] == empty_chunk) | 254 return not chunk or (len(chunk) == 4 and chunk[1:] == empty_chunk) |
| 236 | 255 |
| 237 process = subprocess.Popen(args, | 256 def unbuffered(callable): |
| 238 bufsize=0, | 257 # Use iter to disable buffering in for-in. |
| 239 stdin=None, | 258 return iter(callable, b'') |
|
kustermann
2013/04/05 15:31:01
The 'b' should not be necessary here.
ahe
2013/04/05 15:45:44
Done.
| |
| 240 stdout=subprocess.PIPE, | 259 |
| 241 stderr=subprocess.STDOUT) | |
| 242 section = None | 260 section = None |
| 243 chunk = [] | 261 chunk = [] |
| 244 for line in process.stdout: | 262 # Is stdout a terminal? |
| 263 isatty = sys.stdout.isatty() | |
| 264 for line in unbuffered(process.stdout.readline): | |
| 245 line = line.rstrip() | 265 line = line.rstrip() |
| 246 if line.startswith('=== BUILD ') or line.startswith('** BUILD '): | 266 if line.startswith('=== BUILD ') or line.startswith('** BUILD '): |
| 247 if not is_empty_chunk(chunk): | 267 if not is_empty_chunk(chunk): |
| 248 print '\n'.join(chunk) | 268 print '\n'.join(chunk) |
| 249 section = line | 269 section = line |
| 270 if isatty: | |
| 271 # If stdout is a terminal, emit "progress" information. | |
| 272 print '%s[2K%s\r' % (chr(27), section), | |
| 250 chunk = [] | 273 chunk = [] |
| 251 if not section: | 274 if not section: |
| 252 print line | 275 print line |
| 253 else: | 276 else: |
| 254 chunk.append(line) | 277 chunk.append(line) |
| 255 if not is_empty_chunk(chunk): | 278 if not is_empty_chunk(chunk): |
| 256 print '\n'.join(chunk) | 279 print '\n'.join(chunk) |
| 257 return process | |
| 258 | 280 |
| 259 | 281 |
| 260 def Main(): | 282 def Main(): |
| 261 utils.ConfigureJava() | 283 utils.ConfigureJava() |
| 262 # Parse the options. | 284 # Parse the options. |
| 263 parser = BuildOptions() | 285 parser = BuildOptions() |
| 264 (options, args) = parser.parse_args() | 286 (options, args) = parser.parse_args() |
| 265 if not ProcessOptions(options, args): | 287 if not ProcessOptions(options, args): |
| 266 parser.print_help() | 288 parser.print_help() |
| 267 return 1 | 289 return 1 |
| 268 # Determine which targets to build. By default we build the "all" target. | 290 # Determine which targets to build. By default we build the "all" target. |
| 269 if len(args) == 0: | 291 if len(args) == 0: |
| 270 if HOST_OS == 'macos': | 292 if HOST_OS == 'macos': |
| 271 target = 'All' | 293 target = 'All' |
| 272 else: | 294 else: |
| 273 target = 'all' | 295 target = 'all' |
| 274 else: | 296 else: |
| 275 target = args[0] | 297 target = args[0] |
| 276 | 298 |
| 277 parse_xcodebuild = False | 299 filter_xcodebuild_output = False |
| 278 # Remember path | 300 # Remember path |
| 279 old_path = os.environ['PATH'] | 301 old_path = os.environ['PATH'] |
| 280 # Build the targets for each requested configuration. | 302 # Build the targets for each requested configuration. |
| 281 for target_os in options.os: | 303 for target_os in options.os: |
| 282 for mode in options.mode: | 304 for mode in options.mode: |
| 283 for arch in options.arch: | 305 for arch in options.arch: |
| 284 build_config = utils.GetBuildConf(mode, arch) | 306 build_config = utils.GetBuildConf(mode, arch) |
| 285 if HOST_OS == 'macos': | 307 if HOST_OS == 'macos': |
| 286 parse_xcodebuild = True | 308 filter_xcodebuild_output = True |
| 287 project_file = 'dart.xcodeproj' | 309 project_file = 'dart.xcodeproj' |
| 288 if os.path.exists('dart-%s.gyp' % CurrentDirectoryBaseName()): | 310 if os.path.exists('dart-%s.gyp' % CurrentDirectoryBaseName()): |
| 289 project_file = 'dart-%s.xcodeproj' % CurrentDirectoryBaseName() | 311 project_file = 'dart-%s.xcodeproj' % CurrentDirectoryBaseName() |
| 290 args = ['xcodebuild', | 312 args = ['xcodebuild', |
| 291 '-project', | 313 '-project', |
| 292 project_file, | 314 project_file, |
| 293 '-target', | 315 '-target', |
| 294 target, | 316 target, |
| 295 '-configuration', | 317 '-configuration', |
| 296 build_config, | 318 build_config, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 345 toolsOverride = SetTools(arch, toolchainprefix) | 367 toolsOverride = SetTools(arch, toolchainprefix) |
| 346 if toolsOverride: | 368 if toolsOverride: |
| 347 printToolOverrides = target_os != 'android' | 369 printToolOverrides = target_os != 'android' |
| 348 for k, v in toolsOverride.iteritems(): | 370 for k, v in toolsOverride.iteritems(): |
| 349 args.append( k + "=" + v) | 371 args.append( k + "=" + v) |
| 350 if printToolOverrides: | 372 if printToolOverrides: |
| 351 print k + " = " + v | 373 print k + " = " + v |
| 352 | 374 |
| 353 print ' '.join(args) | 375 print ' '.join(args) |
| 354 process = None | 376 process = None |
| 355 if parse_xcodebuild: | 377 if filter_xcodebuild_output: |
| 356 process = ParseXcodebuild(args) | 378 process = subprocess.Popen(args, |
| 379 stdin=None, | |
| 380 bufsize=1, # Line buffered. | |
| 381 stdout=subprocess.PIPE, | |
| 382 stderr=subprocess.STDOUT) | |
| 383 FilterEmptyXcodebuildSections(process) | |
| 357 else: | 384 else: |
| 358 process = subprocess.Popen(args, stdin=None) | 385 process = subprocess.Popen(args, stdin=None) |
| 359 process.wait() | 386 process.wait() |
| 360 if process.returncode != 0: | 387 if process.returncode != 0: |
| 361 print "BUILD FAILED" | 388 print "BUILD FAILED" |
| 362 return 1 | 389 return 1 |
| 363 | 390 |
| 364 return 0 | 391 return 0 |
| 365 | 392 |
| 366 | 393 |
| 367 if __name__ == '__main__': | 394 if __name__ == '__main__': |
| 368 sys.exit(Main()) | 395 sys.exit(Main()) |
| OLD | NEW |