This is an automated email from the ASF dual-hosted git repository.

jimjag pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/openoffice.git


The following commit(s) were added to refs/heads/trunk by this push:
     new f3385db031 macOS: code-signable bundle layout, opt-in signing of the 
.app and .dmg Select patches from the mac-vcl-button-contrast branch.
f3385db031 is described below

commit f3385db031069db3e0655c6a4d85518bf39a7b68
Author: Jim Jagielski <[email protected]>
AuthorDate: Thu Sep 10 11:18:37 2026 -0400

    macOS: code-signable bundle layout, opt-in signing of the .app and .dmg
    Select patches from the mac-vcl-button-contrast branch.
    
    codesign rejects a bundle with anything but Mach-O binaries in 
Contents/MacOS,
    where scp2 installed everything; the installation now lives in 
Contents/program.
    Signing only runs with --with-macosx-codesigning-identity (or the env var) 
set.
---
 main/configure.ac                                  |  30 ++++
 main/cppuhelper/source/findsofficepath.c           |  21 ++-
 main/desktop/util/makefile.mk                      |   6 +
 main/icu/icu-darwin.patch                          |   2 +-
 main/icu/icu4c-4_2_1-src.patch                     |   2 +-
 main/libxml2/makefile.mk                           |   5 +-
 main/odk/setsdkenv_unix.sh.in                      |   4 +-
 main/sal/rtl/source/bootstrap.cxx                  |  22 +++
 main/scp2/source/ooo/common_brand.scp              |  44 +++---
 main/scp2/source/ooo/directory_ooo.scp             |  10 ++
 main/scp2/source/ooo/file_library_ooo.scp          |  16 +-
 main/scp2/source/ooo/ooo_brand.scp                 |   7 +-
 main/scp2/source/python/file_python.scp            | 175 +--------------------
 main/scp2/source/python/profileitem_python.scp     |  11 --
 main/set_soenv.in                                  |  10 ++
 main/solenv/bin/macosx-change-install-names.pl     |  14 +-
 main/solenv/bin/macosx-codesign-entitlements.plist |  21 +++
 main/solenv/bin/macosx-codesign.sh                 | 168 ++++++++++++++++++++
 main/solenv/bin/modules/installer/scriptitems.pm   |  18 ++-
 main/solenv/bin/modules/installer/simplepackage.pm |  47 +++++-
 main/solenv/inc/unxmacc.mk                         |   1 +
 main/solenv/inc/unxmacx.mk                         |   1 +
 22 files changed, 408 insertions(+), 227 deletions(-)

diff --git a/main/configure.ac b/main/configure.ac
index 954c09a69e..cc214ad613 100644
--- a/main/configure.ac
+++ b/main/configure.ac
@@ -982,6 +982,21 @@ AC_ARG_WITH(macosx-sdk,
                               Usage: --with-macosx-sdk=10.11
                               (or full path: 
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk)
 ],with_macosx_sdk=$withval,)
