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
4 # found in the LICENSE file.
6 from optparse import OptionParser, OptionValueError
11 """Prep NaCl Toolchain
13 Does final assembly of the NaCl toolchain prior to building untrusted modules.
16 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
17 NACL_DIR = os.path.dirname(SCRIPT_DIR)
19 # Mapping from TC/include relative path to original source
22 'x86_64-nacl/include/pthread.h': 'src/untrusted/pthread/pthread.h',
23 'x86_64-nacl/include/semaphore.h': 'src/untrusted/pthread/semaphore.h',
24 'x86_64-nacl/include/nacl/dynamic_annotations.h':
25 'src/untrusted/valgrind/dynamic_annotations.h',
26 'x86_64-nacl/include/nacl/nacl_dyncode.h':
27 'src/untrusted/nacl/nacl_dyncode.h',
28 'x86_64-nacl/include/nacl/nacl_random.h':
29 'src/untrusted/nacl/nacl_random.h',
30 'x86_64-nacl/include/nacl/nacl_startup.h':
31 'src/untrusted/nacl/nacl_startup.h',
32 'x86_64-nacl/include/nacl/nacl_thread.h':
33 'src/untrusted/nacl/nacl_thread.h',
34 'x86_64-nacl/include/irt.h': 'src/untrusted/irt/irt.h',
36 'x86_64-nacl/lib32/crt1.o': 'src/untrusted/stubs/crt1.x',
37 'x86_64-nacl/lib/crt1.o': 'src/untrusted/stubs/crt1.x',
40 'x86_64-nacl/include/nacl/dynamic_annotations.h':
41 'src/untrusted/valgrind/dynamic_annotations.h',
42 'x86_64-nacl/include/nacl/nacl_dyncode.h':
43 'src/untrusted/nacl/nacl_dyncode.h',
44 'x86_64-nacl/include/nacl/nacl_random.h':
45 'src/untrusted/nacl/nacl_random.h',
46 'x86_64-nacl/include/nacl/nacl_startup.h':
47 'src/untrusted/nacl/nacl_startup.h',
48 'x86_64-nacl/include/nacl/nacl_thread.h':
49 'src/untrusted/nacl/nacl_thread.h',
50 'x86_64-nacl/include/irt.h': 'src/untrusted/irt/irt.h',
53 'arm-nacl/include/pthread.h': 'src/untrusted/pthread/pthread.h',
54 'arm-nacl/include/semaphore.h': 'src/untrusted/pthread/semaphore.h',
55 'arm-nacl/include/nacl/dynamic_annotations.h':
56 'src/untrusted/valgrind/dynamic_annotations.h',
57 'arm-nacl/include/nacl/nacl_dyncode.h':
58 'src/untrusted/nacl/nacl_dyncode.h',
59 'arm-nacl/include/nacl/nacl_random.h':
60 'src/untrusted/nacl/nacl_random.h',
61 'arm-nacl/include/nacl/nacl_startup.h':
62 'src/untrusted/nacl/nacl_startup.h',
63 'arm-nacl/include/nacl/nacl_thread.h':
64 'src/untrusted/nacl/nacl_thread.h',
65 'arm-nacl/include/irt.h': 'src/untrusted/irt/irt.h',
66 'arm-nacl/lib/crt1.o': 'src/untrusted/stubs/crt1.x',
69 'sdk/include/pthread.h': 'src/untrusted/pthread/pthread.h',
70 'sdk/include/semaphore.h': 'src/untrusted/pthread/semaphore.h',
71 'sdk/include/nacl/dynamic_annotations.h':
72 'src/untrusted/valgrind/dynamic_annotations.h',
73 'sdk/include/nacl/nacl_dyncode.h':
74 'src/untrusted/nacl/nacl_dyncode.h',
75 'sdk/include/nacl/nacl_random.h':
76 'src/untrusted/nacl/nacl_random.h',
77 'sdk/include/nacl/nacl_startup.h':
78 'src/untrusted/nacl/nacl_startup.h',
79 'sdk/include/nacl/nacl_thread.h':
80 'src/untrusted/nacl/nacl_thread.h',
81 'sdk/include/irt.h': 'src/untrusted/irt/irt.h',
86 def PosixPath(filepath):
87 if sys.platform == 'win32':
88 return filepath.replace('\\', '/')
92 def RealToRelative(filepath, basepath):
93 """Returns a relative path from an absolute basepath and filepath."""
94 path_parts = filepath.split('/')
95 base_parts = basepath.split('/')
96 while path_parts and base_parts and path_parts[0] == base_parts[0]:
97 path_parts = path_parts[1:]
98 base_parts = base_parts[1:]
99 rel_parts = ['..'] * len(base_parts) + path_parts
100 return '/'.join(rel_parts)
104 if outdir and not os.path.exists(outdir):
108 def GetInputs(tc_map, basepath):
110 for filename in tc_map:
111 src = PosixPath(os.path.join(NACL_DIR, tc_map[filename]))
112 out_set.add(RealToRelative(src, basepath))
114 return '\n'.join(sorted(out_set)) + '\n'
117 def CopyFiles(tc_map, tc_dst):
118 for filename in tc_map:
119 src = PosixPath(os.path.join(NACL_DIR, tc_map[filename]))
120 dst = os.path.join(tc_dst, filename)
121 MakeDir(os.path.dirname(dst))
122 if not os.path.exists(src):
123 raise RuntimeError('File not found: ' + src)
125 shutil.copy(src, dst)
129 parser = OptionParser()
130 parser.add_option('-p', '--path', dest='path', default='',
131 help='Set include path.')
132 parser.add_option('-t', '--tool', dest='tool', default='',
133 help='Select toolset.')
134 parser.add_option('-i', '--inputs', dest='inputs', action='store_true',
135 help='Return dependency list.', default=False)
136 parser.add_option('-v', '--verbose', dest='verbose', action='store_true',
137 help='Enable versbose output.')
139 options, files = parser.parse_args(argv)
140 basepath = PosixPath(os.path.abspath(os.getcwd()))
143 raise OptionValueError('Not expecting arguments: ' + ' '.join(files))
145 if options.tool not in HEADER_MAP:
146 raise OptionValueError('Unknown tool name: ' + options.tool)
148 tc_map = HEADER_MAP[options.tool]
149 tc_dest = os.path.abspath(options.path)
152 return GetInputs(tc_map, basepath)
154 if not options.path or not os.path.exists(options.path):
155 raise RuntimeError('Must set path to a valid directory.')
157 if not options.tool in HEADER_MAP:
158 raise RuntimeError('Must specify the toolchain.')
160 if not options.inputs:
161 CopyFiles(tc_map, tc_dest)
162 fh = open(os.path.join(tc_dest, 'stamp.prep'), 'w')
163 fh.write('NACL SDK stamp for %s\n' % options.tool)
166 print 'Created stamp file.'
171 result = DoMain(argv[1:])
172 if type(result) == int:
175 sys.stdout.write(result)
179 if __name__ == '__main__':
180 sys.exit(main(sys.argv))