Build an installer dmg

pull/1983/head
Jason Rhinelander 2 years ago
parent 182f1dccb9
commit 039d1429f5

@ -32,7 +32,7 @@ project(lokinet
if(APPLE) if(APPLE)
# Apple build number: must be incremented to submit a new build for the same lokinet version, # 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. # should be reset to 0 when the lokinet version increments.
set(LOKINET_APPLE_BUILD 1) set(LOKINET_APPLE_BUILD 3)
endif() endif()
set(RELEASE_MOTTO "Our Lord And Savior" CACHE STRING "Release motto") set(RELEASE_MOTTO "Our Lord And Savior" CACHE STRING "Release motto")
@ -319,6 +319,6 @@ if(NOT TARGET uninstall)
endif() endif()
if(BUILD_PACKAGE) if(BUILD_PACKAGE AND NOT APPLE)
include(cmake/installer.cmake) include(cmake/installer.cmake)
endif() endif()

@ -31,19 +31,19 @@ if (BUILD_GUI)
if(APPLE) if(APPLE)
add_custom_target(assemble_gui ALL add_custom_target(assemble_gui ALL
DEPENDS assemble lokinet-gui DEPENDS assemble lokinet-gui
COMMAND mkdir "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Helpers" COMMAND mkdir "${lokinet_app}/Contents/Helpers"
COMMAND cp -a "${PROJECT_SOURCE_DIR}/gui/release/mac/Lokinet-GUI.app" "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Helpers/" COMMAND cp -a "${PROJECT_SOURCE_DIR}/gui/release/mac/Lokinet-GUI.app" "${lokinet_app}/Contents/Helpers/"
COMMAND mkdir -p "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Resources/en.lproj" COMMAND mkdir -p "${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_SOURCE_DIR}/contrib/macos/InfoPlist.strings" "${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 "${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" "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Helpers/Lokinet-GUI.app/Contents/Resources/en.lproj/" COMMAND cp "${PROJECT_SOURCE_DIR}/contrib/macos/InfoPlist.strings" "${lokinet_app}/Contents/Helpers/Lokinet-GUI.app/Contents/Resources/en.lproj/"
COMMAND /usr/libexec/PlistBuddy COMMAND /usr/libexec/PlistBuddy
-c "Delete :CFBundleDisplayName" -c "Delete :CFBundleDisplayName"
-c "Add :LSHasLocalizedDisplayName bool true" -c "Add :LSHasLocalizedDisplayName bool true"
-c "Add :CFBundleDevelopmentRegion string en" -c "Add :CFBundleDevelopmentRegion string en"
-c "Set :CFBundleShortVersionString ${lokinet_VERSION}" -c "Set :CFBundleShortVersionString ${lokinet_VERSION}"
-c "Set :CFBundleVersion ${lokinet_VERSION}.${LOKINET_APPLE_BUILD}" -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) elseif(WIN32)

@ -68,6 +68,11 @@ endif()
message(STATUS "Using ${CODESIGN_PROFILE} provisioning profile") 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) if(MACOS_SYSTEM_EXTENSION)
set(lokinet_ext_dir Contents/Library/SystemExtensions) set(lokinet_ext_dir Contents/Library/SystemExtensions)
else() else()
@ -112,6 +117,33 @@ else()
add_custom_target(notarize DEPENDS sign COMMAND "true") add_custom_target(notarize DEPENDS sign COMMAND "true")
endif() 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 # Called later to set things up, after the main lokinet targets are set up
function(macos_target_setup) function(macos_target_setup)
@ -140,12 +172,6 @@ function(macos_target_setup)
$<TARGET_BUNDLE_DIR:lokinet-extension>/Contents/Resources/bootstrap.signed $<TARGET_BUNDLE_DIR:lokinet-extension>/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) add_dependencies(lokinet lokinet-extension icon)
@ -162,15 +188,18 @@ function(macos_target_setup)
add_custom_target(assemble ALL add_custom_target(assemble ALL
DEPENDS lokinet lokinet-extension icon copy_prov_prof copy_bootstrap DEPENDS lokinet lokinet-extension icon copy_prov_prof copy_bootstrap
COMMAND rm -rf "${PROJECT_BINARY_DIR}/Lokinet.app" COMMAND rm -rf "${lokinet_app}"
COMMAND cp -a $<TARGET_BUNDLE_DIR:lokinet> "${PROJECT_BINARY_DIR}/Lokinet.app" COMMAND mkdir -p "${lokinet_installer}"
COMMAND mkdir -p "${PROJECT_BINARY_DIR}/Lokinet.app/${lokinet_ext_dir}" COMMAND cp -a $<TARGET_BUNDLE_DIR:lokinet> "${lokinet_app}"
COMMAND cp -a $<TARGET_BUNDLE_DIR:lokinet-extension> "${PROJECT_BINARY_DIR}/Lokinet.app/${lokinet_ext_dir}/" COMMAND mkdir -p "${lokinet_app}/${lokinet_ext_dir}"
COMMAND mkdir -p "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Resources" COMMAND cp -a $<TARGET_BUNDLE_DIR:lokinet-extension> "${lokinet_app}/${lokinet_ext_dir}/"
COMMAND cp -a "${mac_icon}" "${PROJECT_BINARY_DIR}/Lokinet.app/Contents/Resources/icon.icns" 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) add_dependencies(sign assemble)
endif() endif()
endfunction() endfunction()

@ -8,7 +8,8 @@
# #
set -e set -e
set +x set -x
if ! [ -f LICENSE ] || ! [ -d llarp ]; then if ! [ -f LICENSE ] || ! [ -d llarp ]; then
echo "You need to run this as ./contrib/mac.sh from the top-level lokinet project directory" echo "You need to run this as ./contrib/mac.sh from the top-level lokinet project directory"
fi fi
@ -29,8 +30,10 @@ cmake \
-DBUILD_PACKAGE=ON \ -DBUILD_PACKAGE=ON \
"$@" \ "$@" \
.. ..
ninja -j1 notarize ninja -j1 package
cd ..
echo -e "Build complete, your app is here:\n" echo -e "Build complete, your app is here:\n"
ls -lad $(pwd)/Lokinet.app ls -lad $(pwd)/build-mac/Lokinet\ Installer*
echo "" echo ""

@ -23,8 +23,8 @@ if not all(("@MACOS_NOTARIZE_USER@", "@MACOS_NOTARIZE_PASS@", "@MACOS_NOTARIZE_A
sys.exit(1) sys.exit(1)
os.chdir("@PROJECT_BINARY_DIR@") os.chdir("@PROJECT_BINARY_DIR@")
app = "Lokinet.app" app = "@lokinet_app@"
zipfile = f"{app}.notarize.zip" zipfile = f"Lokinet.app.notarize.zip"
print(f"Creating {zipfile} from {app}") print(f"Creating {zipfile} from {app}")
if os.path.exists(zipfile): if os.path.exists(zipfile):
os.remove(zipfile) os.remove(zipfile)
@ -107,4 +107,7 @@ result = subprocess.run(['xcrun', 'stapler', 'staple', app])
result.check_returncode() result.check_returncode()
with open("macos-notarized.stamp", 'w'):
pass
print(" success.\n") print(" success.\n")

@ -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" 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" 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 for ext in systemextension appex; do
netext="$SIGN_TARGET/@lokinet_ext_dir@/org.lokinet.network-extension.$ext" netext="$SIGN_TARGET/@lokinet_ext_dir@/org.lokinet.network-extension.$ext"
@ -70,3 +70,5 @@ if [ "@BUILD_GUI@" == "ON" ]; then
fi fi
signit "$SIGN_TARGET" "$app_entitlements" signit "$SIGN_TARGET" "$app_entitlements"
touch "@PROJECT_BINARY_DIR@"/macos-signed.stamp

Loading…
Cancel
Save