+AC_ARG_WITH(macosx-codesigning-identity,
+[  --with-macosx-codesigning-identity
+                          Code-sign the macOS application bundle and disk image
+                          while packaging, with this codesign identity
+                          ("-" for ad-hoc). Unset: package unsigned, as before.
+
+                              Usage: 
--with-macosx-codesigning-identity="Developer ID Application: ..."
+],with_macosx_codesigning_identity=$withval,)
+AC_ARG_WITH(macosx-codesigning-keychain,
+[  --with-macosx-codesigning-keychain
+                          Keychain holding that identity (default: the
+                          keychain search list, i.e. normally the login 
keychain).
+
+                              Usage: 
--with-macosx-codesigning-keychain=/path/to/build.keychain-db
+],with_macosx_codesigning_keychain=$withval,)
 AC_ARG_WITH(rat-scan,
 [  --with-rat-scan         Scan source code for license headers.
                           Use as --with-rat-scan to automatically download 
pre-built Rat binaries.
@@ -4562,9 +4577,24 @@ if test  "$_os" = "Darwin"; then
    fi
 
 fi
+dnl Code signing during packaging: 
solenv/bin/modules/installer/simplepackage.pm
+dnl reads these from the environment (via set_soenv), so a bare "yes" is an 
error.
+MACOSX_CODESIGNING_IDENTITY=
+MACOSX_CODESIGNING_KEYCHAIN=
+if test "$with_macosx_codesigning_identity" = "yes"; then
+   AC_MSG_ERROR([--with-macosx-codesigning-identity needs a codesign identity, 
or "-" for ad-hoc])
+fi
+if test -n "$with_macosx_codesigning_identity" -a 
"$with_macosx_codesigning_identity" != "no"; then
+   MACOSX_CODESIGNING_IDENTITY=$with_macosx_codesigning_identity
+fi
+if test -n "$with_macosx_codesigning_keychain" -a 
"$with_macosx_codesigning_keychain" != "no" -a 
"$with_macosx_codesigning_keychain" != "yes"; then
+   MACOSX_CODESIGNING_KEYCHAIN=$with_macosx_codesigning_keychain
+fi
 AC_SUBST(MACOSX_DEPLOYMENT_TARGET)
 AC_SUBST(MACOSX_SDK_PATH)
 AC_SUBST(SDKROOT)
+AC_SUBST(MACOSX_CODESIGNING_IDENTITY)
+AC_SUBST(MACOSX_CODESIGNING_KEYCHAIN)
 
 
 dnl ===================================================================
diff --git a/main/cppuhelper/source/findsofficepath.c 
b/main/cppuhelper/source/findsofficepath.c
index eccb7bdeba..93e410adc0 100644
--- a/main/cppuhelper/source/findsofficepath.c
+++ b/main/cppuhelper/source/findsofficepath.c
@@ -135,13 +135,26 @@ static char* platformSpecific()
     /* On MacOS we have no soffice link under /usr/bin but the default office 
location is known
        and we check this only
      */
-    const char* MACDEFAULTOFFICEPATH = 
"/Applications/OpenOffice.app/Contents/MacOS";
-    const char* MACDEFAULTSOFFICE = 
"/Applications/OpenOffice.app/Contents/MacOS/soffice";
+    /* The installation lives in Contents/program (Contents/MacOS holds only 
the
+       launcher, so that the bundle can be code-signed); soffice is reachable
+       there through a symlink. Before 4.2 everything was in Contents/MacOS, so
+       fall back to that for an older office -- it has to be tried second, as
+       the launcher is in Contents/MacOS in both layouts. */
+    const char* MACDEFAULTOFFICEPATH = 
"/Applications/OpenOffice.app/Contents/program";
+    const char* MACDEFAULTSOFFICE = 
"/Applications/OpenOffice.app/Contents/program/soffice";
+    const char* MACLEGACYOFFICEPATH = 
"/Applications/OpenOffice.app/Contents/MacOS";
+    const char* MACLEGACYSOFFICE = 
"/Applications/OpenOffice.app/Contents/MacOS/soffice";
+    const char* found = NULL;
 
     if ( !access( MACDEFAULTSOFFICE, F_OK ) )
+        found = MACDEFAULTOFFICEPATH;
+    else if ( !access( MACLEGACYSOFFICE, F_OK ) )
+        found = MACLEGACYOFFICEPATH;
+
+    if ( found )
     {
-        path = (char*) malloc( strlen(MACDEFAULTOFFICEPATH) + 1 );
-        strcpy( path, MACDEFAULTOFFICEPATH);
+        path = (char*) malloc( strlen(found) + 1 );
+        strcpy( path, found );
     }
     return path;
 #else
diff --git a/main/desktop/util/makefile.mk b/main/desktop/util/makefile.mk
index 3163142cc9..f19ecad786 100644
--- a/main/desktop/util/makefile.mk
+++ b/main/desktop/util/makefile.mk
@@ -101,6 +101,12 @@ APP1STACK=10000000
 APP5TARGET=soffice
 APP5NOSAL=TRUE
 APP5RPATH=BRAND
+.IF "$(OS)" == "MACOSX"
+# soffice is the bundle launcher and lives alone in Contents/MacOS (only
+# Mach-O binaries may, or the bundle cannot be code-signed); the libraries it
+# links against are installed in Contents/program.
+APP5RPATH=BRANDBIN
+.ENDIF # MACOSX
 APP5OBJS=$(OBJ)$/copyright_ascii_ooo.obj $(OBJ)$/main.obj
 APP5STDLIBS = $(SALLIB) $(SOFFICELIB)
 .IF "$(OS)" == "LINUX"
diff --git a/main/icu/icu-darwin.patch b/main/icu/icu-darwin.patch
index 8ee7976878..4f9df08f3d 100644
--- a/main/icu/icu-darwin.patch
+++ b/main/icu/icu-darwin.patch
@@ -8,7 +8,7 @@ diff -ru misc/icu/source/data/pkgdataMakefile.in 
misc/build/icu/source/data/pkgd
 +# LD_SONAME must end with a path, but on Darwin this does not happen, because
 +# file source/config/mh-darwin makes it end with FINAL_SO_TARGET, instead of
 +# MIDDLE_SO_TARGET like other Unixes.
-+LD_SONAME = -Wl,-compatibility_version -Wl,$(SO_TARGET_VERSION_MAJOR) 
-Wl,-current_version -Wl,$(SO_TARGET_VERSION) -install_name @executable_path/
++LD_SONAME = -Wl,-compatibility_version -Wl,$(SO_TARGET_VERSION_MAJOR) 
-Wl,-current_version -Wl,$(SO_TARGET_VERSION) -install_name @loader_path/
  
  all : clean 
        @echo GENCCODE_ASSEMBLY_TYPE=$(GENCCODE_ASSEMBLY) >> $(OUTPUTFILE)
diff --git a/main/icu/icu4c-4_2_1-src.patch b/main/icu/icu4c-4_2_1-src.patch
index 572572a3ea..2649f18999 100644
--- a/main/icu/icu4c-4_2_1-src.patch
+++ b/main/icu/icu4c-4_2_1-src.patch
@@ -56,7 +56,7 @@ diff -ru misc/icu/source/config/mh-darwin 
misc/build/icu/source/config/mh-darwin
  
  ## Compiler switches to embed a library name and version information
 -LD_SONAME = -Wl,-compatibility_version -Wl,$(SO_TARGET_VERSION_MAJOR) 
-Wl,-current_version -Wl,$(SO_TARGET_VERSION) -install_name $(notdir 
$(MIDDLE_SO_TARGET))
-+LD_SONAME = -Wl,-compatibility_version -Wl,$(SO_TARGET_VERSION_MAJOR) 
-Wl,-current_version -Wl,$(SO_TARGET_VERSION) -install_name 
@executable_path/$(notdir $(FINAL_SO_TARGET))
++LD_SONAME = -Wl,-compatibility_version -Wl,$(SO_TARGET_VERSION_MAJOR) 
-Wl,-current_version -Wl,$(SO_TARGET_VERSION) -install_name 
@loader_path/$(notdir $(FINAL_SO_TARGET))
  
  ## Compiler switch to embed a runtime search path
  LD_RPATH=
diff --git a/main/libxml2/makefile.mk b/main/libxml2/makefile.mk
index 8f5a105406..3716ac0fbf 100644
--- a/main/libxml2/makefile.mk
+++ b/main/libxml2/makefile.mk
@@ -118,7 +118,10 @@ OUTDIR2INC=include$/libxml
 .IF "$(OS)"=="MACOSX"
 EXTRPATH=URELIB
 OUT2LIB+=.libs$/libxml2.a
-OUT2BIN+=.libs$/xmllint
+# With --enable-shared=no (see CONFIGURE_FLAGS above), libtool links xmllint
+# directly against the static lib -- no .libs/ wrapper copy -- so the binary
+# lands at the build root. (Cf. libxslt/makefile.mk's xsltproc handling.)
+OUT2BIN+=xmllint
 OUT2BIN+=xml2-config
 .ELIF "$(OS)"=="WNT"
 .IF "$(COM)"=="GCC"
diff --git a/main/odk/setsdkenv_unix.sh.in b/main/odk/setsdkenv_unix.sh.in
index f9ac1c3a0b..8d818fc4a3 100644
--- a/main/odk/setsdkenv_unix.sh.in
+++ b/main/odk/setsdkenv_unix.sh.in
@@ -101,7 +101,9 @@ programdir=program
 javadir=bin
 case ${sdk_platform} in
   darwin*)
-    programdir="Contents/MacOS"
+    # The installation lives in Contents/program; Contents/MacOS holds only the
+    # soffice launcher, so that the bundle can be code-signed.
+    programdir="Contents/program"
     javacdir=Commands
     ;;
 esac
diff --git a/main/sal/rtl/source/bootstrap.cxx 
b/main/sal/rtl/source/bootstrap.cxx
index 35a3a9f8c1..2ca20daa1d 100644
--- a/main/sal/rtl/source/bootstrap.cxx
+++ b/main/sal/rtl/source/bootstrap.cxx
@@ -271,6 +271,28 @@ static OUString & getIniFileName_Impl()
 
                        // append config file suffix
                        fileName += 
OUString(RTL_CONSTASCII_USTRINGPARAM(SAL_CONFIGFILE("")));
+
+#ifdef MACOSX
+                       // In an application bundle only Mach-O binaries may 
live in
+                       // Contents/MacOS -- code signing rejects the bundle 
otherwise --
+                       // so the installation itself (rc files, rdbs, the 
libraries) sits
+                       // in Contents/program, exactly as on the other UNX 
platforms.
+                       // Look the ini file up there; $ORIGIN is derived from 
it below,
+                       // which anchors the whole bootstrap chain in the 
program dir.
+                       OUString macOSDir 
(RTL_CONSTASCII_USTRINGPARAM("/Contents/MacOS/"));
+                       sal_Int32 nMacOSDir = fileName.lastIndexOf(macOSDir);
+                       if (nMacOSDir >= 0)
+                       {
+                               OUString programName =
+                                       fileName.replaceAt(nMacOSDir, 
macOSDir.getLength(),
+                                               
OUString(RTL_CONSTASCII_USTRINGPARAM("/Contents/program/")));
+                               // Fall back to the old location for anything 
that is not laid
+                               // out this way (a plain bundle, an mdimporter, 
...).
+                               ::osl::DirectoryItem item;
+                               if (::osl::DirectoryItem::get(programName, 
item) == ::osl::DirectoryItem::E_None)
+                                       fileName = programName;
+                       }
+#endif
                }
 
                static OUString theFileName;
