# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

import sys
import os
import subprocess
import shutil
from buildconfig import substs

'''
Scans the given directories for binaries referencing the AddressSanitizer
runtime library, copies it to the main directory and rewrites binaries to not
reference it with absolute paths but with @executable_path instead.
'''

# This is the dylib we're looking for
DYLIB_NAME='libclang_rt.asan_osx_dynamic.dylib'

def scan_directory(path):
    dylibCopied = False

    for root, subdirs, files in os.walk(path):
        for filename in files:
            filename = os.path.join(root, filename)

            # Skip all files that aren't either dylibs or executable
            if not (filename.endswith('.dylib') or os.access(filename, os.X_OK)):
                continue

            try:
                otoolOut = subprocess.check_output([substs['OTOOL'], '-L', filename])
            except:
                # Errors are expected on non-mach executables, ignore them and continue
                continue

            for line in otoolOut.splitlines():
                if line.find(DYLIB_NAME) != -1:
                    absDylibPath = line.split()[0]

                    # Don't try to rewrite binaries twice
                    if absDylibPath.find('@executable_path/') == 0:
                        continue

                    if not dylibCopied:
                        # Copy the runtime once to the main directory, which is passed
                        # as the argument to this function.
                        shutil.copy(absDylibPath, path)

                        # Now rewrite the library itself
                        subprocess.check_call(['install_name_tool', '-id', '@executable_path/' + DYLIB_NAME, os.path.join(path, DYLIB_NAME)])
                        dylibCopied = True

                    # Now use install_name_tool to rewrite the path in our binary
                    subprocess.check_call(['install_name_tool', '-change', absDylibPath, '@executable_path/' + DYLIB_NAME, filename])
                    break

if __name__ == '__main__':
    for d in sys.argv[1:]:
        scan_directory(d)
