summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/installer/unify.py
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/installer/unify.py')
-rw-r--r--toolkit/mozapps/installer/unify.py111
1 files changed, 111 insertions, 0 deletions
diff --git a/toolkit/mozapps/installer/unify.py b/toolkit/mozapps/installer/unify.py
new file mode 100644
index 0000000000..1cbc3ca671
--- /dev/null
+++ b/toolkit/mozapps/installer/unify.py
@@ -0,0 +1,111 @@
+# 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 six
+import sys
+import buildconfig
+import mozpack.path as mozpath
+from mozpack.packager.formats import (
+ FlatFormatter,
+ JarFormatter,
+ OmniJarFormatter,
+)
+from mozpack.packager import SimplePackager
+from mozpack.copier import (
+ FileCopier,
+ Jarrer,
+)
+from mozpack.errors import errors
+from mozpack.files import FileFinder
+from mozpack.mozjar import JAR_DEFLATED
+from mozpack.packager.unpack import UnpackFinder
+from mozpack.unify import UnifiedBuildFinder
+
+
+# At the moment, rlbox is not supported on aarch64, so we need to allow
+# the files to be missing on the aarch64 half of the build. This also
+# means the precomplete file doesn't match, and we want to keep the x86_64
+# version which contains the extra lines for the wasm libs.
+WASM_LIBS = (
+ "Contents/MacOS/liboggwasm.dylib",
+ "Contents/MacOS/libgraphitewasm.dylib",
+)
+
+
+class UnifiedBuildFinderWasmHack(UnifiedBuildFinder):
+ def unify_file(self, path, file1, file2):
+ if path in WASM_LIBS:
+ # When this assert hits, it means rlbox is supported on aarch64,
+ # and this override, as well as precomplete below, can be removed.
+ assert not file2
+ return file1
+ if file1 and file2 and path == "Contents/Resources/precomplete":
+ # Check that the only differences are because of the missing wasm libs.
+ wasm_lines = ['remove "{}"\n'.format(l).encode("utf-8") for l in WASM_LIBS]
+ content1 = [
+ l
+ for l in file1.open().readlines()
+ if not any(x == l for x in wasm_lines)
+ ]
+ content2 = file2.open().readlines()
+ if content1 == content2:
+ return file1
+ return super(UnifiedBuildFinderWasmHack, self).unify_file(path, file1, file2)
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description="Merge two builds of a Gecko-based application into a Universal build"
+ )
+ parser.add_argument("app1", help="Directory containing the application")
+ parser.add_argument("app2", help="Directory containing the application to merge")
+ parser.add_argument(
+ "--non-resource",
+ nargs="+",
+ metavar="PATTERN",
+ default=[],
+ help="Extra files not to be considered as resources",
+ )
+
+ options = parser.parse_args()
+
+ buildconfig.substs["OS_ARCH"] = "Darwin"
+ buildconfig.substs["LIPO"] = os.environ.get("LIPO")
+
+ app1_finder = UnpackFinder(FileFinder(options.app1, find_executables=True))
+ app2_finder = UnpackFinder(FileFinder(options.app2, find_executables=True))
+ app_finder = UnifiedBuildFinderWasmHack(app1_finder, app2_finder)
+
+ copier = FileCopier()
+ compress = min(app1_finder.compressed, JAR_DEFLATED)
+ if app1_finder.kind == "flat":
+ formatter = FlatFormatter(copier)
+ elif app1_finder.kind == "jar":
+ formatter = JarFormatter(copier, compress=compress)
+ elif app1_finder.kind == "omni":
+ formatter = OmniJarFormatter(
+ copier,
+ app1_finder.omnijar,
+ compress=compress,
+ non_resources=options.non_resource,
+ )
+
+ with errors.accumulate():
+ packager = SimplePackager(formatter)
+ for p, f in app_finder:
+ packager.add(p, f)
+ packager.close()
+
+ # Transplant jar preloading information.
+ for path, log in six.iteritems(app1_finder.jarlogs):
+ assert isinstance(copier[path], Jarrer)
+ copier[path].preload(log)
+
+ copier.copy(options.app1, skip_if_older=False)
+
+
+if __name__ == "__main__":
+ main()