Browse Source

Fixes for cross compiled OSX locale packing

Ian Neal 5 years ago
parent
commit
491d9ce47c

+ 195 - 0
rel-esr52/mozilla/patches/bug1185666.diff

@@ -0,0 +1,195 @@
+
+# HG changeset patch
+# User Justin Wood <Callek@gmail.com>
+# Date 1490751979 14400
+# Node ID 7c5c1555236c33817493d7fee8fa16bebfca81e6
+# Parent  88be343ee6f5394637f4d673904c9dd2998009ad
+Bug 1185666 - Move DMG unpack logic to a python script, support linux. r=mshal
+
+MozReview-Commit-ID: inKT2BWof4
+
+diff --git a/python/mozbuild/mozbuild/action/unpack_dmg.py b/python/mozbuild/mozbuild/action/unpack_dmg.py
+new file mode 100644
+--- /dev/null
++++ b/python/mozbuild/mozbuild/action/unpack_dmg.py
+@@ -0,0 +1,35 @@
++# 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/.
++
++from __future__ import print_function
++
++from mozpack import dmg
++
++import argparse
++import sys
++
++
++def main(args):
++    parser = argparse.ArgumentParser(
++        description='Explode a DMG into its relevant files')
++
++    parser.add_argument('--dsstore', help='DSStore file from')
++    parser.add_argument('--background', help='Background file from')
++    parser.add_argument('--icon', help='Icon file from')
++
++    parser.add_argument('dmgfile', metavar='DMG_IN',
++                        help='DMG File to Unpack')
++    parser.add_argument('outpath', metavar='PATH_OUT',
++                        help='Location to put unpacked files')
++
++    options = parser.parse_args(args)
++
++    dmg.extract_dmg(dmgfile=options.dmgfile, output=options.outpath,
++                    dsstore=options.dsstore, background=options.background,
++                    icon=options.icon)
++    return 0
++
++
++if __name__ == '__main__':
++    sys.exit(main(sys.argv[1:]))
+diff --git a/python/mozbuild/mozpack/dmg.py b/python/mozbuild/mozpack/dmg.py
+--- a/python/mozbuild/mozpack/dmg.py
++++ b/python/mozbuild/mozpack/dmg.py
+@@ -4,16 +4,17 @@
+ 
+ import buildconfig
+ import errno
+ import mozfile
+ import os
+ import platform
+ import shutil
+ import subprocess
++import sys
+ 
+ from mozbuild.util import ensureParentDir
+ 
+ is_linux = platform.system() == 'Linux'
+ 
+ 
+ def mkdir(dir):
+     if not os.path.isdir(dir):
+@@ -26,18 +27,18 @@ def mkdir(dir):
+ 
+ def chmod(dir):
+     'Set permissions of DMG contents correctly'
+     subprocess.check_call(['chmod', '-R', 'a+rX,a-st,u+w,go-w', dir])
+ 
+ 
+ def rsync(source, dest):
+     'rsync the contents of directory source into directory dest'
+-    # Ensure a trailing slash so rsync copies the *contents* of source.
+-    if not source.endswith('/'):
++    # Ensure a trailing slash on directories so rsync copies the *contents* of source.
++    if not source.endswith('/') and os.path.isdir(source):
+         source += '/'
+     subprocess.check_call(['rsync', '-a', '--copy-unsafe-links',
+                            source, dest])
+ 
+ 
+ def set_folder_icon(dir, tmpdir):
+     'Set HFS attributes of dir to use a custom icon'
+     if not is_linux:
+@@ -151,8 +152,58 @@ def create_dmg(source_directory, output_
+             mkdir(os.path.dirname(full_target))
+             shutil.copyfile(source, full_target)
+         generate_hfs_file(stagedir, tmpdir, volume_name)
+         create_app_symlink(stagedir, tmpdir)
+         # Set the folder attributes to use a custom icon
+         set_folder_icon(stagedir, tmpdir)
+         chmod(stagedir)
+         create_dmg_from_staged(stagedir, output_dmg, tmpdir, volume_name)
++
++
++def extract_dmg_contents(dmgfile, destdir):
++    import buildconfig
++    if is_linux:
++        with mozfile.TemporaryDirectory() as tmpdir:
++            hfs_file = os.path.join(tmpdir, 'firefox.hfs')
++            subprocess.check_call([
++                    buildconfig.substs['DMG_TOOL'],
++                    'extract',
++                    dmgfile,
++                    hfs_file
++                ],
++                # dmg is seriously chatty
++                stdout=open(os.devnull, 'wb'))
++            subprocess.check_call([
++                buildconfig.substs['HFS_TOOL'], hfs_file, 'extractall', '/', destdir])
++    else:
++        unpack_diskimage = os.path.join(buildconfig.topsrcdir, 'build', 'package',
++                                        'mac_osx', 'unpack-diskimage')
++        unpack_mountpoint = os.path.join(
++            '/tmp', '{}-unpack'.format(buildconfig.substs['MOZ_APP_NAME']))
++        subprocess.check_call([unpack_diskimage, dmgfile, unpack_mountpoint,
++                               destdir])
++
++
++def extract_dmg(dmgfile, output, dsstore=None, icon=None, background=None):
++    if platform.system() not in ('Darwin', 'Linux'):
++        raise Exception("Don't know how to extract a DMG on '%s'" % platform.system())
++
++    if is_linux:
++        check_tools('DMG_TOOL', 'MKFSHFS', 'HFS_TOOL')
++
++    with mozfile.TemporaryDirectory() as tmpdir:
++        extract_dmg_contents(dmgfile, tmpdir)
++        if os.path.islink(os.path.join(tmpdir, ' ')):
++            # Rsync will fail on the presence of this symlink
++            os.remove(os.path.join(tmpdir, ' '))
++        rsync(tmpdir, output)
++
++        if dsstore:
++            mkdir(os.path.dirname(dsstore))
++            rsync(os.path.join(tmpdir, '.DS_Store'), dsstore)
++        if background:
++            mkdir(os.path.dirname(background))
++            rsync(os.path.join(tmpdir, '.background', os.path.basename(background)),
++                  background)
++        if icon:
++            mkdir(os.path.dirname(icon))
++            rsync(os.path.join(tmpdir, '.VolumeIcon.icns'), icon)
+diff --git a/toolkit/mozapps/installer/upload-files.mk b/toolkit/mozapps/installer/upload-files.mk
+--- a/toolkit/mozapps/installer/upload-files.mk
++++ b/toolkit/mozapps/installer/upload-files.mk
+@@ -216,34 +216,22 @@ endif
+ 
+ ifeq ($(MOZ_PKG_FORMAT),DMG)
+   PKG_SUFFIX	= .dmg
+ 
+   _ABS_MOZSRCDIR = $(shell cd $(MOZILLA_DIR) && pwd)
+   PKG_DMG_SOURCE = $(STAGEPATH)$(MOZ_PKG_DIR)
+   INNER_MAKE_PACKAGE	= $(call py_action,make_dmg,'$(PKG_DMG_SOURCE)' '$(PACKAGE)')
+   INNER_UNMAKE_PACKAGE	= \
+-    set -ex; \
+-    rm -rf $(ABS_DIST)/unpack.tmp; \
+-    mkdir -p $(ABS_DIST)/unpack.tmp; \
+-    $(_ABS_MOZSRCDIR)/build/package/mac_osx/unpack-diskimage $(UNPACKAGE) /tmp/$(MOZ_PKG_APPNAME)-unpack $(ABS_DIST)/unpack.tmp; \
+-    rsync -a '$(ABS_DIST)/unpack.tmp/$(_APPNAME)' $(MOZ_PKG_DIR); \
+-    test -n '$(MOZ_PKG_MAC_DSSTORE)' && \
+-      rsync -a '$(ABS_DIST)/unpack.tmp/.DS_Store' '$(MOZ_PKG_MAC_DSSTORE)'; \
+-    test -n '$(MOZ_PKG_MAC_BACKGROUND)' && \
+-      rsync -a '$(ABS_DIST)/unpack.tmp/.background/$(notdir $(MOZ_PKG_MAC_BACKGROUND))' '$(MOZ_PKG_MAC_BACKGROUND)'; \
+-    test -n '$(MOZ_PKG_MAC_ICON)' && \
+-      rsync -a '$(ABS_DIST)/unpack.tmp/.VolumeIcon.icns' '$(MOZ_PKG_MAC_ICON)'; \
+-    rm -rf $(ABS_DIST)/unpack.tmp; \
+-    if test -n '$(MOZ_PKG_MAC_RSRC)' ; then \
+-      cp $(UNPACKAGE) $(MOZ_PKG_APPNAME).tmp.dmg && \
+-      hdiutil unflatten $(MOZ_PKG_APPNAME).tmp.dmg && \
+-      { /Developer/Tools/DeRez -skip plst -skip blkx $(MOZ_PKG_APPNAME).tmp.dmg > '$(MOZ_PKG_MAC_RSRC)' || { rm -f $(MOZ_PKG_APPNAME).tmp.dmg && false; }; } && \
+-      rm -f $(MOZ_PKG_APPNAME).tmp.dmg; \
+-    fi
++    $(call py_action,unpack_dmg, \
++        $(if $(MOZ_PKG_MAC_DSSTORE),--dsstore '$(MOZ_PKG_MAC_DSSTORE)') \
++        $(if $(MOZ_PKG_MAC_BACKGROUND),--background '$(MOZ_PKG_MAC_BACKGROUND)') \
++        $(if $(MOZ_PKG_MAC_ICON),--icon '$(MOZ_PKG_MAC_ICON)') \
++        '$(UNPACKAGE)' '$(MOZ_PKG_DIR)' \
++        )
+ endif
+ 
+ ifdef MOZ_INTERNAL_SIGNING_FORMAT
+   MOZ_SIGN_PREPARED_PACKAGE_CMD=$(MOZ_SIGN_CMD) $(foreach f,$(MOZ_INTERNAL_SIGNING_FORMAT),-f $(f)) $(foreach i,$(SIGN_INCLUDES),-i $(i)) $(foreach x,$(SIGN_EXCLUDES),-x $(x))
+   ifeq (WINNT,$(OS_ARCH))
+     MOZ_SIGN_PREPARED_PACKAGE_CMD += --nsscmd '$(ABS_DIST)/bin/shlibsign$(BIN_SUFFIX) -v -i'
+   endif
+ endif

+ 361 - 0
rel-esr52/mozilla/patches/bug1333826.diff

@@ -0,0 +1,361 @@
+
+# HG changeset patch
+# User Benjamin Smedberg <benjamin@smedbergs.us>
+# Date 1485365839 18000
+# Node ID 0105896f2a2235b96f1248bc79bcd2f34edc0f67
+# Parent  1308cf4a1817977f3efb71c1f35b278dc12a7e70
+Bug 1333826 - Remove the make-sdk build target, the INSTALL_SDK variable, and all the supporting packager/upload machinery, r=mshal a=gchang
+
+MozReview-Commit-ID: AdSSrTWuDcc
+
+diff --git a/browser/build.mk b/browser/build.mk
+--- a/browser/build.mk
++++ b/browser/build.mk
+@@ -9,19 +9,16 @@ package:
+ 	@$(MAKE) -C browser/installer
+ 
+ package-compare:
+ 	@$(MAKE) -C browser/installer package-compare
+ 
+ stage-package:
+ 	@$(MAKE) -C browser/installer stage-package
+ 
+-sdk:
+-	@$(MAKE) -C browser/installer make-sdk
+-
+ install::
+ 	@$(MAKE) -C browser/installer install
+ 
+ clean::
+ 	@$(MAKE) -C browser/installer clean
+ 
+ distclean::
+ 	@$(MAKE) -C browser/installer distclean
+diff --git a/browser/installer/Makefile.in b/browser/installer/Makefile.in
+--- a/browser/installer/Makefile.in
++++ b/browser/installer/Makefile.in
+@@ -94,18 +94,16 @@ endif
+ 
+ ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT))
+ MOZ_PKG_MAC_DSSTORE=branding/dsstore
+ MOZ_PKG_MAC_BACKGROUND=branding/background.png
+ MOZ_PKG_MAC_ICON=branding/disk.icns
+ MOZ_PKG_MAC_EXTRA=--symlink '/Applications:/ '
+ endif
+ 
+-INSTALL_SDK = 1
+-
+ include $(topsrcdir)/toolkit/mozapps/installer/signing.mk
+ include $(topsrcdir)/toolkit/mozapps/installer/packager.mk
+ 
+ ifeq (bundle, $(MOZ_FS_LAYOUT))
+ BINPATH = $(_BINPATH)
+ DEFINES += -DAPPNAME=$(_APPNAME)
+ else
+ # Every other platform just winds up in dist/bin
+diff --git a/toolkit/mozapps/installer/packager.mk b/toolkit/mozapps/installer/packager.mk
+--- a/toolkit/mozapps/installer/packager.mk
++++ b/toolkit/mozapps/installer/packager.mk
+@@ -116,99 +116,29 @@ make-buildinfo-file:
+ 		MOZ_PKG_PLATFORM=$(MOZ_PKG_PLATFORM)
+ 	echo "buildID=$(BUILDID)" > $(MOZ_BUILDID_INFO_TXT_FILE)
+ 
+ .PHONY: make-mozinfo-file
+ make-mozinfo-file:
+ 	cp $(DEPTH)/mozinfo.json $(MOZ_MOZINFO_FILE)
+ 
+ # The install target will install the application to prefix/lib/appname-version
+-# In addition if INSTALL_SDK is set, it will install the development headers,
+-# libraries, and IDL files as follows:
+-# dist/include -> prefix/include/appname-version
+-# dist/idl -> prefix/share/idl/appname-version
+-# dist/sdk/lib -> prefix/lib/appname-devel-version/lib
+-# prefix/lib/appname-devel-version/* symlinks to the above directories
+ install:: prepare-package
+ ifeq ($(OS_ARCH),WINNT)
+ 	$(error "make install" is not supported on this platform. Use "make package" instead.)
+ endif
+ ifeq (bundle,$(MOZ_FS_LAYOUT))
+ 	$(error "make install" is not supported on this platform. Use "make package" instead.)
+ endif
+ 	$(NSINSTALL) -D $(DESTDIR)$(installdir)
+ 	(cd $(DIST)/$(MOZ_PKG_DIR) && $(TAR) --exclude=precomplete $(TAR_CREATE_FLAGS) - .) | \
+ 	  (cd $(DESTDIR)$(installdir) && tar -xf -)
+ 	$(NSINSTALL) -D $(DESTDIR)$(bindir)
+ 	$(RM) -f $(DESTDIR)$(bindir)/$(MOZ_APP_NAME)
+ 	ln -s $(installdir)/$(MOZ_APP_NAME) $(DESTDIR)$(bindir)
+-ifdef INSTALL_SDK # Here comes the hard part
+-	$(NSINSTALL) -D $(DESTDIR)$(includedir)
+-	(cd $(DIST)/include && $(TAR) $(TAR_CREATE_FLAGS) - .) | \
+-	  (cd $(DESTDIR)$(includedir) && tar -xf -)
+-	$(NSINSTALL) -D $(DESTDIR)$(idldir)
+-	(cd $(DIST)/idl && $(TAR) $(TAR_CREATE_FLAGS) - .) | \
+-	  (cd $(DESTDIR)$(idldir) && tar -xf -)
+-# SDK directory is the libs + a bunch of symlinks
+-	$(NSINSTALL) -D $(DESTDIR)$(sdkdir)/sdk/lib
+-	$(NSINSTALL) -D $(DESTDIR)$(sdkdir)/sdk/bin
+-	if test -f $(DIST)/include/xpcom-config.h; then \
+-	  $(SYSINSTALL) $(IFLAGS1) $(DIST)/include/xpcom-config.h $(DESTDIR)$(sdkdir); \
+-	fi
+-	find $(DIST)/sdk -name '*.pyc' | xargs rm -f
+-	(cd $(DIST)/sdk/lib && $(TAR) $(TAR_CREATE_FLAGS) - .) | (cd $(DESTDIR)$(sdkdir)/sdk/lib && tar -xf -)
+-	(cd $(DIST)/sdk/bin && $(TAR) $(TAR_CREATE_FLAGS) - .) | (cd $(DESTDIR)$(sdkdir)/sdk/bin && tar -xf -)
+-	$(RM) -f $(DESTDIR)$(sdkdir)/lib $(DESTDIR)$(sdkdir)/bin $(DESTDIR)$(sdkdir)/include $(DESTDIR)$(sdkdir)/include $(DESTDIR)$(sdkdir)/sdk/idl $(DESTDIR)$(sdkdir)/idl
+-	ln -s $(sdkdir)/sdk/lib $(DESTDIR)$(sdkdir)/lib
+-	ln -s $(installdir) $(DESTDIR)$(sdkdir)/bin
+-	ln -s $(includedir) $(DESTDIR)$(sdkdir)/include
+-	ln -s $(idldir) $(DESTDIR)$(sdkdir)/idl
+-endif # INSTALL_SDK
+-
+-make-sdk:
+-ifndef SDK_UNIFY
+-	$(MAKE) stage-package UNIVERSAL_BINARY= STAGE_SDK=1 MOZ_PKG_DIR=sdk-stage
+-endif
+-	@echo 'Packaging SDK...'
+-	$(RM) -rf $(DIST)/$(MOZ_APP_NAME)-sdk
+-	$(NSINSTALL) -D $(DIST)/$(MOZ_APP_NAME)-sdk/bin
+-ifdef SDK_UNIFY
+-	(cd $(UNIFY_DIST)/sdk-stage && $(TAR) $(TAR_CREATE_FLAGS) - .) | \
+-	  (cd $(DIST)/$(MOZ_APP_NAME)-sdk/bin && tar -xf -)
+-else
+-	(cd $(DIST)/sdk-stage && $(TAR) $(TAR_CREATE_FLAGS) - .) | \
+-	  (cd $(DIST)/$(MOZ_APP_NAME)-sdk/bin && tar -xf -)
+-endif
+-	$(NSINSTALL) -D $(DIST)/$(MOZ_APP_NAME)-sdk/host/bin
+-	(cd $(DIST)/host/bin && $(TAR) $(TAR_CREATE_FLAGS) - .) | \
+-	  (cd $(DIST)/$(MOZ_APP_NAME)-sdk/host/bin && tar -xf -)
+-	$(NSINSTALL) -D $(DIST)/$(MOZ_APP_NAME)-sdk/sdk
+-	find $(DIST)/sdk -name '*.pyc' | xargs rm -f
+-	(cd $(DIST)/sdk && $(TAR) $(TAR_CREATE_FLAGS) - .) | \
+-	  (cd $(DIST)/$(MOZ_APP_NAME)-sdk/sdk && tar -xf -)
+-	$(NSINSTALL) -D $(DIST)/$(MOZ_APP_NAME)-sdk/include
+-	(cd $(DIST)/include && $(TAR) $(TAR_CREATE_FLAGS) - .) | \
+-	  (cd $(DIST)/$(MOZ_APP_NAME)-sdk/include && tar -xf -)
+-	$(NSINSTALL) -D $(DIST)/$(MOZ_APP_NAME)-sdk/idl
+-	(cd $(DIST)/idl && $(TAR) $(TAR_CREATE_FLAGS) - .) | \
+-	  (cd $(DIST)/$(MOZ_APP_NAME)-sdk/idl && tar -xf -)
+-	$(NSINSTALL) -D $(DIST)/$(MOZ_APP_NAME)-sdk/lib
+-# sdk/lib is the same as sdk/sdk/lib
+-	(cd $(DIST)/sdk/lib && $(TAR) $(TAR_CREATE_FLAGS) - .) | \
+-	  (cd $(DIST)/$(MOZ_APP_NAME)-sdk/lib && tar -xf -)
+-	$(NSINSTALL) -D $(DIST)/$(SDK_PATH)
+-ifndef PKG_SKIP_STRIP
+-	USE_ELF_HACK= $(PYTHON) $(MOZILLA_DIR)/toolkit/mozapps/installer/strip.py $(DIST)/$(MOZ_APP_NAME)-sdk
+-endif
+-	cd $(DIST) && $(MAKE_SDK)
+-ifdef UNIFY_DIST
+-ifndef SDK_UNIFY
+-	$(MAKE) -C $(UNIFY_DIST)/.. sdk SDK_UNIFY=1
+-endif
+-endif
+ 
+ checksum:
+ 	mkdir -p `dirname $(CHECKSUM_FILE)`
+ 	@$(PYTHON) $(MOZILLA_DIR)/build/checksums.py \
+ 		-o $(CHECKSUM_FILE) \
+ 		$(CHECKSUM_ALGORITHM_PARAM) \
+ 		-s $(call QUOTED_WILDCARD,$(DIST)) \
+ 		$(UPLOAD_FILES)
+diff --git a/toolkit/mozapps/installer/upload-files.mk b/toolkit/mozapps/installer/upload-files.mk
+--- a/toolkit/mozapps/installer/upload-files.mk
++++ b/toolkit/mozapps/installer/upload-files.mk
+@@ -44,24 +44,16 @@ endif
+ ifdef UNIVERSAL_BINARY
+ STAGEPATH = universal/
+ endif
+ endif
+ 
+ PACKAGE_BASE_DIR = $(ABS_DIST)
+ PACKAGE       = $(PKG_PATH)$(PKG_BASENAME)$(PKG_SUFFIX)
+ 
+-# By default, the SDK uses the same packaging type as the main bundle,
+-# but on mac it is a .tar.bz2
+-SDK_SUFFIX    = $(PKG_SUFFIX)
+-SDK           = $(SDK_PATH)$(PKG_BASENAME).sdk$(SDK_SUFFIX)
+-ifdef UNIVERSAL_BINARY
+-SDK           = $(SDK_PATH)$(PKG_BASENAME)-$(TARGET_CPU).sdk$(SDK_SUFFIX)
+-endif
+-
+ # JavaScript Shell packaging
+ JSSHELL_BINS  = \
+   js$(BIN_SUFFIX) \
+   $(DLL_PREFIX)mozglue$(DLL_SUFFIX) \
+   $(NULL)
+ 
+ ifndef MOZ_SYSTEM_NSPR
+   ifdef MOZ_FOLD_LIBS
+@@ -96,47 +88,43 @@ TAR_CREATE_FLAGS := --exclude=.mkdir.don
+ CREATE_FINAL_TAR = $(TAR) -c --owner=0 --group=0 --numeric-owner \
+   --mode=go-w --exclude=.mkdir.done -f
+ UNPACK_TAR       = tar -xf-
+ 
+ ifeq ($(MOZ_PKG_FORMAT),TAR)
+   PKG_SUFFIX	= .tar
+   INNER_MAKE_PACKAGE 	= $(CREATE_FINAL_TAR) - $(MOZ_PKG_DIR) > $(PACKAGE)
+   INNER_UNMAKE_PACKAGE	= $(UNPACK_TAR) < $(UNPACKAGE)
+-  MAKE_SDK = $(CREATE_FINAL_TAR) - $(MOZ_APP_NAME)-sdk > '$(SDK)'
+ endif
+ 
+ ifeq ($(MOZ_PKG_FORMAT),TGZ)
+   PKG_SUFFIX	= .tar.gz
+   INNER_MAKE_PACKAGE 	= $(CREATE_FINAL_TAR) - $(MOZ_PKG_DIR) | gzip -vf9 > $(PACKAGE)
+   INNER_UNMAKE_PACKAGE	= gunzip -c $(UNPACKAGE) | $(UNPACK_TAR)
+-  MAKE_SDK = $(CREATE_FINAL_TAR) - $(MOZ_APP_NAME)-sdk | gzip -vf9 > '$(SDK)'
+ endif
+ 
+ ifeq ($(MOZ_PKG_FORMAT),BZ2)
+   PKG_SUFFIX	= .tar.bz2
+   ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT))
+     INNER_MAKE_PACKAGE 	= $(CREATE_FINAL_TAR) - -C $(STAGEPATH)$(MOZ_PKG_DIR) $(_APPNAME) | bzip2 -vf > $(PACKAGE)
+   else
+     INNER_MAKE_PACKAGE 	= $(CREATE_FINAL_TAR) - $(MOZ_PKG_DIR) | bzip2 -vf > $(PACKAGE)
+   endif
+   INNER_UNMAKE_PACKAGE	= bunzip2 -c $(UNPACKAGE) | $(UNPACK_TAR)
+-  MAKE_SDK = $(CREATE_FINAL_TAR) - $(MOZ_APP_NAME)-sdk | bzip2 -vf > '$(SDK)'
+ endif
+ 
+ ifeq ($(MOZ_PKG_FORMAT),ZIP)
+   ifdef MOZ_EXTERNAL_SIGNING_FORMAT
+     # We can't use sha2signcode on zip files
+     MOZ_EXTERNAL_SIGNING_FORMAT := $(filter-out sha2signcode,$(MOZ_EXTERNAL_SIGNING_FORMAT))
+   endif
+   PKG_SUFFIX	= .zip
+   INNER_MAKE_PACKAGE	= $(ZIP) -r9D $(PACKAGE) $(MOZ_PKG_DIR) \
+     -x \*/.mkdir.done
+   INNER_UNMAKE_PACKAGE	= $(UNZIP) $(UNPACKAGE)
+-  MAKE_SDK = $(call py_action,zip,'$(SDK)' $(MOZ_APP_NAME)-sdk)
+ endif
+ 
+ ifeq ($(MOZ_PKG_FORMAT),SFX7Z)
+   PKG_SUFFIX	= .exe
+   INNER_MAKE_PACKAGE	= rm -f app.7z && \
+     mv $(MOZ_PKG_DIR) core && \
+     $(CYGWIN_WRAPPER) 7z a -r -t7z app.7z -mx -m0=BCJ2 -m1=LZMA:d25 \
+       -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1 -mb0s1:2 -mb0s2:3 && \
+@@ -197,43 +185,29 @@ ifeq ($(MOZ_PKG_FORMAT),RPM)
+     --define '_installdir $(installdir)'
+ 
+   ifdef ENABLE_TESTS
+     RPM_CMD += \
+       --define 'createtests yes' \
+       --define '_testsinstalldir $(shell basename $(installdir))'
+   endif
+ 
+-  ifdef INSTALL_SDK
+-    RPM_CMD += \
+-      --define 'createdevel yes' \
+-      --define '_idldir $(idldir)' \
+-      --define '_sdkdir $(sdkdir)' \
+-      --define '_includedir $(includedir)'
+-  endif
+-
+-  #For each of the main, tests, sdk rpms we want to make sure that
++  #For each of the main/tests rpms we want to make sure that
+   #if they exist that they are in objdir/dist/ and that they get
+   #uploaded and that they are beside the other build artifacts
+   MAIN_RPM= $(MOZ_APP_NAME)-$(MOZ_NUMERIC_APP_VERSION)-$(MOZ_RPM_RELEASE).$(BUILDID).$(TARGET_CPU)$(PKG_SUFFIX)
+   UPLOAD_EXTRA_FILES += $(MAIN_RPM)
+   RPM_CMD += && mv $(TARGET_CPU)/$(MAIN_RPM) $(ABS_DIST)/
+ 
+   ifdef ENABLE_TESTS
+     TESTS_RPM=$(MOZ_APP_NAME)-tests-$(MOZ_NUMERIC_APP_VERSION)-$(MOZ_RPM_RELEASE).$(BUILDID).$(TARGET_CPU)$(PKG_SUFFIX)
+     UPLOAD_EXTRA_FILES += $(TESTS_RPM)
+     RPM_CMD += && mv $(TARGET_CPU)/$(TESTS_RPM) $(ABS_DIST)/
+   endif
+ 
+-  ifdef INSTALL_SDK
+-    SDK_RPM=$(MOZ_APP_NAME)-devel-$(MOZ_NUMERIC_APP_VERSION)-$(MOZ_RPM_RELEASE).$(BUILDID).$(TARGET_CPU)$(PKG_SUFFIX)
+-    UPLOAD_EXTRA_FILES += $(SDK_RPM)
+-    RPM_CMD += && mv $(TARGET_CPU)/$(SDK_RPM) $(ABS_DIST)/
+-  endif
+-
+   INNER_MAKE_PACKAGE = $(RPM_CMD)
+   #Avoiding rpm repacks, going to try creating/uploading xpi in rpm files instead
+   INNER_UNMAKE_PACKAGE = $(error Try using rpm2cpio and cpio)
+ 
+ endif #Create an RPM file
+ 
+ 
+ ifeq ($(MOZ_PKG_FORMAT),APK)
+@@ -260,20 +234,16 @@ ifeq ($(MOZ_PKG_FORMAT),DMG)
+       rsync -a '$(ABS_DIST)/unpack.tmp/.VolumeIcon.icns' '$(MOZ_PKG_MAC_ICON)'; \
+     rm -rf $(ABS_DIST)/unpack.tmp; \
+     if test -n '$(MOZ_PKG_MAC_RSRC)' ; then \
+       cp $(UNPACKAGE) $(MOZ_PKG_APPNAME).tmp.dmg && \
+       hdiutil unflatten $(MOZ_PKG_APPNAME).tmp.dmg && \
+       { /Developer/Tools/DeRez -skip plst -skip blkx $(MOZ_PKG_APPNAME).tmp.dmg > '$(MOZ_PKG_MAC_RSRC)' || { rm -f $(MOZ_PKG_APPNAME).tmp.dmg && false; }; } && \
+       rm -f $(MOZ_PKG_APPNAME).tmp.dmg; \
+     fi
+-  # The plst and blkx resources are skipped because they belong to each
+-  # individual dmg and are created by hdiutil.
+-  SDK_SUFFIX = .tar.bz2
+-  MAKE_SDK = $(CREATE_FINAL_TAR) - $(MOZ_APP_NAME)-sdk | bzip2 -vf > '$(SDK)'
+ endif
+ 
+ ifdef MOZ_INTERNAL_SIGNING_FORMAT
+   MOZ_SIGN_PREPARED_PACKAGE_CMD=$(MOZ_SIGN_CMD) $(foreach f,$(MOZ_INTERNAL_SIGNING_FORMAT),-f $(f)) $(foreach i,$(SIGN_INCLUDES),-i $(i)) $(foreach x,$(SIGN_EXCLUDES),-x $(x))
+   ifeq (WINNT,$(OS_ARCH))
+     MOZ_SIGN_PREPARED_PACKAGE_CMD += --nsscmd '$(ABS_DIST)/bin/shlibsign$(BIN_SUFFIX) -v -i'
+   endif
+ endif
+@@ -299,20 +269,16 @@ ifdef MOZ_SIGN_PREPARED_PACKAGE_CMD
+ else
+   MAKE_PACKAGE    = (cd $(STAGEPATH)$(MOZ_PKG_DIR)$(_RESPATH) && $(CREATE_PRECOMPLETE_CMD)) && $(INNER_MAKE_PACKAGE)
+ endif
+ 
+ ifdef MOZ_SIGN_PACKAGE_CMD
+   MAKE_PACKAGE    += && $(MOZ_SIGN_PACKAGE_CMD) '$(PACKAGE)'
+ endif
+ 
+-ifdef MOZ_SIGN_CMD
+-  MAKE_SDK           += && $(MOZ_SIGN_CMD) -f gpg '$(SDK)'
+-endif
+-
+ NO_PKG_FILES += \
+ 	core \
+ 	bsdecho \
+ 	js \
+ 	js-config \
+ 	jscpucfg \
+ 	nsinstall \
+ 	viewer \
+@@ -449,39 +415,30 @@ UPLOAD_FILES= \
+   $(call QUOTED_WILDCARD,$(DIST)/$(PKG_PATH)$(CPP_TEST_PACKAGE)) \
+   $(call QUOTED_WILDCARD,$(DIST)/$(PKG_PATH)$(XPC_TEST_PACKAGE)) \
+   $(call QUOTED_WILDCARD,$(DIST)/$(PKG_PATH)$(MOCHITEST_PACKAGE)) \
+   $(call QUOTED_WILDCARD,$(DIST)/$(PKG_PATH)$(TALOS_PACKAGE)) \
+   $(call QUOTED_WILDCARD,$(DIST)/$(PKG_PATH)$(REFTEST_PACKAGE)) \
+   $(call QUOTED_WILDCARD,$(DIST)/$(PKG_PATH)$(WP_TEST_PACKAGE)) \
+   $(call QUOTED_WILDCARD,$(DIST)/$(PKG_PATH)$(GTEST_PACKAGE)) \
+   $(call QUOTED_WILDCARD,$(DIST)/$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip) \
+-  $(call QUOTED_WILDCARD,$(DIST)/$(SDK)) \
+-  $(call QUOTED_WILDCARD,$(DIST)/$(SDK).asc) \
+   $(call QUOTED_WILDCARD,$(MOZ_SOURCESTAMP_FILE)) \
+   $(call QUOTED_WILDCARD,$(MOZ_BUILDINFO_FILE)) \
+   $(call QUOTED_WILDCARD,$(MOZ_BUILDID_INFO_TXT_FILE)) \
+   $(call QUOTED_WILDCARD,$(MOZ_MOZINFO_FILE)) \
+   $(call QUOTED_WILDCARD,$(MOZ_TEST_PACKAGES_FILE)) \
+   $(call QUOTED_WILDCARD,$(PKG_JSSHELL)) \
+   $(call QUOTED_WILDCARD,$(DIST)/$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip) \
+   $(if $(UPLOAD_EXTRA_FILES), $(foreach f, $(UPLOAD_EXTRA_FILES), $(wildcard $(DIST)/$(f))))
+ 
+ ifdef MOZ_CODE_COVERAGE
+   UPLOAD_FILES += \
+     $(call QUOTED_WILDCARD,$(DIST)/$(PKG_PATH)$(CODE_COVERAGE_ARCHIVE_BASENAME).zip)
+ endif
+ 
+-ifdef UNIFY_DIST
+-  UNIFY_ARCH := $(notdir $(patsubst %/,%,$(dir $(UNIFY_DIST))))
+-  UPLOAD_FILES += \
+-    $(call QUOTED_WILDCARD,$(UNIFY_DIST)/$(SDK_PATH)$(PKG_BASENAME)-$(UNIFY_ARCH).sdk$(SDK_SUFFIX)) \
+-    $(call QUOTED_WILDCARD,$(UNIFY_DIST)/$(SDK_PATH)$(PKG_BASENAME)-$(UNIFY_ARCH).sdk$(SDK_SUFFIX).asc)
+-endif
+-
+ SIGN_CHECKSUM_CMD=
+ ifdef MOZ_SIGN_CMD
+   # If we're signing with gpg, we'll have a bunch of extra detached signatures to
+   # upload. We also want to sign our checksums file
+   SIGN_CHECKSUM_CMD=$(MOZ_SIGN_CMD) -f gpg $(CHECKSUM_FILE)
+ 
+   CHECKSUM_FILES += $(CHECKSUM_FILE).asc
+   UPLOAD_FILES += $(call QUOTED_WILDCARD,$(DIST)/$(COMPLETE_MAR).asc)

