diff options
Diffstat (limited to 'toolkit/mozapps/installer/unify.py')
-rw-r--r-- | toolkit/mozapps/installer/unify.py | 111 |
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() |