| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/env python | |
| 2 # | |
| 3 # Copyright 2013 the V8 project authors. All rights reserved. | |
| 4 # Redistribution and use in source and binary forms, with or without | |
| 5 # modification, are permitted provided that the following conditions are | |
| 6 # met: | |
| 7 # | |
| 8 # * Redistributions of source code must retain the above copyright | |
| 9 # notice, this list of conditions and the following disclaimer. | |
| 10 # * Redistributions in binary form must reproduce the above | |
| 11 # copyright notice, this list of conditions and the following | |
| 12 # disclaimer in the documentation and/or other materials provided | |
| 13 # with the distribution. | |
| 14 # * Neither the name of Google Inc. nor the names of its | |
| 15 # contributors may be used to endorse or promote products derived | |
| 16 # from this software without specific prior written permission. | |
| 17 # | |
| 18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| 19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| 20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| 21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| 22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| 23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| 24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| 25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| 26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 29 | |
| 30 # This script executes the passed command line using the Native Client | |
| 31 # 'sel_ldr' container. It is derived from android-run.py. | |
| 32 | |
| 33 import os | |
| 34 from os.path import join, dirname, abspath | |
| 35 import re | |
| 36 import subprocess | |
| 37 import sys | |
| 38 import tempfile | |
| 39 | |
| 40 def Check(output, errors): | |
| 41 failed = any([s.startswith('/system/bin/sh:') or s.startswith('ANDROID') | |
| 42 for s in output.split('\n')]) | |
| 43 return 1 if failed else 0 | |
| 44 | |
| 45 def Execute(cmdline): | |
| 46 (fd_out, outname) = tempfile.mkstemp() | |
| 47 (fd_err, errname) = tempfile.mkstemp() | |
| 48 process = subprocess.Popen( | |
| 49 args=cmdline, | |
| 50 shell=True, | |
| 51 stdout=fd_out, | |
| 52 stderr=fd_err, | |
| 53 ) | |
| 54 exit_code = process.wait() | |
| 55 os.close(fd_out) | |
| 56 os.close(fd_err) | |
| 57 output = file(outname).read() | |
| 58 errors = file(errname).read() | |
| 59 os.unlink(outname) | |
| 60 os.unlink(errname) | |
| 61 sys.stdout.write(output) | |
| 62 sys.stderr.write(errors) | |
| 63 return exit_code or Check(output, errors) | |
| 64 | |
| 65 def Escape(arg): | |
| 66 def ShouldEscape(): | |
| 67 for x in arg: | |
| 68 if not x.isalnum() and x != '-' and x != '_': | |
| 69 return True | |
| 70 return False | |
| 71 | |
| 72 return arg if not ShouldEscape() else '"%s"' % (arg.replace('"', '\\"')) | |
| 73 | |
| 74 def WriteToTemporaryFile(data): | |
| 75 (fd, fname) = tempfile.mkstemp() | |
| 76 os.close(fd) | |
| 77 tmp_file = open(fname, "w") | |
| 78 tmp_file.write(data) | |
| 79 tmp_file.close() | |
| 80 return fname | |
| 81 | |
| 82 def GetNaClArchFromNexe(nexe): | |
| 83 try: | |
| 84 p = subprocess.Popen(['file', nexe], stdout=subprocess.PIPE) | |
| 85 out, err = p.communicate() | |
| 86 lines = [re.sub("\s+", " " , line) for line in out.split('\n')] | |
| 87 if lines[0].find(": ELF 32-bit LSB executable, Intel 80386") > 0: | |
| 88 return "x86_32" | |
| 89 if lines[0].find(": ELF 64-bit LSB executable, x86-64") > 0: | |
| 90 return "x86_64" | |
| 91 except: | |
| 92 print 'file ' + sys.argv[1] + ' failed' | |
| 93 return None | |
| 94 | |
| 95 def GetNaClResources(nexe): | |
| 96 nacl_sdk_dir = os.environ["NACL_SDK_ROOT"] | |
| 97 nacl_arch = GetNaClArchFromNexe(nexe) | |
| 98 if sys.platform.startswith("linux"): | |
| 99 platform = "linux" | |
| 100 elif sys.platform == "darwin": | |
| 101 platform = "mac" | |
| 102 else: | |
| 103 print("NaCl V8 testing is supported on Linux and MacOS only.") | |
| 104 sys.exit(1) | |
| 105 | |
| 106 if nacl_arch is "x86_64": | |
| 107 toolchain = platform + "_x86_glibc" | |
| 108 sel_ldr = "sel_ldr_x86_64" | |
| 109 irt = "irt_core_x86_64.nexe" | |
| 110 libdir = "lib64" | |
| 111 elif nacl_arch is "x86_32": | |
| 112 toolchain = platform + "_x86_glibc" | |
| 113 sel_ldr = "sel_ldr_x86_32" | |
| 114 irt = "irt_core_x86_32.nexe" | |
| 115 libdir = "lib32" | |
| 116 elif nacl_arch is "arm": | |
| 117 print("NaCl V8 ARM support is not ready yet.") | |
| 118 sys.exit(1) | |
| 119 else: | |
| 120 print("Invalid nexe %s with NaCl arch %s" % (nexe, nacl_arch)) | |
| 121 sys.exit(1) | |
| 122 | |
| 123 nacl_sel_ldr = os.path.join(nacl_sdk_dir, "tools", sel_ldr) | |
| 124 nacl_irt = os.path.join(nacl_sdk_dir, "tools", irt) | |
| 125 | |
| 126 return (nacl_sdk_dir, nacl_sel_ldr, nacl_irt) | |
| 127 | |
| 128 def Main(): | |
| 129 if (len(sys.argv) == 1): | |
| 130 print("Usage: %s <command-to-run-on-device>" % sys.argv[0]) | |
| 131 return 1 | |
| 132 | |
| 133 args = [Escape(arg) for arg in sys.argv[1:]] | |
| 134 | |
| 135 (nacl_sdk_dir, nacl_sel_ldr, nacl_irt) = GetNaClResources(sys.argv[1]) | |
| 136 | |
| 137 # sel_ldr Options: | |
| 138 # -c -c: disable validation (for performance) | |
| 139 # -a: allow file access | |
| 140 # -B <irt>: load the IRT | |
| 141 command = ' '.join([nacl_sel_ldr, '-c', '-c', '-a', '-B', nacl_irt, '--'] + | |
| 142 args) | |
| 143 error_code = Execute(command) | |
| 144 return error_code | |
| 145 | |
| 146 if __name__ == '__main__': | |
| 147 sys.exit(Main()) | |
| OLD | NEW |