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

Unified 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: fixes Created 6 years, 9 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 side-by-side diff with in-line comments
Download patch
« base/base_unittests.isolate ('K') | « net/net_unittests.isolate ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/isolate_driver.py
diff --git a/tools/isolate_driver.py b/tools/isolate_driver.py
new file mode 100755
index 0000000000000000000000000000000000000000..b07c044a25da69b74217fd052cc541aef7d35f40
--- /dev/null
+++ b/tools/isolate_driver.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Adaptor script called through build/isolate.gyp.
Vadim Sh. 2014/03/14 01:51:35 isolate.gypi (with 'i')?
M-A Ruel 2014/03/14 12:51:56 Done.
+
+Creates a temporary .isolate merged with the original one into a .isolate file
+that can be consumed by tools/swarming_client/isolate.py.
+
+For now it packages all the dynamic libraries found. This is inefficient and
+non-deterministic. In the very near future, it will parse build.ninja, find back
+the root target and find all the dynamic libraries that are marked as a
+dependency to this target.
+"""
+
+import glob
+import os
+import optparse
+import subprocess
+import sys
+
+
+SRC_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+DYNAMIC_LIBRARIES = {
+ 'darwin': '*.dylib',
+ 'linux2': 'lib/*.so',
+ 'win32': '*.dll',
+}
+
+
+def mangle(args, isolate, isolated):
+ # Open the .isolate, edit it, store it in the temporary directory.
+ # All paths are relative to cwd.
+ cwd = os.getcwd()
Vadim Sh. 2014/03/14 01:51:35 What is cwd? Does ninja gives any guarantees about
M-A Ruel 2014/03/14 12:51:56 ninja guarantees the script will be called from th
Vadim Sh. 2014/03/14 18:01:38 Please add a comment describing what cwd is expect
+ src_isolate = os.path.relpath(os.path.join(cwd, args[isolate]), SRC_DIR)
+ build_dir = os.path.dirname(args[isolated])
+ temp_isolate = os.path.join(build_dir, 'gen', src_isolate)
+ dynamic_libs = glob.glob(
+ os.path.join(build_dir, DYNAMIC_LIBRARIES[sys.platform]))
+
+ # Mangle it.
+ with open(args[isolate], 'rb') as f:
+ isolate_content = f.read()
+ isolate_content = isolate_content.strip()[:-1]
+ isolate_content += (
Vadim Sh. 2014/03/14 01:51:35 that's is very hacky... why not exec it, modify as
M-A Ruel 2014/03/14 12:51:56 There's a few options; 1. Hack the way it's curren
Vadim Sh. 2014/03/14 18:01:38 I think #1 is more fragile than #2. It's a big rel
+ " 'variables': {\n"
+ " 'isolate_tracked': [\n"
+ "%s"
+ " ],\n"
+ " },\n"
+ "}\n") % ''.join(' %s,\n' % repr(d) for d in dynamic_libs)
+ gen_dir = os.path.dirname(temp_isolate)
+ if not os.path.isdir(gen_dir):
+ os.makedirs(gen_dir)
+ with open(temp_isolate, 'wb') as f:
+ f.write(isolate_content)
+
+ print('Added %d dynamic libs' % len(dynamic_libs))
+ args[isolate] = temp_isolate
+
+
+def main():
+ args = sys.argv[1:]
+ isolate = None
+ isolated = None
+ is_component = False
+ for i, arg in enumerate(args):
Vadim Sh. 2014/03/14 01:51:35 why not optparse? It's even imported.
M-A Ruel 2014/03/14 12:51:56 Yeah I thought about using it first and proxying a
Vadim Sh. 2014/03/14 18:01:38 Yeah, makes sense.
+ if arg == '--isolate':
+ isolate = i + 1
+ if arg == '--isolated':
+ isolated = i + 1
+ if arg == 'component=shared_library':
+ is_component = True
+ if isolate is None or isolated is None:
+ print >> sys.stderr, 'Internal failure'
+ return 1
+
+ if is_component:
+ mangle(args, isolate, isolated)
+
+ swarming_client = os.path.join(SRC_DIR, 'tools', 'swarming_client')
+ return subprocess.call(
+ [sys.executable, os.path.join(swarming_client, 'isolate.py')] +
+ sys.argv[1:])
+
+
+if __name__ == '__main__':
+ sys.exit(main())
« base/base_unittests.isolate ('K') | « net/net_unittests.isolate ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698