# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import argparse
import os
import buildconfig
import mozpack.path
as mozpath
from mozpack.copier
import FileCopier
from mozpack.errors
import errors
from mozpack.files
import FileFinder
from mozpack.unify
import UnifiedFinder
class UnifiedTestFinder(UnifiedFinder):
def unify_file(self, path, file1, file2):
unified = super(UnifiedTestFinder, self).unify_file(path, file1, file2)
basename = mozpath.basename(path)
if basename ==
"mozinfo.json":
# The mozinfo.json files contain processor info, which differs
# between both ends.
# Remove the block when this assert is hit.
assert not unified
errors.ignore_errors()
self._report_difference(path, file1, file2)
errors.ignore_errors(
False)
return file1
elif basename ==
"dump_syms_mac":
# At the moment, the dump_syms_mac executable is a x86_64 binary
# on both ends. We can't create a universal executable from twice
# the same executable.
# When this assert hits, remove this block.
assert file1.open().read() == file2.open().read()
return file1
return unified
def main():
parser = argparse.ArgumentParser(
description=
"Merge two directories, creating Universal binaries for "
"executables and libraries they contain."
)
parser.add_argument(
"dir1", help=
"Directory")
parser.add_argument(
"dir2", help=
"Directory to merge")
options = parser.parse_args()
buildconfig.substs[
"OS_ARCH"] =
"Darwin"
buildconfig.substs[
"LIPO"] = os.environ.get(
"LIPO")
dir1_finder = FileFinder(options.dir1, find_executables=
True, find_dotfiles=
True)
dir2_finder = FileFinder(options.dir2, find_executables=
True, find_dotfiles=
True)
finder = UnifiedTestFinder(dir1_finder, dir2_finder)
copier = FileCopier()
with errors.accumulate():
for p, f
in finder:
copier.add(p, f)
copier.copy(options.dir1, skip_if_older=
False)
if __name__ ==
"__main__":
main()