summaryrefslogtreecommitdiffstats
path: root/tools/isolate_driver.py
diff options
context:
space:
mode:
authormaruel@chromium.org <maruel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-04 03:44:03 +0000
committermaruel@chromium.org <maruel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-04 03:44:03 +0000
commitdc64721761637761afcbc166ea175ec338c463f8 (patch)
treeaa07719cffb3854f3a9add8f0557d563ba97f155 /tools/isolate_driver.py
parent99d2535a119df388de31ae4796d38a5857b059f9 (diff)
downloadchromium_src-dc64721761637761afcbc166ea175ec338c463f8.zip
chromium_src-dc64721761637761afcbc166ea175ec338c463f8.tar.gz
chromium_src-dc64721761637761afcbc166ea175ec338c463f8.tar.bz2
Add a wrapper script which modifies the .isolate on the fly.
This tool will ultimately process the .ninja files, in the meantime it archives all the DLLs. It's cheezy but this will unblock the component build short term. This is very crude but this will get folks going. This means once it's done, we can remove all the .isolate representing the dynamic libraries. Remove swarming_client/ as a dependency in the .isolate files, it's not needed anymore. R=vadimsh@chromium.org BUG=333473 Review URL: https://codereview.chromium.org/196283016 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@261652 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools/isolate_driver.py')
-rwxr-xr-xtools/isolate_driver.py132
1 files changed, 132 insertions, 0 deletions
diff --git a/tools/isolate_driver.py b/tools/isolate_driver.py
new file mode 100755
index 0000000..4a20f22
--- /dev/null
+++ b/tools/isolate_driver.py
@@ -0,0 +1,132 @@
+#!/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.gypi.
+
+Creates a wrapping .isolate which 'includes' the original one, that can be
+consumed by tools/swarming_client/isolate.py. Path variables are determined
+based on the current working directory. The relative_cwd in the .isolated file
+is determined based on *the .isolate file that declare the 'command' variable to
+be used* so the wrapping .isolate doesn't affect this value.
+
+It packages all the dynamic libraries found in this wrapping .isolate. 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 posixpath
+import subprocess
+import sys
+
+TOOLS_DIR = os.path.dirname(os.path.abspath(__file__))
+SWARMING_CLIENT_DIR = os.path.join(TOOLS_DIR, 'swarming_client')
+SRC_DIR = os.path.dirname(TOOLS_DIR)
+
+sys.path.insert(0, SWARMING_CLIENT_DIR)
+
+import isolate_format
+
+
+
+# Location to grab binaries based on the OS.
+DYNAMIC_LIBRARIES = {
+ 'darwin': '*.dylib',
+ 'linux2': 'lib/*.so',
+ 'win32': '*.dll',
+}
+
+
+def create_wrapper(args, isolate_index, isolated_index):
+ """Creates a wrapper .isolate that add dynamic libs.
+
+ The original .isolate is not modified.
+ """
+ cwd = os.getcwd()
+ isolate = args[isolate_index]
+ # The code assumes the .isolate file is always specified path-less in cwd. Fix
+ # if this assumption doesn't hold true.
+ assert os.path.basename(isolate) == isolate, isolate
+
+ # This will look like ../out/Debug. This is based against cwd. Note that this
+ # must equal the value provided as PRODUCT_DIR.
+ build_dir = os.path.dirname(args[isolated_index])
+
+ # This will look like chrome/unit_tests.isolate. It is based against SRC_DIR.
+ # It's used to calculate temp_isolate.
+ src_isolate = os.path.relpath(os.path.join(cwd, isolate), SRC_DIR)
+
+ # The wrapping .isolate. This will look like
+ # ../out/Debug/gen/chrome/unit_tests.isolate.
+ temp_isolate = os.path.join(build_dir, 'gen', src_isolate)
+ temp_isolate_dir = os.path.dirname(temp_isolate)
+
+ # Relative path between the new and old .isolate file.
+ isolate_relpath = os.path.relpath(
+ '.', temp_isolate_dir).replace(os.path.sep, '/')
+
+ # This will look like [../out/Debug/lib/libuser_prefs.so].
+ dynamic_libs = [
+ i.replace(os.path.sep, '/')
+ for i in glob.iglob(
+ os.path.join(build_dir, DYNAMIC_LIBRARIES[sys.platform]))
+ ]
+ # And now like ['<(PRODUCT_DIR)/lib/flibuser_prefs.so'].
+ rebased_libs = [
+ '<(PRODUCT_DIR)/%s' % i[len(build_dir)+1:]
+ for i in dynamic_libs
+ ]
+
+ # Now do actual wrapping .isolate.
+ out = {
+ 'includes': [
+ posixpath.join(isolate_relpath, isolate),
+ ],
+ 'variables': {
+ isolate_format.KEY_TRACKED: rebased_libs,
+ },
+ }
+ if not os.path.isdir(temp_isolate_dir):
+ os.makedirs(temp_isolate_dir)
+ comment = (
+ '# Warning: this file was AUTOGENERATED.\n'
+ '# DO NO EDIT.\n')
+ with open(temp_isolate, 'wb') as f:
+ isolate_format.print_all(comment, out, f)
+ if '--verbose' in args:
+ print('Added %d dynamic libs' % len(dynamic_libs))
+ args[isolate_index] = temp_isolate
+
+
+def main():
+ args = sys.argv[1:]
+ isolate = None
+ isolated = None
+ is_component = False
+ for i, arg in enumerate(args):
+ 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:
+ create_wrapper(args, isolate, isolated)
+
+ swarming_client = os.path.join(SRC_DIR, 'tools', 'swarming_client')
+ sys.stdout.flush()
+ result = subprocess.call(
+ [sys.executable, os.path.join(swarming_client, 'isolate.py')] + args)
+ return result
+
+
+if __name__ == '__main__':
+ sys.exit(main())