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