summaryrefslogtreecommitdiffstats
path: root/osx/lipo
diff options
context:
space:
mode:
Diffstat (limited to 'osx/lipo')
-rwxr-xr-xosx/lipo60
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)