#!/usr/bin/env python3 """Apply lipo recursively to trees. """ import sys import os import shutil import subprocess # Parse arguments import argparse parser = argparse.ArgumentParser( description=sys.modules[__name__].__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, ) parser.add_argument("output", help="Output tree") parser.add_argument("input", help="Input trees", nargs="+") options = parser.parse_args() output = options.output inputs = options.input def ismacho(path): """Check if a file is Mach-O""" fnull = open(os.devnull, "w") try: subprocess.check_call(["lipo", "-info", path], stdout=fnull, stderr=fnull) except subprocess.CalledProcessError: return False return True # Copy for root, dirs, files in os.walk(inputs[0]): # Create root directory in output oroot = root[len(inputs[0]) :].lstrip("/") oroot = os.path.join(output, oroot) if not os.path.isdir(oroot): os.makedirs(oroot) shutil.copystat(root, oroot) # Copy files for f in files: of = os.path.join(oroot, f) f = os.path.join(root, f) if os.path.islink(f): # Symlink linkto = os.readlink(f) os.symlink(linkto, of) elif ismacho(f): sff = [os.path.join(r, f[len(inputs[0]) :].lstrip("/")) for r in inputs] args = ["lipo", "-create", "-output", of] args.extend(sff) subprocess.check_call(args) else: # Regular file, just copy from the first input directory shutil.copyfile(f, of) shutil.copystat(f, of)