13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#!/usr/bin/env python
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)# found in the LICENSE file.
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)"""
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)Removes bundled libraries to make sure they are not used.
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)See README for more details.
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)"""
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import optparse
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import os.path
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import sys
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)def DoMain(argv):
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  my_dirname = os.path.abspath(os.path.dirname(__file__))
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  source_tree_root = os.path.abspath(
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    os.path.join(my_dirname, '..', '..', '..'))
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if os.path.join(source_tree_root, 'build', 'linux', 'unbundle') != my_dirname:
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    print ('Sanity check failed: please run this script from ' +
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)           'build/linux/unbundle directory.')
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return 1
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  parser = optparse.OptionParser()
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  parser.add_option('--do-remove', action='store_true')
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  options, args = parser.parse_args(argv)
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  exclusion_used = {}
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for exclusion in args:
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    exclusion_used[exclusion] = False
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for root, dirs, files in os.walk(source_tree_root, topdown=False):
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    # Only look at paths which contain a "third_party" component
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    # (note that e.g. third_party.png doesn't count).
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    root_relpath = os.path.relpath(root, source_tree_root)
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if 'third_party' not in root_relpath.split(os.sep):
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      continue
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    for f in files:
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      path = os.path.join(root, f)
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      relpath = os.path.relpath(path, source_tree_root)
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      excluded = False
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      for exclusion in args:
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        # Require precise exclusions. Find the right-most third_party
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        # in the relative path, and if there is more than one ignore
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        # the exclusion if it's completely contained within the part
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        # before right-most third_party path component.
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        split = relpath.rsplit(os.sep + 'third_party' + os.sep, 1)
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        if len(split) > 1 and split[0].startswith(exclusion):
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          continue
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        if relpath.startswith(exclusion):
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          # Multiple exclusions can match the same path. Go through all of them
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          # and mark each one as used.
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          exclusion_used[exclusion] = True
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          excluded = True
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      if excluded:
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        continue
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      # Deleting gyp files almost always leads to gyp failures.
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      # These files come from Chromium project, and can be replaced if needed.
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      if f.endswith('.gyp') or f.endswith('.gypi'):
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        continue
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      # Deleting .isolate files leads to gyp failures. They are usually
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      # not used by a distro build anyway.
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      # See http://www.chromium.org/developers/testing/isolated-testing
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      # for more info.
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      if f.endswith('.isolate'):
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        continue
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      if options.do_remove:
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        # Delete the file - best way to ensure it's not used during build.
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        os.remove(path)
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      else:
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        # By default just print paths that would be removed.
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        print path
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  exit_code = 0
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  # Fail if exclusion list contains stale entries - this helps keep it
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  # up to date.
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for exclusion, used in exclusion_used.iteritems():
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if not used:
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      print '%s does not exist' % exclusion
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      exit_code = 1
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if not options.do_remove:
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    print ('To actually remove files printed above, please pass ' +
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)           '--do-remove flag.')
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return exit_code
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)if __name__ == '__main__':
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  sys.exit(DoMain(sys.argv[1:]))
103