1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
11 from pylib
import cmd_helper
12 from pylib
import constants
15 _ISOLATE_SCRIPT
= os
.path
.join(
16 constants
.DIR_SOURCE_ROOT
, 'tools', 'swarming_client', 'isolate.py')
19 def DefaultPathVariables():
21 'DEPTH': constants
.DIR_SOURCE_ROOT
,
22 'PRODUCT_DIR': constants
.GetOutDirectory(),
26 def DefaultConfigVariables():
27 # Note: This list must match the --config-vars in build/isolate.gypi
29 'CONFIGURATION_NAME': constants
.GetBuildType(),
32 'branding': 'Chromium',
34 'component': 'static_library',
35 'enable_pepper_cdms': '0',
36 'enable_plugins': '0',
38 'icu_use_data_file_flag': '1',
42 # TODO(maruel): This may not always be true.
45 'use_custom_libcxx': '0',
46 'use_instrumented_libraries': '0',
47 'use_prebuilt_instrumented_libraries': '0',
51 'v8_use_external_startup_data': '1',
55 class Isolator(object):
56 """Manages calls to isolate.py for the android test runner scripts."""
58 def __init__(self
, isolate_deps_dir
):
61 isolate_deps_dir: The directory in which dependencies specified by
62 isolate are or should be stored.
64 self
._isolate
_deps
_dir
= isolate_deps_dir
67 """Deletes the isolate dependency directory."""
68 if os
.path
.exists(self
._isolate
_deps
_dir
):
69 shutil
.rmtree(self
._isolate
_deps
_dir
)
71 def Remap(self
, isolate_abs_path
, isolated_abs_path
,
72 path_variables
=None, config_variables
=None):
73 """Remaps data dependencies into |self._isolate_deps_dir|.
76 isolate_abs_path: The absolute path to the .isolate file, which specifies
77 data dependencies in the source tree.
78 isolated_abs_path: The absolute path to the .isolated file, which is
79 generated by isolate.py and specifies data dependencies in
80 |self._isolate_deps_dir| and their digests.
81 path_variables: A dict containing everything that should be passed
82 as a |--path-variable| to the isolate script. Defaults to the return
83 value of |DefaultPathVariables()|.
84 config_variables: A dict containing everything that should be passed
85 as a |--config-variable| to the isolate script. Defaults to the return
86 value of |DefaultConfigVariables()|.
88 Exception if the isolate command fails for some reason.
90 if not path_variables
:
91 path_variables
= DefaultPathVariables()
92 if not config_variables
:
93 config_variables
= DefaultConfigVariables()
96 sys
.executable
, _ISOLATE_SCRIPT
, 'remap',
97 '--isolate', isolate_abs_path
,
98 '--isolated', isolated_abs_path
,
99 '--outdir', self
._isolate
_deps
_dir
,
101 for k
, v
in path_variables
.iteritems():
102 isolate_cmd
.extend(['--path-variable', k
, v
])
103 for k
, v
in config_variables
.iteritems():
104 isolate_cmd
.extend(['--config-variable', k
, v
])
106 if cmd_helper
.RunCmd(isolate_cmd
):
107 raise Exception('isolate command failed: %s' % ' '.join(isolate_cmd
))
109 def VerifyHardlinks(self
):
110 """Checks |isolate_deps_dir| for a hardlink.
113 True if a hardlink is found.
114 False if nothing is found.
116 Exception if a non-hardlink is found.
118 for root
, _
, filenames
in os
.walk(self
._isolate
_deps
_dir
):
120 linked_file
= os
.path
.join(root
, filenames
[0])
121 orig_file
= os
.path
.join(
122 self
._isolate
_deps
_dir
,
123 os
.path
.relpath(linked_file
, self
._isolate
_deps
_dir
))
124 if os
.stat(linked_file
).st_ino
== os
.stat(orig_file
).st_ino
:
127 raise Exception('isolate remap command did not use hardlinks.')
130 def PurgeExcluded(self
, deps_exclusion_list
):
131 """Deletes anything on |deps_exclusion_list| from |self._isolate_deps_dir|.
134 deps_exclusion_list: A list of globs to exclude from the isolate
135 dependency directory.
138 x
for y
in deps_exclusion_list
140 os
.path
.abspath(os
.path
.join(self
._isolate
_deps
_dir
, y
))))
141 for p
in excluded_paths
:
147 def MoveOutputDeps(self
):
148 """Moves files from the output directory to the top level of
149 |self._isolate_deps_dir|.
151 Moves pak files from the output directory to to <isolate_deps_dir>/paks
152 Moves files from the product directory to <isolate_deps_dir>
154 # On Android, all pak files need to be in the top-level 'paks' directory.
155 paks_dir
= os
.path
.join(self
._isolate
_deps
_dir
, 'paks')
158 deps_out_dir
= os
.path
.join(
159 self
._isolate
_deps
_dir
,
160 os
.path
.relpath(os
.path
.join(constants
.GetOutDirectory(), os
.pardir
),
161 constants
.DIR_SOURCE_ROOT
))
162 for root
, _
, filenames
in os
.walk(deps_out_dir
):
163 for filename
in fnmatch
.filter(filenames
, '*.pak'):
164 shutil
.move(os
.path
.join(root
, filename
), paks_dir
)
166 # Move everything in PRODUCT_DIR to top level.
167 deps_product_dir
= os
.path
.join(deps_out_dir
, constants
.GetBuildType())
168 if os
.path
.isdir(deps_product_dir
):
169 for p
in os
.listdir(deps_product_dir
):
170 shutil
.move(os
.path
.join(deps_product_dir
, p
), self
._isolate
_deps
_dir
)
171 os
.rmdir(deps_product_dir
)
172 os
.rmdir(deps_out_dir
)