diff options
Diffstat (limited to '')
-rwxr-xr-x | osx/lipo | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/osx/lipo b/osx/lipo new file mode 100755 index 0000000..80e658a --- /dev/null +++ b/osx/lipo @@ -0,0 +1,60 @@ +#!/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) |