Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(506)

Side by Side Diff: tools/isolate_driver.py

Issue 196283016: Add a wrapper script which modifies the .isolate on the fly. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Works Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/net_unittests.isolate ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 #!/usr/bin/env python
2 # Copyright 2014 The Chromium 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 """Adaptor script called through build/isolate.gypi.
7
8 Creates a wrapping .isolate which 'includes' the original one, that can be
9 consumed by tools/swarming_client/isolate.py. Path variables are determined
10 based on the current working directory. The relative_cwd in the .isolated file
11 is determined based on *the .isolate file that declare the 'command' variable to
12 be used* so the wrapping .isolate doesn't affect this value.
13
14 It packages all the dynamic libraries found in this wrapping .isolate. This is
15 inefficient and non-deterministic. In the very near future, it will parse
16 build.ninja, find back the root target and find all the dynamic libraries that
17 are marked as a dependency to this target.
18 """
19
20 import glob
21 import os
22 import posixpath
23 import subprocess
24 import sys
25
26 TOOLS_DIR = os.path.dirname(os.path.abspath(__file__))
27 SWARMING_CLIENT_DIR = os.path.join(TOOLS_DIR, 'swarming_client')
28
29 sys.path.insert(0, SWARMING_CLIENT_DIR)
30
31 import isolate_format
32
33
34 SRC_DIR = os.path.dirname(TOOLS_DIR)
Vadim Sh. 2014/03/31 18:21:53 minor nit: move this right after SWARMING_CLIENT_D
M-A Ruel 2014/04/04 00:35:18 Done.
35
36
37 # Location to grab binaries based on the OS.
38 DYNAMIC_LIBRARIES = {
39 'darwin': '*.dylib',
40 'linux2': 'lib/*.so',
41 'win32': '*.dll',
42 }
43
44
45 def create_wrapper(args, isolate_index, isolated_index):
46 """Creates a wrapper .isolate that add dynamic libs.
47
48 The original .isolate is not modified.
49 """
50 cwd = os.getcwd()
51 isolate = args[isolate_index]
52 # The code assumes the .isolate file is always specified path-less in cwd. Fix
53 # if this assumption doesn't hold true.
54 assert os.path.basename(isolate) == isolate, isolate
55
56 # This will look like ../out/Debug. This is based against cwd. Note that this
57 # must equal the value provided as PRODUCT_DIR.
58 build_dir = os.path.dirname(args[isolated_index])
59
60 # This will look like chrome/unit_tests.isolate. It is based against SRC_DIR.
61 # It's used to calculate temp_isolate.
62 src_isolate = os.path.relpath(os.path.join(cwd, isolate), SRC_DIR)
63
64 # The wrapping .isolate. This will look like
65 # ../out/Debug/gen/chrome/unit_tests.isolate.
66 temp_isolate = os.path.join(build_dir, 'gen', src_isolate)
67 temp_isolate_dir = os.path.dirname(temp_isolate)
68
69 # Relative path between the new and old .isolate file.
70 isolate_relpath = os.path.relpath(
71 '.', temp_isolate_dir).replace(os.path.sep, '/')
72
73 # This will look like [../out/Debug/lib/libuser_prefs.so].
74 dynamic_libs = [
75 i.replace(os.path.sep, '/')
76 for i in glob.iglob(
77 os.path.join(build_dir, DYNAMIC_LIBRARIES[sys.platform]))
78 ]
79 # And now like ['<(PRODUCT_DIR)/lib/flibuser_prefs.so'].
80 rebased_libs = [
81 '<(PRODUCT_DIR)/%s' % i[len(build_dir)+1:]
82 for i in dynamic_libs
83 ]
84
85 # Now do actual wrapping .isolate.
86 out = {
87 'includes': [
88 posixpath.join(isolate_relpath, isolate),
89 ],
90 'variables': {
91 isolate_format.KEY_TRACKED: rebased_libs,
92 },
93 }
94 if not os.path.isdir(temp_isolate_dir):
95 os.makedirs(temp_isolate_dir)
96 comment = (
97 '# Warning: this file was AUTOGENERATED.\n'
98 '# DO NO EDIT.\n')
99 with open(temp_isolate, 'wb') as f:
100 isolate_format.print_all(comment, out, f)
101 if '--verbose' in args:
102 print('Added %d dynamic libs' % len(dynamic_libs))
103 args[isolate_index] = temp_isolate
104
105
106 def main():
107 args = sys.argv[1:]
108 print ' '.join(sys.argv)
Vadim Sh. 2014/03/31 18:21:53 Is it helpful?
M-A Ruel 2014/04/04 00:35:18 No, I had forgot it from debugging.
109 isolate = None
110 isolated = None
111 is_component = False
112 for i, arg in enumerate(args):
113 if arg == '--isolate':
114 isolate = i + 1
115 if arg == '--isolated':
116 isolated = i + 1
117 if arg == 'component=shared_library':
118 is_component = True
119 if isolate is None or isolated is None:
120 print >> sys.stderr, 'Internal failure'
121 return 1
122
123 if is_component:
124 create_wrapper(args, isolate, isolated)
125
126 swarming_client = os.path.join(SRC_DIR, 'tools', 'swarming_client')
127 sys.stdout.flush()
128 result = subprocess.call(
129 [sys.executable, os.path.join(swarming_client, 'isolate.py')] + args)
130 return result
131
132
133 if __name__ == '__main__':
134 sys.exit(main())
OLDNEW
« no previous file with comments | « net/net_unittests.isolate ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698