# CMake script to sign macOS build # Arguments: # APP_IDENTIFIER - app identifier # APP_LOCATION - the path to Tenacity.app # DMG_LOCATION - the path to Tenacity dmg package # APPLE_NOTARIZATION_USER_NAME - notarization user name # APPLE_NOTARIZATION_PASSWORD - notarization password # https://cmake.org/cmake/help/latest/policy/CMP0054.html cmake_policy( SET CMP0054 NEW ) # https://cmake.org/cmake/help/latest/policy/CMP0011.html cmake_policy( SET CMP0011 NEW ) function( get_plist_value output path key ) execute_process( COMMAND /usr/libexec/PlistBuddy -c "Print ${key}" "${path}" OUTPUT_VARIABLE result ) string( STRIP ${result} result ) set( ${output} ${result} PARENT_SCOPE ) endfunction() if( APP_LOCATION ) get_filename_component( temp_dir "${APP_LOCATION}/.." ABSOLUTE ) else() get_filename_component( temp_dir "${DMG_LOCATION}" DIRECTORY ) endif() set( temp_plist "${temp_dir}/NotarizationResult.plist" ) function( notarize path ) message( STATUS "Notarizing ${path}" ) execute_process( COMMAND xcrun altool --notarize-app --primary-bundle-id "${APP_IDENTIFIER}" --file "${path}" --username "${APPLE_NOTARIZATION_USER_NAME}" --password "${APPLE_NOTARIZATION_PASSWORD}" --output-format xml OUTPUT_VARIABLE result ) file( WRITE ${temp_plist} ${result} ) get_plist_value( req_id ${temp_plist} "notarization-upload:RequestUUID" ) message( STATUS "\t Request ID: '${req_id}'" ) set( success Off ) while( NOT success ) execute_process(COMMAND ${CMAKE_COMMAND} -E sleep 15) execute_process( COMMAND xcrun altool --notarization-info ${req_id} --username ${APPLE_NOTARIZATION_USER_NAME} --password ${APPLE_NOTARIZATION_PASSWORD} --output-format xml OUTPUT_VARIABLE result ) file( WRITE ${temp_plist} ${result} ) get_plist_value( notarization_result ${temp_plist} "notarization-info:Status" ) message( STATUS "\t Status: ${notarization_result}" ) if( NOT "${notarization_result}" STREQUAL "in progress" ) if ( NOT "${notarization_result}" STREQUAL "success" ) message(FATAL_ERROR "Notarization failed:\n${result}\n") else() message(STATUS "Notarization successfull") endif() break() endif() endwhile() endfunction() if( DEFINED APP_LOCATION ) get_filename_component( archive "${APP_LOCATION}/../notarization.zip" ABSOLUTE ) execute_process( COMMAND xcrun ditto -c -k --keepParent ${APP_LOCATION} ${archive} ) notarize( ${archive} ) execute_process( COMMAND stapler staple "${APP_LOCATION}" ) file( REMOVE "${APP_LOCATION}/../notarization.zip" ) endif() if( DEFINED DMG_LOCATION ) notarize( ${DMG_LOCATION} ) execute_process( COMMAND stapler staple "${DMG_LOCATION}" ) endif() file( REMOVE ${temp_plist} )