+ 162 - 0
rel-esr52/mozilla/patches/bug1347576.diff

@@ -0,0 +1,162 @@
+
+# HG changeset patch
+# User Mike Shal <mshal@mozilla.com>
+# Date 1489188983 18000
+# Node ID 7049cb5450d89c1862c456495b1c7f78af3a6d46
+# Parent  1b625acb0fbd8306c37115e7d138db996e975716
+Bug 1347576 - Add a 'mach repackage' command, with OSX dmg support; r=chmanchester
+
+This is the initial support of 'mach repackage', which can take an
+existing tarball and create a DMG on either an OSX host or on a Linux
+host with cross-OSX tools. Configure is needed in order to find the
+tools necessary to create the DMG. On a Linux cross-compiled environment
+with tooltool, this can be as simple as:
+
+export MKFSHFS=$topsrcdir/hfsplus-tools/newfs_hfs
+export DMG_TOOL=$topsrcdir/dmg/dmg
+export HFS_TOOL=$topsrcdir/dmg/hfsplus
+ac_add_options --disable-compile-environment
+
+MozReview-Commit-ID: 6t2rlXpwUvu
+
+diff --git a/python/mozbuild/mozbuild/mach_commands.py b/python/mozbuild/mozbuild/mach_commands.py
+--- a/python/mozbuild/mozbuild/mach_commands.py
++++ b/python/mozbuild/mozbuild/mach_commands.py
+@@ -1596,8 +1596,40 @@ class Vendor(MachCommandBase):
+                 description='Vendor rust crates from crates.io into third_party/rust')
+     @CommandArgument('--ignore-modified', action='store_true',
+         help='Ignore modified files in current checkout',
+         default=False)
+     def vendor_rust(self, **kwargs):
+         from mozbuild.vendor_rust import VendorRust
+         vendor_command = self._spawn(VendorRust)
+         vendor_command.vendor(**kwargs)
++
++@CommandProvider
++class Repackage(MachCommandBase):
++    '''Repackages artifacts into different formats.
++
++    This is generally used after packages are signed by the signing
++    scriptworkers in order to bundle things up into shippable formats, such as a
++    .dmg on OSX or an installer exe on Windows.
++    '''
++    @Command('repackage', category='misc',
++             description='Repackage artifacts into different formats.')
++    @CommandArgument('--input', '-i', type=str, required=True,
++        help='Input filename')
++    @CommandArgument('--output', '-o', type=str, required=True,
++        help='Output filename')
++    def repackage(self, input, output):
++        if not os.path.exists(input):
++            print('Input file does not exist: %s' % input)
++            return 1
++
++        if not os.path.exists(os.path.join(self.topobjdir, 'config.status')):
++            print('config.status not found.  Please run |mach configure| '
++                  'prior to |mach repackage|.')
++            return 1
++
++        if output.endswith('.dmg'):
++            from mozbuild.repackage import repackage_dmg
++            repackage_dmg(input, output)
++        else:
++            print("Repackaging into output '%s' is not yet supported." % output)
++            return 1
++        return 0
+diff --git a/python/mozbuild/mozbuild/repackage.py b/python/mozbuild/mozbuild/repackage.py
+new file mode 100644
+--- /dev/null
++++ b/python/mozbuild/mozbuild/repackage.py
+@@ -0,0 +1,49 @@
++# 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 os
++import tempfile
++import tarfile
++import shutil
++import ConfigParser
++import mozpack.path as mozpath
++from mozpack.dmg import create_dmg
++
++def repackage_dmg(infile, output):
++
++    if not tarfile.is_tarfile(infile):
++        raise Exception("Input file %s is not a valid tarfile." % infile)
++
++    tmpdir = tempfile.mkdtemp()
++    try:
++        with tarfile.open(infile) as tar:
++            tar.extractall(path=tmpdir)
++
++        # Remove the /Applications symlink. If we don't, an rsync command in
++        # create_dmg() will break, and create_dmg() re-creates the symlink anyway.
++        try:
++            os.remove(mozpath.join(tmpdir, ' '))
++        except OSError as e:
++            if e.errno != errno.ENOENT:
++                raise
++
++        # Grab the volume name
++        volume_name = None
++        for root, dirs, files in os.walk(tmpdir):
++            if 'application.ini' in files:
++                parser = ConfigParser.ConfigParser()
++                parser.read(mozpath.join(root, 'application.ini'))
++                volume_name = parser.get('App', 'CodeName')
++                break
++
++        if volume_name is None:
++            raise Exception("Input package does not contain an application.ini file")
++
++        # The extra_files argument is empty [] because they are already a part
++        # of the original dmg produced by the build, and they remain in the
++        # tarball generated by the signing task.
++        create_dmg(tmpdir, output, volume_name, [])
++
++    finally:
++        shutil.rmtree(tmpdir)
+diff --git a/python/mozbuild/mozpack/dmg.py b/python/mozbuild/mozpack/dmg.py
+--- a/python/mozbuild/mozpack/dmg.py
++++ b/python/mozbuild/mozpack/dmg.py
+@@ -5,16 +5,18 @@
+ import buildconfig
+ import errno
+ import mozfile
+ import os
+ import platform
+ import shutil
+ import subprocess
+ 
++from mozbuild.util import ensureParentDir
++
+ is_linux = platform.system() == 'Linux'
+ 
+ 
+ def mkdir(dir):
+     if not os.path.isdir(dir):
+         try:
+             os.makedirs(dir)
+         except OSError as e:
+@@ -89,16 +91,20 @@ def create_dmg_from_staged(stagedir, out
+                                '-hfs-volume-name', volume_name,
+                                '-hfs-openfolder', stagedir,
+                                '-ov', stagedir,
+                                '-o', hybrid])
+         subprocess.check_call(['hdiutil', 'convert', '-format', 'UDBZ',
+                                '-imagekey', 'bzip2-level=9',
+                                '-ov', hybrid, '-o', output_dmg])
+     else:
++        # The dmg tool doesn't create the destination directories, and silently
++        # returns success if the parent directory doesn't exist.
++        ensureParentDir(output_dmg)
++
+         hfs = os.path.join(tmpdir, 'staged.hfs')
+         subprocess.check_call([
+             buildconfig.substs['HFS_TOOL'], hfs, 'addall', stagedir])
+         subprocess.check_call([
+             buildconfig.substs['DMG_TOOL'],
+             'build',
+             hfs,
+             output_dmg

+ 3 - 0
rel-esr52/mozilla/patches/series

@@ -6,3 +6,6 @@ xpi_langpack.diff
 osx_cross.diff
 bug1197325-1.diff
 bug1197325-2.diff
+bug1347576.diff
+bug1333826.diff
+bug1185666.diff