| #!/usr/bin/env python |
| # Copyright 2013 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. |
| |
| """ |
| Removes bundled libraries to make sure they are not used. |
| |
| See README for more details. |
| """ |
| |
| from __future__ import print_function |
| |
| import optparse |
| import os.path |
| import sys |
| |
| |
| def DoMain(argv): |
| my_dirname = os.path.abspath(os.path.dirname(__file__)) |
| source_tree_root = os.path.abspath( |
| os.path.join(my_dirname, '..', '..', '..')) |
| |
| if os.path.join(source_tree_root, 'build', 'linux', 'unbundle') != my_dirname: |
| print('Sanity check failed: please run this script from ' |
| 'build/linux/unbundle directory.') |
| return 1 |
| |
| parser = optparse.OptionParser() |
| parser.add_option('--do-remove', action='store_true') |
| |
| options, args = parser.parse_args(argv) |
| |
| exclusion_used = {} |
| for exclusion in args: |
| exclusion_used[exclusion] = False |
| |
| for root, dirs, files in os.walk(source_tree_root, topdown=False): |
| # Only look at paths which contain a "third_party" component |
| # (note that e.g. third_party.png doesn't count). |
| root_relpath = os.path.relpath(root, source_tree_root) |
| if 'third_party' not in root_relpath.split(os.sep): |
| continue |
| |
| for f in files: |
| path = os.path.join(root, f) |
| relpath = os.path.relpath(path, source_tree_root) |
| |
| excluded = False |
| for exclusion in args: |
| # Require precise exclusions. Find the right-most third_party |
| # in the relative path, and if there is more than one ignore |
| # the exclusion if it's completely contained within the part |
| # before right-most third_party path component. |
| split = relpath.rsplit(os.sep + 'third_party' + os.sep, 1) |
| if len(split) > 1 and split[0].startswith(exclusion): |
| continue |
| |
| if relpath.startswith(exclusion): |
| # Multiple exclusions can match the same path. Go through all of them |
| # and mark each one as used. |
| exclusion_used[exclusion] = True |
| excluded = True |
| if excluded: |
| continue |
| |
| # Deleting gyp files almost always leads to gyp failures. |
| # These files come from Chromium project, and can be replaced if needed. |
| if f.endswith('.gyp') or f.endswith('.gypi'): |
| continue |
| |
| # Same about GN files. |
| if f.endswith('.gn') or f.endswith('.gni'): |
| continue |
| |
| # Deleting .isolate files leads to gyp failures. They are usually |
| # not used by a distro build anyway. |
| # See http://www.chromium.org/developers/testing/isolated-testing |
| # for more info. |
| if f.endswith('.isolate'): |
| continue |
| |
| if options.do_remove: |
| # Delete the file - best way to ensure it's not used during build. |
| os.remove(path) |
| else: |
| # By default just print paths that would be removed. |
| print(path) |
| |
| exit_code = 0 |
| |
| # Fail if exclusion list contains stale entries - this helps keep it |
| # up to date. |
| for exclusion, used in exclusion_used.items(): |
| if not used: |
| print('%s does not exist' % exclusion) |
| exit_code = 1 |
| |
| if not options.do_remove: |
| print('To actually remove files printed above, please pass ' |
| '--do-remove flag.') |
| |
| return exit_code |
| |
| |
| if __name__ == '__main__': |
| sys.exit(DoMain(sys.argv[1:])) |