Skip to content

Commit

Permalink
Apple M1: Detect incompatible universal merges
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
skylersaleh committed May 22, 2021
1 parent 76ed931 commit abea411
Showing 1 changed file with 31 additions and 1 deletion.
32 changes: 31 additions & 1 deletion BuildMacOSUniversalBinary.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,32 @@ 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):
if os.path.relpath(newpath0,src0) == os.path.relpath(newpath1,src1):
continue

if os.path.isdir(newpath0) and os.path.isdir(newpath1):
continue

# isfile() 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 be " +
"merged into a universal binary because they are of " +
"incompatible types. Perhaps the installed libraries" +
" are from different versions for each architecture")

for newpath0 in glob.glob(src0+"/*"):
filename = os.path.basename(newpath0)
newpath1 = os.path.join(src1, filename)
Expand All @@ -171,7 +197,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):
Expand Down

0 comments on commit abea411

Please sign in to comment.