OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2012 The Native Client Authors. All rights reserved. | 2 # Copyright (c) 2012 The Native Client Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 import os | 6 import os |
7 import platform | 7 import platform |
8 import subprocess | 8 import subprocess |
9 import sys | 9 import sys |
10 | 10 |
(...skipping 24 matching lines...) Expand all Loading... |
35 --irt=none Don't use IRT | 35 --irt=none Don't use IRT |
36 --irt=<path> Path to IRT nexe | 36 --irt=<path> Path to IRT nexe |
37 Default: Uses whichever IRT already exists. Otherwise, builds irt_core. | 37 Default: Uses whichever IRT already exists. Otherwise, builds irt_core. |
38 | 38 |
39 -n | --dry-run Just print commands, don't execute them | 39 -n | --dry-run Just print commands, don't execute them |
40 -h | --help Display this information | 40 -h | --help Display this information |
41 -q | --quiet Don't print anything (nexe output can be redirected | 41 -q | --quiet Don't print anything (nexe output can be redirected |
42 with NACL_EXE_STDOUT/STDERR env vars) | 42 with NACL_EXE_STDOUT/STDERR env vars) |
43 --more Display sel_ldr usage | 43 --more Display sel_ldr usage |
44 | 44 |
45 -arch <arch> | -m32 | -m64 | -marm | 45 -arch <arch> | -m32 | -m64 | -marm | -mmips32 |
46 Specify architecture for PNaCl translation | 46 Specify architecture for PNaCl translation |
47 (arch is one of: x86-32, x86-64 or arm) | 47 (arch is one of: x86-32, x86-64, arm or mips32) |
48 ''' | 48 ''' |
49 print info % name | 49 print info % name |
50 print '-' * 80 | 50 print '-' * 80 |
51 sys.exit(0) | 51 sys.exit(0) |
52 | 52 |
53 def SetupEnvironment(): | 53 def SetupEnvironment(): |
54 # linux, win, or mac | 54 # linux, win, or mac |
55 env.scons_os = GetSconsOS() | 55 env.scons_os = GetSconsOS() |
56 | 56 |
57 # native_client/ directory | 57 # native_client/ directory |
58 env.nacl_root = FindBaseDir() | 58 env.nacl_root = FindBaseDir() |
59 | 59 |
60 # Path to Native NaCl toolchain (glibc) | 60 # Path to Native NaCl toolchain (glibc) |
61 env.nnacl_root = os.path.join(env.nacl_root, | 61 env.nnacl_root = os.path.join(env.nacl_root, |
62 'toolchain', | 62 'toolchain', |
63 env.scons_os + '_x86') | 63 env.scons_os + '_x86') |
64 | 64 |
65 # Path to PNaCl toolchain | 65 # Path to PNaCl toolchain |
66 pnacl_label = 'pnacl_%s_%s' % (GetSconsOS(), GetBuildArch().replace('-','_')) | 66 pnacl_label = 'pnacl_%s_%s' % (GetSconsOS(), GetBuildArch().replace('-','_')) |
67 env.pnacl_base = os.path.join(env.nacl_root, 'toolchain', pnacl_label) | 67 env.pnacl_base = os.path.join(env.nacl_root, 'toolchain', pnacl_label) |
68 env.pnacl_root_newlib = os.path.join(env.pnacl_base, 'newlib') | 68 env.pnacl_root_newlib = os.path.join(env.pnacl_base, 'newlib') |
69 env.pnacl_root_glibc = os.path.join(env.pnacl_base, 'glibc') | 69 env.pnacl_root_glibc = os.path.join(env.pnacl_base, 'glibc') |
70 | 70 |
71 # QEMU | 71 # QEMU |
72 env.arm_root = os.path.join(env.nacl_root, | 72 env.arm_root = os.path.join(env.nacl_root, |
73 'toolchain', 'linux_arm-trusted') | 73 'toolchain', 'linux_arm-trusted') |
74 env.qemu = os.path.join(env.arm_root, 'run_under_qemu_arm') | 74 env.qemu_arm = os.path.join(env.arm_root, 'run_under_qemu_arm') |
| 75 |
| 76 env.mips32_root = os.path.join(env.nacl_root, |
| 77 'toolchain', 'linux_mips-trusted') |
| 78 env.qemu_mips32 = os.path.join(env.mips32_root, 'run_under_qemu_mips32') |
75 | 79 |
76 # Path to 'readelf' | 80 # Path to 'readelf' |
77 env.readelf = FindReadElf() | 81 env.readelf = FindReadElf() |
78 | 82 |
79 # Path to 'scons' | 83 # Path to 'scons' |
80 env.scons = os.path.join(env.nacl_root, 'scons') | 84 env.scons = os.path.join(env.nacl_root, 'scons') |
81 | 85 |
82 # Library path for runnable-ld.so | 86 # Library path for runnable-ld.so |
83 env.library_path = [] | 87 env.library_path = [] |
84 | 88 |
85 # Suppress -S -a | 89 # Suppress -S -a |
86 env.paranoid = False | 90 env.paranoid = False |
87 | 91 |
88 # Only print commands, don't run them | 92 # Only print commands, don't run them |
89 env.dry_run = False | 93 env.dry_run = False |
90 | 94 |
91 # Force a specific sel_ldr | 95 # Force a specific sel_ldr |
92 env.force_sel_ldr = None | 96 env.force_sel_ldr = None |
93 | 97 |
94 # Force a specific IRT | 98 # Force a specific IRT |
95 env.force_irt = None | 99 env.force_irt = None |
96 | 100 |
97 # Don't print anything | 101 # Don't print anything |
98 env.quiet = False | 102 env.quiet = False |
99 | 103 |
100 # Arch (x86-32, x86-64, arm) | 104 # Arch (x86-32, x86-64, arm, mips32) |
101 env.arch = None | 105 env.arch = None |
102 | 106 |
103 # Trace in QEMU | 107 # Trace in QEMU |
104 env.trace = False | 108 env.trace = False |
105 | 109 |
106 # Debug the nexe using the debug stub | 110 # Debug the nexe using the debug stub |
107 env.debug = False | 111 env.debug = False |
108 | 112 |
109 def PrintBanner(output): | 113 def PrintBanner(output): |
110 if not env.quiet: | 114 if not env.quiet: |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 sel_ldr_args += [os.path.abspath(nexe)] + nexe_params | 218 sel_ldr_args += [os.path.abspath(nexe)] + nexe_params |
215 | 219 |
216 # Run sel_ldr! | 220 # Run sel_ldr! |
217 RunSelLdr(sel_ldr_args) | 221 RunSelLdr(sel_ldr_args) |
218 return 0 | 222 return 0 |
219 | 223 |
220 | 224 |
221 def RunSelLdr(args): | 225 def RunSelLdr(args): |
222 prefix = [] | 226 prefix = [] |
223 if GetBuildArch().find('arm') == -1 and env.arch == 'arm': | 227 if GetBuildArch().find('arm') == -1 and env.arch == 'arm': |
224 prefix = [ env.qemu, '-cpu', 'cortex-a8'] | 228 prefix = [ env.qemu_arm, '-cpu', 'cortex-a8'] |
225 if env.trace: | 229 if env.trace: |
226 prefix += ['-d', 'in_asm,op,exec,cpu'] | 230 prefix += ['-d', 'in_asm,op,exec,cpu'] |
227 args = ['-Q'] + args | 231 args = ['-Q'] + args |
| 232 |
| 233 if GetBuildArch().find('mips32') == -1 and env.arch == 'mips32': |
| 234 prefix = [env.qemu_mips32] |
| 235 if env.trace: |
| 236 prefix += ['-d', 'in_asm,op,exec,cpu'] |
| 237 args = ['-Q'] + args |
228 | 238 |
229 # Use the bootstrap loader on linux. | 239 # Use the bootstrap loader on linux. |
230 if env.scons_os == 'linux': | 240 if env.scons_os == 'linux': |
231 bootstrap = os.path.join(os.path.dirname(env.sel_ldr), | 241 bootstrap = os.path.join(os.path.dirname(env.sel_ldr), |
232 'nacl_helper_bootstrap') | 242 'nacl_helper_bootstrap') |
233 loader = [bootstrap, env.sel_ldr] | 243 loader = [bootstrap, env.sel_ldr] |
234 template_digits = 'X' * 16 | 244 template_digits = 'X' * 16 |
235 args = ['--r_debug=0x' + template_digits, | 245 args = ['--r_debug=0x' + template_digits, |
236 '--reserved_at_zero=0x' + template_digits] + args | 246 '--reserved_at_zero=0x' + template_digits] + args |
237 else: | 247 else: |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 Fatal('Missing argument to -L') | 434 Fatal('Missing argument to -L') |
425 else: | 435 else: |
426 path = arg[len('-L'):] | 436 path = arg[len('-L'):] |
427 env.library_path.append(path) | 437 env.library_path.append(path) |
428 elif arg == '-m32': | 438 elif arg == '-m32': |
429 env.arch = 'x86-32' | 439 env.arch = 'x86-32' |
430 elif arg == '-m64': | 440 elif arg == '-m64': |
431 env.arch = 'x86-64' | 441 env.arch = 'x86-64' |
432 elif arg == '-marm': | 442 elif arg == '-marm': |
433 env.arch = 'arm' | 443 env.arch = 'arm' |
| 444 elif arg == '-mmips32': |
| 445 env.arch = 'mips32' |
434 elif arg == '-arch': | 446 elif arg == '-arch': |
435 if i+1 < len(argv): | 447 if i+1 < len(argv): |
436 env.arch = FixArch(argv[i+1]) | 448 env.arch = FixArch(argv[i+1]) |
437 skip_one = True | 449 skip_one = True |
438 elif arg == '--paranoid': | 450 elif arg == '--paranoid': |
439 env.paranoid = True | 451 env.paranoid = True |
440 elif arg.startswith('--loader='): | 452 elif arg.startswith('--loader='): |
441 env.force_sel_ldr = arg[len('--loader='):] | 453 env.force_sel_ldr = arg[len('--loader='):] |
442 elif arg.startswith('--irt='): | 454 elif arg.startswith('--irt='): |
443 env.force_irt = arg[len('--irt='):] | 455 env.force_irt = arg[len('--irt='):] |
(...skipping 20 matching lines...) Expand all Loading... |
464 | 476 |
465 nexe_params = argv[i+1:] | 477 nexe_params = argv[i+1:] |
466 | 478 |
467 return sel_ldr_options, nexe, nexe_params | 479 return sel_ldr_options, nexe, nexe_params |
468 | 480 |
469 | 481 |
470 def FixArch(arch): | 482 def FixArch(arch): |
471 x86_32 = 'x86-32 x86_32 x8632 i386 i686 ia32'.split() | 483 x86_32 = 'x86-32 x86_32 x8632 i386 i686 ia32'.split() |
472 x86_64 = 'amd64 x86_64 x86-64 x8664'.split() | 484 x86_64 = 'amd64 x86_64 x86-64 x8664'.split() |
473 arm = 'arm armv7'.split() | 485 arm = 'arm armv7'.split() |
| 486 mips32 = 'mips mips32'.split() |
474 | 487 |
475 if arch in x86_32: | 488 if arch in x86_32: |
476 return 'x86-32' | 489 return 'x86-32' |
477 | 490 |
478 if arch in x86_64: | 491 if arch in x86_64: |
479 return 'x86-64' | 492 return 'x86-64' |
480 | 493 |
481 if arch in arm: | 494 if arch in arm: |
482 return 'arm' | 495 return 'arm' |
483 | 496 |
| 497 if arch in mips32: |
| 498 return 'mips32' |
| 499 |
484 Fatal('Unrecognized arch "%s"!', arch) | 500 Fatal('Unrecognized arch "%s"!', arch) |
485 | 501 |
486 | 502 |
487 def Fatal(msg, *args): | 503 def Fatal(msg, *args): |
488 if len(args) > 0: | 504 if len(args) > 0: |
489 msg = msg % args | 505 msg = msg % args |
490 print msg | 506 print msg |
491 sys.exit(1) | 507 sys.exit(1) |
492 | 508 |
493 def Usage2(): | 509 def Usage2(): |
494 # Try to find any sel_ldr that already exists | 510 # Try to find any sel_ldr that already exists |
495 for arch in ['x86-32','x86-64','arm']: | 511 for arch in ['x86-32','x86-64','arm','mips32']: |
496 SetupArch(arch, allow_build = False) | 512 SetupArch(arch, allow_build = False) |
497 if env.sel_ldr: | 513 if env.sel_ldr: |
498 break | 514 break |
499 | 515 |
500 if not env.sel_ldr: | 516 if not env.sel_ldr: |
501 # If nothing exists, build it. | 517 # If nothing exists, build it. |
502 SetupArch('x86-32') | 518 SetupArch('x86-32') |
503 | 519 |
504 RunSelLdr(['-h']) | 520 RunSelLdr(['-h']) |
505 | 521 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
547 | 563 |
548 if not machine_line: | 564 if not machine_line: |
549 Fatal('Script error: readelf output did not make sense!') | 565 Fatal('Script error: readelf output did not make sense!') |
550 | 566 |
551 if 'Intel 80386' in machine_line: | 567 if 'Intel 80386' in machine_line: |
552 arch = 'x86-32' | 568 arch = 'x86-32' |
553 elif 'X86-64' in machine_line: | 569 elif 'X86-64' in machine_line: |
554 arch = 'x86-64' | 570 arch = 'x86-64' |
555 elif 'ARM' in machine_line: | 571 elif 'ARM' in machine_line: |
556 arch = 'arm' | 572 arch = 'arm' |
| 573 elif 'MIPS' in machine_line: |
| 574 arch = 'mips32' |
557 else: | 575 else: |
558 Fatal('%s: Unknown machine type', f) | 576 Fatal('%s: Unknown machine type', f) |
559 | 577 |
560 return (arch, is_dynamic, is_glibc_static) | 578 return (arch, is_dynamic, is_glibc_static) |
561 | 579 |
562 | 580 |
563 def GetSconsOS(): | 581 def GetSconsOS(): |
564 name = platform.system().lower() | 582 name = platform.system().lower() |
565 if name == 'linux': | 583 if name == 'linux': |
566 return 'linux' | 584 return 'linux' |
(...skipping 19 matching lines...) Expand all Loading... |
586 # We've hit the file system root | 604 # We've hit the file system root |
587 break | 605 break |
588 | 606 |
589 if os.path.basename(curdir) != 'native_client': | 607 if os.path.basename(curdir) != 'native_client': |
590 Fatal('Unable to find native_client directory!') | 608 Fatal('Unable to find native_client directory!') |
591 return curdir | 609 return curdir |
592 | 610 |
593 | 611 |
594 if __name__ == '__main__': | 612 if __name__ == '__main__': |
595 sys.exit(main(sys.argv)) | 613 sys.exit(main(sys.argv)) |
OLD | NEW |