diff --git a/main/scp2/source/ooo/common_brand.scp 
b/main/scp2/source/ooo/common_brand.scp
index 42769143ed..ff45b6060a 100644
--- a/main/scp2/source/ooo/common_brand.scp
+++ b/main/scp2/source/ooo/common_brand.scp
@@ -84,7 +84,7 @@ Module gid_Module_Root_Brand
              gid_Brand_File_Share_Xdg_StartCenter,
              gid_Brand_File_Share_Xdg_Writer,
              gid_Brand_File_Txt_Package);
-    Unixlinks = (gid_Brand_Unixlink_Program,
+    Unixlinks = (gid_Brand_Unixlink_Soffice,
                  gid_Brand_Unixlink_Unopkg);
 //    Unixlinks = (gid_Brand_Unixlink_BasisLink,
 //                 gid_Brand_Unixlink_Program,
@@ -122,11 +122,10 @@ End
 Directory gid_Brand_Dir_Program
 #if defined MACOSX
     ParentID = gid_Dir_Bundle_Contents;
-    DosName = "MacOS";
 #else
     ParentID = gid_Dir_Brand_Root;
-    DosName = "program";
 #endif
+    DosName = "program";
 End
 
 Directory gid_Brand_Dir_Resource
@@ -269,29 +268,21 @@ End
 
 // UnixLinks
 
-#if defined MACOSX
-Unixlink gid_Brand_Unixlink_Urelibs
-    Dir = gid_Brand_Dir_Program;
-    Name = "urelibs";
-    Target = "../basis-link/ure-link/lib";
-End
-#endif
-
-#if defined MACOSX
-Unixlink gid_Brand_Unixlink_Program
-    BIN_FILE_BODY;
-    Dir = gid_Dir_Bundle_Contents;
-    Name = "program";
-    Target = "MacOS";
-    Styles = ();
-End
-#endif
+// gid_Brand_Unixlink_Urelibs (urelibs -> ../basis-link/ure-link/lib) and
+// gid_Brand_Unixlink_Program (Contents/program -> MacOS) are gone: the first
+// has pointed at nothing since the basis/ure split was dropped, and
+// Contents/program is now the real installation directory.
 
 // Files
 
 File gid_Brand_File_Bin_Soffice
     BIN_FILE_BODY;
+#if defined MACOSX
+    // the bundle's CFBundleExecutable, and the only thing in Contents/MacOS
+    Dir = gid_Dir_Bundle_Contents_MacOS;
+#else
     Dir = gid_Brand_Dir_Program;
+#endif
     Name = EXENAME(soffice);
   #ifdef WNT
     Styles = (PACKED, PATCH_SO_NAME);
@@ -411,6 +402,19 @@ Unixlink gid_Brand_Unixlink_Unopkg
 End
 #endif
 
+// The launcher itself has to sit in Contents/MacOS, but everything that looks
+// for the office binary next to the installation -- cppuhelper's
+// findsofficepath(), scripts, the SDK -- expects it in the program directory.
+#if defined MACOSX
+Unixlink gid_Brand_Unixlink_Soffice
+    BIN_FILE_BODY;
+    Dir = gid_Brand_Dir_Program;
+    Name = "soffice";
+    Target = "../MacOS/soffice";
+    Styles = ();
+End
+#endif
+
 #ifndef OS2
 File gid_Brand_File_Bin_Unopkg
     BIN_FILE_BODY;
diff --git a/main/scp2/source/ooo/directory_ooo.scp 
b/main/scp2/source/ooo/directory_ooo.scp
index b69c6a2079..52fa8869bd 100644
--- a/main/scp2/source/ooo/directory_ooo.scp
+++ b/main/scp2/source/ooo/directory_ooo.scp
@@ -37,6 +37,16 @@ Directory gid_Dir_Bundle_Contents_Resources_Lang
 End
 #endif
 
+// Only Mach-O binaries may live here: code signing refuses to seal a bundle
+// with anything else in Contents/MacOS. The installation itself goes to
+// Contents/program, so this holds just the soffice launcher.
+#ifdef MACOSX
+Directory gid_Dir_Bundle_Contents_MacOS
+    ParentID = gid_Dir_Bundle_Contents;
+    HostName = "MacOS";
+End
+#endif
+
 #ifdef MACOSX
 Directory gid_Dir_Bundle_Contents_Library
     ParentID = gid_Dir_Bundle_Contents;
diff --git a/main/scp2/source/ooo/file_library_ooo.scp 
b/main/scp2/source/ooo/file_library_ooo.scp
index bae968b757..345048aa2f 100644
--- a/main/scp2/source/ooo/file_library_ooo.scp
+++ b/main/scp2/source/ooo/file_library_ooo.scp
@@ -1593,16 +1593,16 @@ STD_JAR_FILE( gid_File_Jar_Xsltvalidate, XSLTValidate )
 #endif
 
 #ifndef SYSTEM_LIBXSLT
+// On macOS the bundled libxslt is built static (--enable-shared=no, like
+// main/libxml2) and linked into its consumers, so there is no shared
+// libxslt to package -- mirror libxml2, which has no scp2 File entry.
+#ifndef MACOSX
 File gid_File_Lib_Xslt
     TXT_FILE_BODY;
     Styles = (PACKED);
     Dir = SCP2_OOO_BIN_DIR;
   #ifdef UNX
-    #ifdef MACOSX
-       Name = STRING(CONCAT4(libxslt,.,LIBXSLT_MAJOR,UNXSUFFIX));
-    #else
        Name = STRING(CONCAT4(libxslt,UNXSUFFIX,.,LIBXSLT_MAJOR));
-    #endif
   #else
    #ifdef _gcc3
     Name = "libxslt-1.dll";
@@ -1612,6 +1612,7 @@ File gid_File_Lib_Xslt
   #endif
 End
 #endif
+#endif
 
 
 STD_LIB_FILE( gid_File_Lib_Unoxml, unoxml )
@@ -1791,6 +1792,10 @@ File gid_File_Lib_Openssl
     Name = "libssl-3.dll";
   #elif defined(WNT) && defined(X86_64)
     Name = "libssl-3-x64.dll";
+  #elif defined(MACOSX)
+    /* macOS versions dylibs as libNAME.V.dylib, not SCP2_URE_DL_VER's
+       libNAME.dylib.V; match what main/openssl delivers. */
+    Name = "libssl.3.dylib";
   #else
     Name = SCP2_URE_DL_VER("ssl", "3");
   #endif
@@ -1806,6 +1811,9 @@ File gid_File_Lib_Crypto
     Name = "libcrypto-3.dll";
   #elif defined(WNT) && defined(X86_64)
     Name = "libcrypto-3-x64.dll";
+  #elif defined(MACOSX)
+    /* see gid_File_Lib_Openssl above */
+    Name = "libcrypto.3.dylib";
   #else
     Name = SCP2_URE_DL_VER("crypto", "3");
   #endif
diff --git a/main/scp2/source/ooo/ooo_brand.scp 
b/main/scp2/source/ooo/ooo_brand.scp
index fc617ad70a..d521fbd6d8 100644
--- a/main/scp2/source/ooo/ooo_brand.scp
+++ b/main/scp2/source/ooo/ooo_brand.scp
@@ -37,11 +37,10 @@ End
 
 File gid_File_Txt_Notice
     TXT_FILE_BODY;
-#ifndef MACOSX
+    // next to LICENSE in the program directory on every platform; on Mac OS X
+    // it used to go into the bundle's Contents, which cannot be signed with a
+    // stray file in it
     Dir = gid_Brand_Dir_Program;
-#else
-    Dir = gid_Dir_Bundle_Contents;
-#endif
     Name = "NOTICE";
     Styles = (PACKED);
 End
diff --git a/main/scp2/source/python/file_python.scp 
b/main/scp2/source/python/file_python.scp
index 95f64c09db..7116bb0b2e 100644
--- a/main/scp2/source/python/file_python.scp
+++ b/main/scp2/source/python/file_python.scp
@@ -112,27 +112,24 @@ File gid_File_Py_Python_Core
     Dir = gid_Dir_Common_Ure;
 #endif
 //    Dir = gid_Dir_Program;
-  #ifdef MACOSX
-    Name = "OOoPython.framework.zip";
-    Styles = (ARCHIVE,USE_INTERNAL_RIGHTS);
-  #else
     Name = STRING(CONCAT3(python-core-,PYVERSION,.zip));
     Styles = (ARCHIVE);
-  #endif
 End
 
 #ifdef UNX
-#ifndef MACOSX
 File gid_File_Py_Python_Bin
     BIN_FILE_BODY;
+#if defined MACOSX
+    Dir = gid_Brand_Dir_Program;
+#else
     Dir = gid_Dir_Common_Ure;
+#endif
 //    Dir = gid_Dir_Program;
     Name = "python.bin";
     Styles = (PACKED);
 End
 #endif
 #endif
-#endif
 
 // Scripting Framework Python script proxy
 
@@ -167,177 +164,17 @@ File gid_File_Share_Registry_Pyuno_Xcd
 End
 
 #ifndef SYSTEM_PYTHON
-#ifndef MACOSX
 File gid_File_Lib_Python_So
     TXT_FILE_BODY;
-    Dir = gid_Dir_Common_Ure;
-//    Dir = gid_Dir_Program;
-    Name = STRING(PY_FULL_DLL_NAME);
-    Styles = (PACKED);
-End
-#else //MACOSX
-//directory entries solely to be able to create the symlinks
-Directory gid_Dir_PythonFramework
 #if defined MACOSX
     Dir = gid_Brand_Dir_Program;
 #else
     Dir = gid_Dir_Common_Ure;
 #endif
-//    ParentID = gid_Dir_Program;
-    HostName = "OOoPython.framework";
-End
-
-Unixlink gid_Unixlink_Python_Headers
-    BIN_FILE_BODY;
-    Dir = gid_Dir_PythonFramework;
-    Name = "Headers";
-    Target = "Versions/Current/Headers";
-    Styles = ();
-End
-
-Unixlink gid_Unixlink_Python_Resources
-    BIN_FILE_BODY;
-    Dir = gid_Dir_PythonFramework;
-    Name = "Resources";
-    Target = "Versions/Current/Resources";
-    Styles = ();
-End
-
-Directory gid_Dir_PythonFramework_Versions
-    ParentID = gid_Dir_PythonFramework;
-    HostName = "Versions";
-End
-
-Unixlink gid_Unixlink_Python_Versions_Current
-    BIN_FILE_BODY;
-    Dir = gid_Dir_PythonFramework_Versions;
-    Name = "Current";
-    Target = STRING(PYMAJMIN);
-    Styles = ();
-End
-
-Directory gid_Dir_PythonFramework_Versions_ver
-    ParentID = gid_Dir_PythonFramework_Versions;
-    HostName = STRING(PYMAJMIN);
-End
-
-Unixlink gid_Unixlink_Python_Versions_ver_Headers
-    BIN_FILE_BODY;
-    Dir = gid_Dir_PythonFramework_Versions_ver;
-    Name = "Headers";
-    Target = STRING(CONCAT2(include/python,PYMAJMIN));
-    Styles = ();
-End
-
-Directory gid_Dir_PythonFramework_Versions_ver_bin
-    ParentID = gid_Dir_PythonFramework_Versions_ver;
-    HostName = "bin";
-End
-
-Directory gid_Dir_PythonFramework_Versions_ver_lib
-    ParentID = gid_Dir_PythonFramework_Versions_ver;
-    HostName = "lib";
-End
-
-Directory gid_Dir_PythonFramework_Versions_ver_lib_pythonver
-    ParentID = gid_Dir_PythonFramework_Versions_ver_lib;
-    HostName = STRING(CONCAT2(python,PYMAJMIN));
-End
-
-Directory gid_Dir_PythonFramework_Versions_ver_lib_pythonver_config
-    ParentID = gid_Dir_PythonFramework_Versions_ver_lib_pythonver;
-    HostName = "config";
-End
-
-Unixlink gid_Unixlink_Python_OOoPython
-    BIN_FILE_BODY;
-    Dir = gid_Dir_PythonFramework;
-    Name = "OOoPython";
-    Target = "Versions/Current/OOoPython";
-    Styles = ();
-End
-
-Unixlink gid_Unixlink_Python_bin_idle
-    BIN_FILE_BODY;
-    Dir = gid_Dir_PythonFramework_Versions_ver_bin;
-    Name = "idle";
-    Target = STRING(CONCAT2(idle,PYMAJMIN));
-    Styles = ();
-End
-
-Unixlink gid_Unixlink_Python_bin_pydoc
-    BIN_FILE_BODY;
-    Dir = gid_Dir_PythonFramework_Versions_ver_bin;
-    Name = "pydoc";
-    Target = STRING(CONCAT2(pydoc,PYMAJMIN));
-    Styles = ();
-End
-
-Unixlink gid_Unixlink_Python_bin_python_real
-    BIN_FILE_BODY;
-    Dir = gid_Dir_PythonFramework_Versions_ver_bin;
-    Name = "python";
-    Target = "../Resources/Python.app/Contents/MacOS/OOoPython";
-    Styles = ();
-End
-
-Unixlink gid_Unixlink_Python_bin_python
-    BIN_FILE_BODY;
-    Dir = gid_Dir_PythonFramework_Versions_ver_bin;
-    Name = "python";
-    Target = STRING(CONCAT2(python,PYMAJMIN));
-    Styles = ();
-End
-
-Unixlink gid_Unixlink_Python_bin_pythonconfig
-    BIN_FILE_BODY;
-    Dir = gid_Dir_PythonFramework_Versions_ver_bin;
-    Name = "python-config";
-    Target = STRING(CONCAT3(python,PYMAJMIN,-config));
-    Styles = ();
-End
-
-Unixlink gid_Unixlink_Python_bin_pythonw_real
-    BIN_FILE_BODY;
-    Dir = gid_Dir_PythonFramework_Versions_ver_bin;
-    Name = "pythonw";
-    Target = "../Resources/Python.app/Contents/MacOS/OOoPython";
-    Styles = ();
-End
-
-Unixlink gid_Unixlink_Python_bin_pythonw
-    BIN_FILE_BODY;
-    Dir = gid_Dir_PythonFramework_Versions_ver_bin;
-    Name = "pythonw";
-    Target = STRING(CONCAT2(pythonw,PYMAJMIN));
-    Styles = ();
-End
-
-Unixlink gid_Unixlink_Python_bin_smtpdpy
-    BIN_FILE_BODY;
-    Dir = gid_Dir_PythonFramework_Versions_ver_bin;
-    Name = "smtpd.py";
-    Target = STRING(CONCAT3(smtpd,PYMAJMIN,.py));
-    Styles = ();
-End
-
-Unixlink gid_Unixlink_Python_libpython
-    BIN_FILE_BODY;
-    Dir = gid_Dir_PythonFramework_Versions_ver_lib_pythonver_config;
+//    Dir = gid_Dir_Program;
     Name = STRING(PY_FULL_DLL_NAME);
-    Target = "../../../OOoPython";
-    Styles = ();
+    Styles = (PACKED);
 End
-#endif //MACOSX
-
-//#ifdef WNT
-//File gid_File_Lib_Python_So_Brand // Fix for system-python-problem on windows
-//    TXT_FILE_BODY;
-//    Dir = gid_Brand_Dir_Program;
-//    Name = STRING(PY_FULL_DLL_NAME);
-//    Styles = (PACKED);
-//End
-//#endif
 #endif
 
 #ifdef UNX
diff --git a/main/scp2/source/python/profileitem_python.scp 
b/main/scp2/source/python/profileitem_python.scp
index 4ae2f5b177..00c02d91bd 100644
--- a/main/scp2/source/python/profileitem_python.scp
+++ b/main/scp2/source/python/profileitem_python.scp
@@ -47,11 +47,7 @@ ProfileItem gid_Profileitem_Pythonloader_Pythonhome
     Section = "Bootstrap";
     Order = 1;
     Key = "PYUNO_LOADER_PYTHONHOME";
-  #ifdef MACOSX
-    Value = CONCAT2($ORIGIN,"OOoPython.framework");
-  #else
     Value = CONCAT2($ORIGIN/python-core-,PYVERSION);
-  #endif
 End
 #endif
 
@@ -65,17 +61,10 @@ ProfileItem gid_Profileitem_Pythonloader_Pythonpath
     Value = "$ORIGIN";
 #else
   #ifdef UNX
-    #ifdef MACOSX
-    #define FRAMEWORKLIB 
CONCAT4($ORIGIN/OOoPython.framework/Versions/,PYMAJMIN,/lib/python,PYMAJMIN)
-    Value = CONCAT3(FRAMEWORKLIB FRAMEWORKLIB,
-                  /lib-dynload FRAMEWORKLIB,
-                  /site-packages $ORIGIN);
-    #else
     Value = CONCAT7($ORIGIN/python-core-,PYVERSION,
                   /lib $ORIGIN/python-core-,PYVERSION,
                   /lib/lib-dynload $ORIGIN/python-core-,PYVERSION,
                   /lib/site-packages $ORIGIN);
-    #endif
   #else
    #ifdef _gcc3
     Value = STRING(CONCAT7($ORIGIN/python-core-,PYVERSION,
diff --git a/main/set_soenv.in b/main/set_soenv.in
index b684ec6b96..9e24f77a51 100644
--- a/main/set_soenv.in
+++ b/main/set_soenv.in
@@ -1859,6 +1859,16 @@ if ( $platform =~ m/darwin/ )
     ToFile( "MACOSX_DEPLOYMENT_TARGET",       "@MACOSX_DEPLOYMENT_TARGET@",    
   "e" );
     ToFile( "MACOSX_SDK_PATH",       "@MACOSX_SDK_PATH@",       "e" );
     ToFile( "SDKROOT",       "@SDKROOT@",       "e" );
+# Optional code signing while packaging (simplepackage.pm). Only written when
+# configure was given a value, so an identity exported by hand is not 
clobbered.
+    if ( "@MACOSX_CODESIGNING_IDENTITY@" ne "" )
+    {
+        ToFile( "MACOSX_CODESIGNING_IDENTITY", 
"@MACOSX_CODESIGNING_IDENTITY@", "e" );
+    }
+    if ( "@MACOSX_CODESIGNING_KEYCHAIN@" ne "" )
+    {
+        ToFile( "MACOSX_CODESIGNING_KEYCHAIN", 
"@MACOSX_CODESIGNING_KEYCHAIN@", "e" );
+    }
     ToFile( "LIBINTL_PREFIX",       "@LIBINTL_PREFIX@", "e" );
 }
 if ( $platform =~ m/freebsd/ )
diff --git a/main/solenv/bin/macosx-change-install-names.pl 
b/main/solenv/bin/macosx-change-install-names.pl
index ba4a60a91c..eaaea58373 100644
--- a/main/solenv/bin/macosx-change-install-names.pl
+++ b/main/solenv/bin/macosx-change-install-names.pl
@@ -33,6 +33,10 @@ sub action($$$)
          'app/SDK/URELIB' => '@executable_path',
          'app/BRAND/URELIB' => '@executable_path',
          'app/BRAND/OOO' => '@executable_path',
+         # BRANDBIN: the executable is the bundle launcher in Contents/MacOS,
+         # while the libraries are installed in Contents/program.
+         'app/BRANDBIN/URELIB' => '@executable_path/../program',
+         'app/BRANDBIN/OOO' => '@executable_path/../program',
          'app/NONE/URELIB' => '@__VIA_LIBRARY_PATH__',
          'app/NONE/OOO' => '@__VIA_LIBRARY_PATH__',
          'app/NONE/NONE' => '@__VIA_LIBRARY_PATH__',
@@ -40,8 +44,12 @@ sub action($$$)
          'shl/OOO/URELIB' => '@loader_path',
          'shl/OOO/OOO' => '@loader_path',
          'shl/LOADER/LOADER' => '@loader_path',
-         'shl/OXT/URELIB' => '@executable_path',
-         'shl/BOXT/URELIB' => '@executable_path',
+         # Extension libraries can live inside the installation or in an
+         # extension directory, so they cannot use @loader_path; the office
+         # libraries are always in Contents/program, one level up from the
+         # launcher in Contents/MacOS and from the helper binaries themselves.
+         'shl/OXT/URELIB' => '@executable_path/../program',
+         'shl/BOXT/URELIB' => '@executable_path/../program',
          'shl/BOXT/OOO' => '@loader_path',
          'shl/NONE/URELIB' => '@__VIA_LIBRARY_PATH__',
          'shl/NONE/OOO' => '@__VIA_LIBRARY_PATH__',
@@ -74,7 +82,7 @@ sub action($$$)
 }
 
 @ARGV == 3 || @ARGV >= 2 && $ARGV[0] eq "extshl" or die
-  'Usage: app|shl|extshl UREBIN|URELIB|OOO|SDK|BRAND|OXT|BOXT|NONE|LOADER 
<filepath>*';
+  'Usage: app|shl|extshl 
UREBIN|URELIB|OOO|SDK|BRAND|BRANDBIN|OXT|BOXT|NONE|LOADER <filepath>*';
 $type = shift @ARGV;
 $loc = shift @ARGV;
 if ($type eq "SharedLibrary")
diff --git a/main/solenv/bin/macosx-codesign-entitlements.plist 
b/main/solenv/bin/macosx-codesign-entitlements.plist
new file mode 100644
index 0000000000..ca5913f7e6
--- /dev/null
+++ b/main/solenv/bin/macosx-codesign-entitlements.plist
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
"http://www.apple.com/DTDs/PropertyList-1.0.dtd";>
+<plist version="1.0">
+<dict>
+       <!-- The bundled JVM/Java bridge and Basic runtime generate and run 
code at runtime. -->
+       <key>com.apple.security.cs.allow-jit</key>
+       <true/>
+       <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
+       <true/>
+       <!-- soffice dlopens an external JDK's libjvm.dylib, user-installed UNO 
extensions
+            and Python modules; none of those carry our Team ID. -->
+       <key>com.apple.security.cs.disable-library-validation</key>
+       <true/>
+       <!-- sofficerc / the launcher set DYLD_* to find the bundled URE 
libraries. -->
+       <key>com.apple.security.cs.allow-dyld-environment-variables</key>
+       <true/>
+       <!-- Mail merge, "Send Document as E-Mail" and the installer script 
drive other apps. -->
+       <key>com.apple.security.automation.apple-events</key>
+       <true/>
+</dict>
+</plist>
diff --git a/main/solenv/bin/macosx-codesign.sh 
b/main/solenv/bin/macosx-codesign.sh
new file mode 100755
index 0000000000..57d7762944
--- /dev/null
+++ b/main/solenv/bin/macosx-codesign.sh
@@ -0,0 +1,168 @@
+#!/bin/bash
+#
+# Code-sign a built Apache OpenOffice .app (or .dmg) on macOS.
+#
+#   ./solenv/bin/macosx-codesign.sh [options] <OpenOffice.app|installer.dmg> 
...
+#
+# Options:
+#   -i, --identity ID   codesign identity; "-" = ad-hoc (default, or
+#                       $MACOSX_CODESIGNING_IDENTITY when set)
+#   -e, --entitlements  entitlements plist (default: 
macosx-codesign-entitlements.plist)
+#   -k, --keychain PATH keychain holding the identity (default: the search 
list)
+#       --hardened      force hardened runtime even for an ad-hoc signature
+#                       (implied by a real identity)
+#       --verify        only report the current signing state, change nothing
+#
+# The linker already ad-hoc-signs each Mach-O it produces, which is why the
+# binaries load at all on arm64. What it does not do is seal the *bundles*:
+# without a _CodeSignature/CodeResources the .app has no identity, Gatekeeper
+# rejects it once it carries a quarantine flag, and it can never be notarized.
+#
+# This signs inside-out -- every Mach-O, then the nested bundles, then the app.
+# It relies on the installation being laid out so that Contents/MacOS holds
+# only the soffice launcher (see scp2/source/ooo/common_brand.scp); codesign
+# refuses to seal a bundle with anything else in there.
+
+set -euo pipefail
+
+SRCDIR=$(cd "$(dirname "$0")" && pwd)
+IDENTITY="${MACOSX_CODESIGNING_IDENTITY:--}"
+ENTITLEMENTS="$SRCDIR/macosx-codesign-entitlements.plist"
+KEYCHAIN="${MACOSX_CODESIGNING_KEYCHAIN:-}"
+HARDENED=no
+VERIFY_ONLY=no
+TARGETS=()
+
+while [ $# -gt 0 ]; do
+       case "$1" in
+               -i|--identity)     IDENTITY="$2"; shift 2 ;;
+               -e|--entitlements) ENTITLEMENTS="$2"; shift 2 ;;
+               -k|--keychain)     KEYCHAIN="$2"; shift 2 ;;
+               --hardened)        HARDENED=yes; shift ;;
+               --verify)          VERIFY_ONLY=yes; shift ;;
+               -h|--help)         sed -n '2,25p' "$0"; exit 0 ;;
+               -*)                echo "unknown option: $1" >&2; exit 2 ;;
+               *)                 TARGETS+=("$1"); shift ;;
+       esac
+done
+
+[ ${#TARGETS[@]} -gt 0 ] || { echo "usage: $(basename "$0") [options] 
<app-or-dmg> ..." >&2; exit 2; }
+[ "$IDENTITY" = "-" ] || HARDENED=yes
+
+sign_one() {
+       local path="$1"; shift
+       local args=(--force --sign "$IDENTITY" --timestamp=none)
+       if [ "$IDENTITY" != "-" ]; then
+               args=(--force --sign "$IDENTITY" --timestamp)
+       fi
+       if [ "$HARDENED" = yes ]; then
+               args+=(--options runtime --entitlements "$ENTITLEMENTS")
+       fi
+       if [ -n "$KEYCHAIN" ]; then
+               args+=(--keychain "$KEYCHAIN")
+       fi
+       codesign "${args[@]}" "$@" "$path"
+}
+
+report() {
+       local app="$1"
+       echo "--- $app"
+       codesign -dv --verbose=2 "$app" 2>&1 | grep -E 
'Identifier|Format|CodeDirectory|Authority|TeamIdentifier|Sealed' || true
+       if codesign --verify --deep --strict "$app" 2>/dev/null; then
+               echo "verify: OK"
+       else
+               echo "verify: FAILED"
+               codesign --verify --deep --strict --verbose=2 "$app" 2>&1 | 
tail -5
+       fi
+       spctl --assess --type exec --verbose=4 "$app" 2>&1 | tail -2 || true
+}
+
+# codesign rewrites every Mach-O it signs and writes _CodeSignature/ into
+# every bundle it seals; the installer stages files read-only. Open just those
+# for writing rather than the whole tree, so the staged UnixRights survive.
+open_for_signing() {
+       local b="$1" d
+       for d in "$b" "$b/Contents" "$b"/Versions/*/; do
+               if [ -d "$d" ]; then chmod u+w "$d"; fi
+       done
+       find "$b" -maxdepth 3 -name _CodeSignature -exec chmod -R u+w {} + 
2>/dev/null || true
+}
+
+sign_app() {
+       local app="$1"
+       echo "==> signing $app  (identity: $IDENTITY, hardened: $HARDENED)"
+
+       # Quarantine and other xattrs make codesign fail or produce an unstable 
seal.
+       xattr -cr "$app" 2>/dev/null || true
+
+       # A bundle's main executable is signed as part of its bundle, not on 
its own:
+       # codesign silently redirects such a path to the enclosing bundle.
+       local bundles=() main_execs=() b exe
+       while IFS= read -r b; do bundles+=("$b"); done < <(find "$app" \
+               \( -name '*.app' -o -name '*.framework' -o -name '*.bundle' \
+               -o -name '*.mdimporter' -o -name '*.plugin' -o -name 
'*.qlgenerator' \) \
+               | awk '{ print gsub(/\//,"/") "\t" $0 }' | sort -rn | cut -f2-)
+       for b in ${bundles[@]+"${bundles[@]}"}; do
+               exe=$(/usr/libexec/PlistBuddy -c 'Print CFBundleExecutable' 
"$b/Contents/Info.plist" 2>/dev/null) || continue
+               main_execs+=("$b/Contents/MacOS/$exe")
+       done
+
+       # Find every Mach-O with one batched file(1) run instead of a process 
per
+       # file (an installation holds ~10k). --print0 emits "path\0: type\n".
+       local machos=() f type
+       while IFS= read -r -d '' f && IFS= read -r type; do
+               case "$type" in ": Mach-O"*) machos+=("$f") ;; esac
+       done < <(find "$app" -type f -print0 | xargs -0 file --no-pad --print0 
-- 2>/dev/null)
+       # codesign rewrites a Mach-O through a temporary file beside it, so the
+       # containing directory has to be writable as well.
+       if [ ${#machos[@]} -gt 0 ]; then
+               local dirs=()
+               for f in "${machos[@]}"; do dirs+=("${f%/*}"); done
+               chmod u+w "${machos[@]}"
+               printf '%s\n' "${dirs[@]}" | sort -u | tr '\n' '\0' | xargs -0 
chmod u+w
+       fi
+       for b in ${bundles[@]+"${bundles[@]}"}; do open_for_signing "$b"; done
+
+       # 1. every Mach-O object, deepest path first
+       local count=0
+       if [ ${#machos[@]} -gt 0 ]; then
+               while IFS= read -r f; do
+                       case " ${main_execs[*]-} " in *" $f "*) continue ;; esac
+                       sign_one "$f"
+                       count=$((count + 1))
+               done < <(printf '%s\n' "${machos[@]}" | awk '{ print 
gsub(/\//,"/") "\t" $0 }' | sort -rn | cut -f2-)
+       fi
+       echo "    signed $count Mach-O objects"
+
+       # 2. nested bundles, deepest first, so each seal covers already-signed 
contents
+       for b in ${bundles[@]+"${bundles[@]}"}; do
+               [ "$b" = "$app" ] && continue
+               sign_one "$b"
+               echo "    sealed nested bundle: ${b#"$app"/}"
+       done
+
+       # 3. the app bundle itself
+       sign_one "$app"
+       echo "    sealed $app"
+       report "$app"
+}
+
+for target in "${TARGETS[@]}"; do
+       [ -e "$target" ] || { echo "no such path: $target" >&2; exit 1; }
+       case "$target" in
+               *.dmg)
+                       if [ "$VERIFY_ONLY" = yes ]; then report "$target"; 
continue; fi
+                       # A .dmg is signed as a whole; the .app inside must 
already be signed.
+                       if [ "$IDENTITY" = "-" ]; then
+                               echo "refusing to ad-hoc sign a .dmg 
(pointless); pass -i <Developer ID>" >&2
+                               exit 1
+                       fi
+                       codesign --force --sign "$IDENTITY" --timestamp 
"$target"
+                       report "$target"
+                       ;;
+               *)
+                       if [ "$VERIFY_ONLY" = yes ]; then report "$target"; 
continue; fi
+                       sign_app "$target"
+                       ;;
+       esac
+done
diff --git a/main/solenv/bin/modules/installer/scriptitems.pm 
b/main/solenv/bin/modules/installer/scriptitems.pm
index fe002f4a30..9d931573b9 100644
--- a/main/solenv/bin/modules/installer/scriptitems.pm
+++ b/main/solenv/bin/modules/installer/scriptitems.pm
@@ -1713,12 +1713,20 @@ sub add_License_Files_into_Installdir
                                $newfile->{'modules'} = 
$installer::globals::rootbrandpackage;
                        }
 
-                       push(@newfilesarray, $newfile);
+                       # On Mac OS X the installation root is the bundle's 
Contents
+                       # directory, where only the entries defined by Apple 
may live --
+                       # a stray LICENSE or README there makes the bundle 
unsignable.
+                       # The copy in the installation set (the .dmg root, 
below) is the
+                       # one users actually see anyway.
+                       if ( ! $installer::globals::ismacosx )
+                       {
+                               push(@newfilesarray, $newfile);
 
-            $installer::logger::Lang->printf(
-                "New files: Adding file %s for the installation root to the 
file list. Language: %s\n",
-                $newfilename,
-                $defaultlanguage);
+                               $installer::logger::Lang->printf(
+                                       "New files: Adding file %s for the 
installation root to the file list. Language: %s\n",
+                                       $newfilename,
+                                       $defaultlanguage);
+                       }
 
                        if ( defined $newfile->{'InstallName'} )
                        {
diff --git a/main/solenv/bin/modules/installer/simplepackage.pm 
b/main/solenv/bin/modules/installer/simplepackage.pm
index 63b78932c3..4e94abf12b 100644
--- a/main/solenv/bin/modules/installer/simplepackage.pm
+++ b/main/solenv/bin/modules/installer/simplepackage.pm
@@ -541,11 +541,33 @@ sub create_package
                        chdir $localfrom;
                }
 
-               $systemcall = "cd $localtempdir && hdiutil makehybrid -hfs 
-hfs-openfolder $folder $folder -hfs-volume-name \"$volume_name\" -ov -o 
$installdir/tmp && hdiutil convert -ov -format UDZO $installdir/tmp.dmg -o 
$archive && ";
+               # Code-sign the .app before it is sealed into the .dmg. Opt-in: 
without
+               # MACOSX_CODESIGNING_IDENTITY the installation set is left as 
it was.
+               if ( $ENV{'MACOSX_CODESIGNING_IDENTITY'} )
+               {
+                       my $signscript = $ENV{'SOLARENV'} . 
"/bin/macosx-codesign.sh";
+                       foreach my $appdir ( 
glob("$localtempdir/$folder/*.app") )
+                       {
+                               my $signcall = "$signscript -i 
\"$ENV{'MACOSX_CODESIGNING_IDENTITY'}\" \"$appdir\"";
+                               my $signreturn = system($signcall);
+                               if ( $signreturn ) { 
installer::exiter::exit_program("ERROR: Could not code-sign $appdir!", 
"create_package"); }
+                               $installer::logger::Lang->print("Success: 
Code-signed $appdir\n");
+                       }
+               }
+
+               # "hdiutil makehybrid -hfs" stamps an (empty) 
com.apple.FinderInfo onto
+               # every file in the image, which makes "codesign --verify 
--strict"
+               # reject the signed application inside the .dmg and would fail
+               # notarization. "hdiutil create -srcfolder" copies the files as 
they
+               # are. (The -hfs-openfolder auto-open it also did is not 
supported on
+               # Apple Silicon any more: bless refuses it.)
+               # "-fs HFS+" is not optional: left to itself "hdiutil create" 
makes an
+               # APFS image on recent macOS, which will not mount before 10.12.
+               # "makehybrid -hfs" always produced HFS+.
+               $systemcall = "cd $localtempdir && hdiutil create -srcfolder 
$folder -volname \"$volume_name\" -fs HFS+ -format UDZO -ov $archive";
         if (( $ref ne "" ) && ( $$ref ne "" )) {
-                       $systemcall .= "hdiutil unflatten $archive && Rez -a 
$$ref -o $archive && hdiutil flatten $archive &&";
+                       $systemcall .= " && hdiutil unflatten $archive && Rez 
-a $$ref -o $archive && hdiutil flatten $archive";
                }
-               $systemcall .= "rm -f $installdir/tmp.dmg";
        }
        else
        {
@@ -581,6 +603,25 @@ sub create_package
                {
                        $infoline = "Success: Executed \"$systemcall\" 
successfully!\n";
                        $installer::logger::Lang->print($infoline);
+                       # Sign the finished disk image. This completes the 
chain: the .app
+                       # inside was signed before the image was built, and the 
image itself
+                       # is signed here. It has to happen at this point rather 
than earlier -
+                       # the Rez step above rewrites the image to attach the 
license
+                       # resource, and that would invalidate a signature 
applied before it.
+                       #
+                       # Skipped for an ad-hoc identity: an ad-hoc signed .dmg 
buys nothing
+                       # (Gatekeeper rejects it either way) and 
macosx-codesign.sh refuses
+                       # it outright, which would turn a working ad-hoc build 
into an error.
+                       if (( $archive =~ /dmg$/ ) &&
+                           ( $ENV{'MACOSX_CODESIGNING_IDENTITY'} ) &&
+                           ( $ENV{'MACOSX_CODESIGNING_IDENTITY'} ne "-" ))
+                       {
+                               my $signscript = $ENV{'SOLARENV'} . 
"/bin/macosx-codesign.sh";
+                               my $signcall = "$signscript -i 
\"$ENV{'MACOSX_CODESIGNING_IDENTITY'}\" \"$archive\"";
+                               my $signreturn = system($signcall);
+                               if ( $signreturn ) { 
installer::exiter::exit_program("ERROR: Could not code-sign $archive!", 
"create_package"); }
+                               $installer::logger::Lang->print("Success: 
Code-signed $archive\n");
+                       }
                }
        }
 
diff --git a/main/solenv/inc/unxmacc.mk b/main/solenv/inc/unxmacc.mk
index 5f2d00fbda..9cb1c134e4 100644
--- a/main/solenv/inc/unxmacc.mk
+++ b/main/solenv/inc/unxmacc.mk
@@ -185,6 +185,7 @@ LINKFLAGSRUNPATH_UREBIN=
 LINKFLAGSRUNPATH_OOO=-install_name '@_______OOO/$(@:f)'
 LINKFLAGSRUNPATH_SDK=
 LINKFLAGSRUNPATH_BRAND=
+LINKFLAGSRUNPATH_BRANDBIN=
 LINKFLAGSRUNPATH_OXT=
 LINKFLAGSRUNPATH_BOXT=
 LINKFLAGSRUNPATH_NONE=-install_name '@_______NONE/$(@:f)'
diff --git a/main/solenv/inc/unxmacx.mk b/main/solenv/inc/unxmacx.mk
index 0980e03e27..13dfaa9b13 100644
--- a/main/solenv/inc/unxmacx.mk
+++ b/main/solenv/inc/unxmacx.mk
@@ -194,6 +194,7 @@ LINKFLAGSRUNPATH_UREBIN=
 LINKFLAGSRUNPATH_OOO=-install_name '@_______OOO/$(@:f)'
 LINKFLAGSRUNPATH_SDK=
 LINKFLAGSRUNPATH_BRAND=
+LINKFLAGSRUNPATH_BRANDBIN=
 LINKFLAGSRUNPATH_OXT=
 LINKFLAGSRUNPATH_BOXT=
 LINKFLAGSRUNPATH_NONE=-install_name '@_______NONE/$(@:f)'

Reply via email to