From bd89767bb8432f8e9e9d94b9a7221e1c195de462 Mon Sep 17 00:00:00 2001 From: Skyler Saleh Date: Sat, 22 May 2021 15:18:43 -0700 Subject: [PATCH] Apple M1: Detect incompatible universal merges Adds a step to detect when the Intel and arm64 build trees cannot be merged safely. This can occur when each side has files/folders that are named the same but are of different types or symlinks that are the same name but need to point to different locations for each architecture. Before this change, this would just fail silently. --- BuildMacOSUniversalBinary.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/BuildMacOSUniversalBinary.py b/BuildMacOSUniversalBinary.py index 11d856de5495..b76c97b14b29 100755 --- a/BuildMacOSUniversalBinary.py +++ b/BuildMacOSUniversalBinary.py @@ -162,6 +162,34 @@ def recursive_merge_binaries(src0, src1, dst): the source trees """ + # Check that all files present in the folder are of the same type and that + # links link to the same relative location + for newpath0 in glob.glob(src0+"/*"): + filename = os.path.basename(newpath0) + newpath1 = os.path.join(src1, filename) + if not os.path.exists(newpath1): + continue + + if os.path.islink(newpath0) and os.path.islink(newpath1): + p0 = os.path.realpath(newpath0) + p1 = os.path.realpath(newpath1) + if os.path.relpath(newpath0,src0) == os.path.relpath(newpath1,src1): + continue + + if os.path.isdir(newpath0) and os.path.isdir(newpath1): + continue + + # Is file can be true for links so check that both are not links + # before checking if they are both files + if (not os.path.islink(newpath0)) and (not os.path.islink(newpath1)): + if os.path.isfile(newpath0) and os.path.isfile(newpath1): + continue + + raise Exception(f"{newpath0} and {newpath1} cannot not be " + + "merged into a universal binary because they are of" + + "incompatible types. Perhaps the installed libraries" + + "from different versions for each architecture") + for newpath0 in glob.glob(src0+"/*"): filename = os.path.basename(newpath0) newpath1 = os.path.join(src1, filename) @@ -171,7 +199,11 @@ def recursive_merge_binaries(src0, src1, dst): continue if not os.path.exists(newpath1): - shutil.copy(newpath0, new_dst_path) + if os.path.isdir(newpath0): + shutil.copytree(newpath0, new_dst_path) + else: + shutil.copy(newpath0, new_dst_path) + continue if os.path.isdir(newpath1):