Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / native_client / build / prep_nacl_sdk.py
1 #!/usr/bin/python
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.
5
6 from optparse import OptionParser, OptionValueError
7 import os
8 import shutil
9 import sys
10
11 """Prep NaCl Toolchain
12
13 Does final assembly of the NaCl toolchain prior to building untrusted modules.
14 """
15
16 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
17 NACL_DIR = os.path.dirname(SCRIPT_DIR)
18
19 # Mapping from TC/include relative path to original source
20 HEADER_MAP = {
21   'x86_newlib': {
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',
35
36       'x86_64-nacl/lib32/crt1.o': 'src/untrusted/stubs/crt1.x',
37       'x86_64-nacl/lib/crt1.o': 'src/untrusted/stubs/crt1.x',
38   },
39   'x86_glibc': {
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',
51   },
52   'arm_newlib': {
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',
67   },
68   'pnacl': {
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',
82   }
83 }
84
85
86 def PosixPath(filepath):
87   if sys.platform == 'win32':
88     return filepath.replace('\\', '/')
89   return filepath
90
91
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)
101
102
103 def MakeDir(outdir):
104   if outdir and not os.path.exists(outdir):
105     os.makedirs(outdir)
106
107
108 def GetInputs(tc_map, basepath):
109   out_set = set()
110   for filename in tc_map:
111     src = PosixPath(os.path.join(NACL_DIR, tc_map[filename]))
112     out_set.add(RealToRelative(src, basepath))
113
114   return '\n'.join(sorted(out_set)) + '\n'
115
116
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)
124
125     shutil.copy(src, dst)
126
127
128 def DoMain(argv):
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.')
138
139   options, files = parser.parse_args(argv)
140   basepath = PosixPath(os.path.abspath(os.getcwd()))
141
142   if len(files):
143     raise OptionValueError('Not expecting arguments: ' + ' '.join(files))
144
145   if options.tool not in HEADER_MAP:
146     raise OptionValueError('Unknown tool name: ' + options.tool)
147
148   tc_map = HEADER_MAP[options.tool]
149   tc_dest = os.path.abspath(options.path)
150
151   if options.inputs:
152     return GetInputs(tc_map, basepath)
153
154   if not options.path or not os.path.exists(options.path):
155     raise RuntimeError('Must set path to a valid directory.')
156
157   if not options.tool in HEADER_MAP:
158     raise RuntimeError('Must specify the toolchain.')
159
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)
164     fh.close()
165     if options.verbose:
166       print 'Created stamp file.'
167   return 0
168
169
170 def main(argv):
171   result = DoMain(argv[1:])
172   if type(result) == int:
173     return result
174
175   sys.stdout.write(result)
176   return 0
177
178
179 if __name__ == '__main__':
180   sys.exit(main(sys.argv))