#!/bin/bash set -x # Function to retrieve a value from a plist function plist { /usr/libexec/PlistBuddy -c "Print ${2}" "${1}" } # Function to notarize a file (APP or DMG) function notarize { # Bail if not signing if [ -z "${SIGNING}" ] then return fi # Create temporary output file OUTPUT=$(mktemp /tmp/notarization-XXXX) trap "cat '${OUTPUT}' ; rm '${OUTPUT}'" EXIT # Send the app off for notarization xcrun altool --notarize-app \ --primary-bundle-id "${IDENT}" \ --file "${1}" \ --username "${NOTARIZE_USERNAME}" \ --password "${NOTARIZE_PASSWORD}" \ --output-format xml \ >"${OUTPUT}" # Bail if notarization failed if [ ${?} -ne 0 ] then exit 1 fi # Extract the request UUID from the output plist REQ=$(plist "${OUTPUT}" "notarization-upload:RequestUUID") # Poll until the request is complete for ((;;)) do # Sleep a bit sleep 15s # Ask for request status xcrun altool --notarization-info "${REQ}" \ --username "${NOTARIZE_USERNAME}" \ --password "${NOTARIZE_PASSWORD}" \ --output-format xml \ >"${OUTPUT}" if [ ${?} -ne 0 ] then exit 1 fi # Extract the current status and stop polling if it's no longer in progress STATUS=$(plist "${OUTPUT}" "notarization-info:Status") if [ "${STATUS}" != "in progress" ] then break fi done # Bail if the notarization wasn't successful if [ "${STATUS}" != "success" ] then exit 1 fi # Cleanup trap EXIT rm "${OUTPUT}" } # Setup VERSION=`awk '/^#define+ AUDACITY_VERSION / {print $3}' build/Info.plist.h` RELEASE=`awk '/^#define+ AUDACITY_RELEASE / {print $3}' build/Info.plist.h` REVISION=`awk '/^#define+ AUDACITY_REVISION / {print $3}' build/Info.plist.h` VERSION=$VERSION.$RELEASE.$REVISION IDENT=$(plist "${INSTALL_ROOT}/Audacity.app/Contents/Info.plist" "CFBundleIdentifier") # # This depends on a file in the builders HOME directory called ".audacity_signing" that # contains the following four lines with the appropriate values specified. If the file # doesn't exist or one of the values is missing the distribution will be built unsigned # and unnotarized. # # CODESIGN_APP_IDENTITY="Developer ID Application:" # NOTARIZE_USERNAME="specify your Apple developer email address" # NOTARIZE_PASSWORD="@keychain:APP_PASSWORD" # # For information on how to create that APP_PASSWORD in your keychain, refer to: # # https://support.apple.com/guide/keychain-access/add-a-password-to-a-keychain-kyca1120/mac # # You generate the app-specific password in your Apple developer account and you must specify # "org.audacityteam.audacity" as the application identifier. # SIGNING= if [ -r ~/.audacity_signing ] then source ~/.audacity_signing if [ -n "${CODESIGN_APP_IDENTITY}" -a -n "${NOTARIZE_USERNAME}" -a -n "${NOTARIZE_PASSWORD}" ] then SIGNING="y" fi fi VOL="Audacity $VERSION" DMG="audacity-macos-$VERSION" echo "Audacity has been installed to: ${DSTROOT}" cd "${DSTROOT}/.." # Make sure we have consistent ownership and permissions chmod -RH "${INSTALL_MODE_FLAG}" "${TARGET_BUILD_DIR}" chown -RH "${INSTALL_OWNER}:${INSTALL_GROUP}" "${TARGET_BUILD_DIR}" # Preclean rm -rf "$DMG" "$DMG.dmg" TMP.dmg # Sign and notarize the app if [ -n "${SIGNING}" ] then xcrun codesign --force \ --deep \ --verbose \ --timestamp \ --identifier "${IDENT}" \ --options runtime \ --entitlements "${SRCROOT}/${CODE_SIGN_ENTITLEMENTS}" \ --sign "${CODESIGN_APP_IDENTITY}" \ "${DSTROOT}/Audacity.app" # Create the ZIP archive for notarization xcrun ditto -c -k --keepParent "${DSTROOT}" "${DSTROOT}.zip" # Send it off for notarization notarize "${DSTROOT}.zip" # Remove the zip file rm "${DSTROOT}.zip" # Staple the app stapler staple "${DSTROOT}/Audacity.app" fi # Create structure mkdir "$DMG" cp -pR "${DSTROOT}/" "${DMG}" #Add a custom icon for the DMG #cp -p mac/Resources/Audacity.icns "${DMG}"/.VolumeIcon.icns # Make sure it's not already attached ATTACHED=$(hdiutil info | awk "/\/Volumes\/${VOL}/{print \$1}") if [ -n "${ATTACHED}" ] then hdiutil detach "${ATTACHED}" fi # Create and mount the image hdiutil create -ov -format UDRW -srcdir "$DMG" -fs HFS+ -volname "$VOL" TMP.dmg if [ $? -ne 0 ] then echo "Create failed" exit 1 fi #Mount the DMG and store the name it was mounted with TITLE=$(hdiutil attach TMP.dmg | grep \/Volumes | sed "s/^.*\/Volumes\///") if [ $? -ne 0 ] then echo "Attach failed" exit 1 fi # And wait for it to show up in Finder osascript <