From 039d1429f58fba9179689b4e278f9a7dfae7300f Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Mon, 29 Aug 2022 12:53:08 -0300 Subject: [PATCH] Build an installer dmg --- CMakeLists.txt | 4 +-- cmake/gui.cmake | 14 ++++----- cmake/macos.cmake | 55 +++++++++++++++++++++++++++--------- contrib/mac.sh | 9 ++++-- contrib/macos/notarize.py.in | 7 +++-- contrib/macos/sign.sh.in | 4 ++- 6 files changed, 65 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b1152a761..d987714a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,7 +32,7 @@ project(lokinet if(APPLE) # Apple build number: must be incremented to submit a new build for the same lokinet version, # should be reset to 0 when the lokinet version increments. - set(LOKINET_APPLE_BUILD 1) + set(LOKINET_APPLE_BUILD 3) endif() set(RELEASE_MOTTO "Our Lord And Savior" CACHE STRING "Release motto") @@ -319,6 +319,6 @@ if(NOT TARGET uninstall) endif() -if(BUILD_PACKAGE) +if(BUILD_PACKAGE AND NOT APPLE) include(cmake/installer.cmake) endif() diff --git a/cmake/gui.cmake b/cmake/gui.cmake index f0ba30516..32dc93116 100644 --- a/cmake/gui.cmake +++ b/cmake/gui.cmake @@ -31,19 +31,19 @@ if (BUILD_GUI) if(APPLE) add_custom_target(assemble_gui ALL DEPENDS assemble lokinet-gui - COMMAND mkdir "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Helpers" - COMMAND cp -a "${PROJECT_SOURCE_DIR}/gui/release/mac/Lokinet-GUI.app" "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Helpers/" - COMMAND mkdir -p "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Resources/en.lproj" - COMMAND cp "${PROJECT_SOURCE_DIR}/contrib/macos/InfoPlist.strings" "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Resources/en.lproj/" - COMMAND cp "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Resources/icon.icns" "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Helpers/Lokinet-GUI.app/Contents/Resources/icon.icns" - COMMAND cp "${PROJECT_SOURCE_DIR}/contrib/macos/InfoPlist.strings" "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Helpers/Lokinet-GUI.app/Contents/Resources/en.lproj/" + COMMAND mkdir "${lokinet_app}/Contents/Helpers" + COMMAND cp -a "${PROJECT_SOURCE_DIR}/gui/release/mac/Lokinet-GUI.app" "${lokinet_app}/Contents/Helpers/" + COMMAND mkdir -p "${lokinet_app}/Contents/Resources/en.lproj" + COMMAND cp "${PROJECT_SOURCE_DIR}/contrib/macos/InfoPlist.strings" "${lokinet_app}/Contents/Resources/en.lproj/" + COMMAND cp "${lokinet_app}/Contents/Resources/icon.icns" "${lokinet_app}/Contents/Helpers/Lokinet-GUI.app/Contents/Resources/icon.icns" + COMMAND cp "${PROJECT_SOURCE_DIR}/contrib/macos/InfoPlist.strings" "${lokinet_app}/Contents/Helpers/Lokinet-GUI.app/Contents/Resources/en.lproj/" COMMAND /usr/libexec/PlistBuddy -c "Delete :CFBundleDisplayName" -c "Add :LSHasLocalizedDisplayName bool true" -c "Add :CFBundleDevelopmentRegion string en" -c "Set :CFBundleShortVersionString ${lokinet_VERSION}" -c "Set :CFBundleVersion ${lokinet_VERSION}.${LOKINET_APPLE_BUILD}" - "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Helpers/Lokinet-GUI.app/Contents/Info.plist" + "${lokinet_app}/Contents/Helpers/Lokinet-GUI.app/Contents/Info.plist" ) elseif(WIN32) diff --git a/cmake/macos.cmake b/cmake/macos.cmake index 4b81c3c8d..afc984964 100644 --- a/cmake/macos.cmake +++ b/cmake/macos.cmake @@ -68,6 +68,11 @@ endif() message(STATUS "Using ${CODESIGN_PROFILE} provisioning profile") + +set(lokinet_installer "${PROJECT_BINARY_DIR}/Lokinet Installer") +set(lokinet_app "${lokinet_installer}/Lokinet.app") + + if(MACOS_SYSTEM_EXTENSION) set(lokinet_ext_dir Contents/Library/SystemExtensions) else() @@ -112,6 +117,33 @@ else() add_custom_target(notarize DEPENDS sign COMMAND "true") endif() +set(mac_icon "${PROJECT_BINARY_DIR}/lokinet.icns") +add_custom_command(OUTPUT "${mac_icon}" + COMMAND ${PROJECT_SOURCE_DIR}/contrib/macos/mk-icns.sh ${PROJECT_SOURCE_DIR}/contrib/lokinet-mac.svg "${mac_icon}" + DEPENDS ${PROJECT_SOURCE_DIR}/contrib/lokinet.svg ${PROJECT_SOURCE_DIR}/contrib/macos/mk-icns.sh) +add_custom_target(icon DEPENDS "${mac_icon}") + +if(BUILD_PACKAGE) + add_custom_command(OUTPUT "${lokinet_installer}.dmg" + DEPENDS notarize + COMMAND create-dmg + --volname "Lokinet Installer" + --volicon lokinet.icns + #--background ... FIXME + --text-size 16 + --icon-size 128 + --window-size 500 300 + --icon Lokinet.app 100 100 + --hide-extension Lokinet.app + --app-drop-link 350 100 + --eula "${PROJECT_SOURCE_DIR}/LICENSE" + --no-internet-enable + "${lokinet_installer}.dmg" + "${lokinet_installer}" + ) + add_custom_target(package DEPENDS "${lokinet_installer}.dmg") +endif() + # Called later to set things up, after the main lokinet targets are set up function(macos_target_setup) @@ -140,12 +172,6 @@ function(macos_target_setup) $/Contents/Resources/bootstrap.signed ) - set(mac_icon ${PROJECT_BINARY_DIR}/lokinet.icns) - add_custom_command(OUTPUT ${mac_icon} - COMMAND ${PROJECT_SOURCE_DIR}/contrib/macos/mk-icns.sh ${PROJECT_SOURCE_DIR}/contrib/lokinet-mac.svg ${mac_icon} - DEPENDS ${PROJECT_SOURCE_DIR}/contrib/lokinet.svg ${PROJECT_SOURCE_DIR}/contrib/macos/mk-icns.sh) - add_custom_target(icon DEPENDS ${mac_icon}) - add_dependencies(lokinet lokinet-extension icon) @@ -162,15 +188,18 @@ function(macos_target_setup) add_custom_target(assemble ALL DEPENDS lokinet lokinet-extension icon copy_prov_prof copy_bootstrap - COMMAND rm -rf "${PROJECT_BINARY_DIR}/Lokinet.app" - COMMAND cp -a $ "${PROJECT_BINARY_DIR}/Lokinet.app" - COMMAND mkdir -p "${PROJECT_BINARY_DIR}/Lokinet.app/${lokinet_ext_dir}" - COMMAND cp -a $ "${PROJECT_BINARY_DIR}/Lokinet.app/${lokinet_ext_dir}/" - COMMAND mkdir -p "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Resources" - COMMAND cp -a "${mac_icon}" "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Resources/icon.icns" + COMMAND rm -rf "${lokinet_app}" + COMMAND mkdir -p "${lokinet_installer}" + COMMAND cp -a $ "${lokinet_app}" + COMMAND mkdir -p "${lokinet_app}/${lokinet_ext_dir}" + COMMAND cp -a $ "${lokinet_app}/${lokinet_ext_dir}/" + COMMAND mkdir -p "${lokinet_app}/Contents/Resources" + COMMAND cp -a "${mac_icon}" "${lokinet_app}/Contents/Resources/icon.icns" ) - if(CODESIGN) + if(CODESIGN AND BUILD_GUI) + add_dependencies(sign assemble_gui) + elseif(CODESIGN) add_dependencies(sign assemble) endif() endfunction() diff --git a/contrib/mac.sh b/contrib/mac.sh index 11295d778..6ddb89f04 100755 --- a/contrib/mac.sh +++ b/contrib/mac.sh @@ -8,7 +8,8 @@ # set -e -set +x +set -x + if ! [ -f LICENSE ] || ! [ -d llarp ]; then echo "You need to run this as ./contrib/mac.sh from the top-level lokinet project directory" fi @@ -29,8 +30,10 @@ cmake \ -DBUILD_PACKAGE=ON \ "$@" \ .. -ninja -j1 notarize +ninja -j1 package + +cd .. echo -e "Build complete, your app is here:\n" -ls -lad $(pwd)/Lokinet.app +ls -lad $(pwd)/build-mac/Lokinet\ Installer* echo "" diff --git a/contrib/macos/notarize.py.in b/contrib/macos/notarize.py.in index a9be5af41..b35cee2d9 100755 --- a/contrib/macos/notarize.py.in +++ b/contrib/macos/notarize.py.in @@ -23,8 +23,8 @@ if not all(("@MACOS_NOTARIZE_USER@", "@MACOS_NOTARIZE_PASS@", "@MACOS_NOTARIZE_A sys.exit(1) os.chdir("@PROJECT_BINARY_DIR@") -app = "Lokinet.app" -zipfile = f"{app}.notarize.zip" +app = "@lokinet_app@" +zipfile = f"Lokinet.app.notarize.zip" print(f"Creating {zipfile} from {app}") if os.path.exists(zipfile): os.remove(zipfile) @@ -107,4 +107,7 @@ result = subprocess.run(['xcrun', 'stapler', 'staple', app]) result.check_returncode() +with open("macos-notarized.stamp", 'w'): + pass + print(" success.\n") diff --git a/contrib/macos/sign.sh.in b/contrib/macos/sign.sh.in index 73abd945c..ae0cff037 100755 --- a/contrib/macos/sign.sh.in +++ b/contrib/macos/sign.sh.in @@ -26,7 +26,7 @@ gui_entitlements="@PROJECT_SOURCE_DIR@/gui/node_modules/app-builder-lib/template ext_entitlements="@PROJECT_SOURCE_DIR@/contrib/macos/lokinet-extension.@LOKINET_ENTITLEMENTS_TYPE@.entitlements.plist" app_entitlements="@PROJECT_SOURCE_DIR@/contrib/macos/lokinet.@LOKINET_ENTITLEMENTS_TYPE@.entitlements.plist" -SIGN_TARGET="@PROJECT_BINARY_DIR@/Lokinet.app" +SIGN_TARGET="@PROJECT_BINARY_DIR@/Lokinet Installer/Lokinet.app" for ext in systemextension appex; do netext="$SIGN_TARGET/@lokinet_ext_dir@/org.lokinet.network-extension.$ext" @@ -70,3 +70,5 @@ if [ "@BUILD_GUI@" == "ON" ]; then fi signit "$SIGN_TARGET" "$app_entitlements" + +touch "@PROJECT_BINARY_DIR@"/macos-signed.stamp