#!/usr/bin/python3 # # Copyright 2016 The ANGLE Project Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. # # update_chrome_angle.py: # Helper script that copies ANGLE libraries into the Chromium Canary (on Windows and macOS) # or Dev (on Linux) installed directory. Testing ANGLE this way is much faster than compiling # Chromium from source. The script checks for the most recent build in a set of search paths, # and copies that into: # # - /opt/google/chrome-unstable on Linux # - the most recent Canary installation folder on Windows. # - /Applications/Google\ Chrome\ Canary.app on macOS # import glob, sys, os, shutil # Set of search paths. script_dir = os.path.dirname(sys.argv[0]) os.chdir(os.path.join(script_dir, "..")) source_paths = glob.glob('out/*') is_windows = sys.platform == 'cygwin' or sys.platform.startswith('win') is_macos = sys.platform == 'darwin' if is_windows: # Default Canary installation path. chrome_folder = os.path.join(os.environ['LOCALAPPDATA'], 'Google', 'Chrome SxS', 'Application') libs_to_copy = ['libGLESv2.dll', 'libEGL.dll'] optional_libs_to_copy = [] elif is_macos: chrome_folder = '/Applications/Google Chrome Canary.app/Contents/Frameworks/Google Chrome Framework.framework/Libraries' libs_to_copy = ['libGLESv2.dylib', 'libEGL.dylib'] optional_libs_to_copy = [ 'libvk_swiftshader.dylib', 'libchrome_zlib.dylib', 'libabsl.dylib', 'libc++_chrome.dylib' ] else: # Must be Linux chrome_folder = '/opt/google/chrome-unstable' libs_to_copy = ['libGLESv2.so', 'libEGL.so'] optional_libs_to_copy = ['libchrome_zlib.so', 'libabsl.so', 'libc++.so'] # Find the most recent ANGLE DLLs binary_name = libs_to_copy[0] newest_folder = None newest_mtime = None for path in source_paths: binary_path = os.path.join(path, binary_name) if os.path.exists(binary_path): binary_mtime = os.path.getmtime(binary_path) if (newest_folder is None) or (binary_mtime > newest_mtime): newest_folder = path newest_mtime = binary_mtime if newest_folder is None: sys.exit("Could not find ANGLE binaries!") source_folder = newest_folder if is_windows: # Is a folder a chrome binary directory? def is_chrome_bin(str): chrome_file = os.path.join(chrome_folder, str) return os.path.isdir(chrome_file) and all([char.isdigit() or char == '.' for char in str]) sorted_chrome_bins = sorted( [folder for folder in os.listdir(chrome_folder) if is_chrome_bin(folder)], reverse=True) dest_folder = os.path.join(chrome_folder, sorted_chrome_bins[0]) else: dest_folder = chrome_folder print('Copying binaries from ' + source_folder + ' to ' + dest_folder + '.') def copy_file(src, dst): print(' - ' + src + ' --> ' + dst) if is_macos and os.path.isfile(dst): # For the codesign to work, the original file must be removed os.remove(dst) shutil.copyfile(src, dst) def do_copy(filename, is_optional): src = os.path.join(source_folder, filename) if os.path.exists(src): # No backup is made. Any backup becomes stale on the next update and could be a cause for # confusion. Reintall Chromium if it needs to be recovered. dst = os.path.join(dest_folder, filename) copy_file(src, dst) if is_windows: copy_file(src + '.pdb', dst + '.pdb') elif not is_optional: print(' - COULD NOT FIND "' + src + '"') for filename in libs_to_copy: do_copy(filename, False) # Optionally copy the following, which are needed for a component build # (i.e. is_component_build = true, which is the default) for filename in optional_libs_to_copy: do_copy(filename, True) if is_macos: # Clear all attributes, codesign doesn't work otherwise os.system('xattr -cr /Applications/Google\ Chrome\ Canary.app') # Re-sign the bundle os.system('codesign --force --sign - --deep /Applications/Google\ Chrome\ Canary.app')