diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 0c28ea84..090b9e1f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -122,7 +122,20 @@ jobs:
if: ${{ !matrix.n3ds }}
run: |
cd build
- cpack .
+ success=0
+ max_tries=10
+ for i in $(seq $max_tries); do
+ cpack . && success=1
+ if test $success = 1; then
+ break
+ fi
+ echo "Package creation failed. Sleep 1 second and try again."
+ sleep 1
+ done
+ if test $success = 0; then
+ echo "Package creation failed after $max_tries attempts."
+ exit 1
+ fi
- name: Install linuxdeploy
if: ${{ matrix.linux }}
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d5f77cde..82360dec 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -707,6 +707,7 @@ if (NOT (NINTENDO_3DS OR WINDOWS_STORE))
install(TARGETS isle ${install_extra_targets}
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ BUNDLE DESTINATION "."
)
endif()
if (ISLE_BUILD_CONFIG)
@@ -731,6 +732,7 @@ if (ISLE_BUILD_CONFIG)
endif()
install(TARGETS isle-config
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+ BUNDLE DESTINATION "."
)
endif()
if(EMSCRIPTEN)
@@ -802,6 +804,8 @@ if(WINDOWS_STORE)
endif()
if(MSVC)
set(CPACK_GENERATOR ZIP)
+elseif(APPLE AND NOT IOS)
+ set(CPACK_GENERATOR DragNDrop)
else()
set(CPACK_GENERATOR TGZ)
endif()
diff --git a/packaging/CMakeLists.txt b/packaging/CMakeLists.txt
index 3ec9d174..1b178b63 100644
--- a/packaging/CMakeLists.txt
+++ b/packaging/CMakeLists.txt
@@ -24,3 +24,7 @@ endif()
if(WINDOWS_STORE)
add_subdirectory(UWP)
endif()
+
+if(APPLE AND NOT IOS)
+ add_subdirectory(macos)
+endif()
diff --git a/packaging/macos/CMakeLists.txt b/packaging/macos/CMakeLists.txt
new file mode 100644
index 00000000..d6e93db8
--- /dev/null
+++ b/packaging/macos/CMakeLists.txt
@@ -0,0 +1,99 @@
+set(_icon_file AppIcon)
+set(MACOSX_BUNDLE_GUI_IDENTIFIER ${APP_ID})
+set(MACOSX_BUNDLE_COPYRIGHT ${APP_SPDX})
+set(ISLE_TARGET_NAME isle)
+set(MACOSX_ISLE_BUNDLE_NAME ${APP_NAME}) # Do note that it can be up to 15 characters long
+set(MACOSX_ISLE_BUNDLE_DISPLAY_NAME ${APP_NAME})
+set(CONFIG_TARGET_NAME isle-config)
+set(MACOSX_CONFIG_BUNDLE_NAME "Config Isle") # Do note that it can be up to 15 characters long
+set(MACOSX_CONFIG_BUNDLE_DISPLAY_NAME "Configure ${APP_NAME}")
+set(MACOSX_BUNDLE_INFO_STRING ${PROJECT_VERSION})
+set(MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION})
+set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION})
+set(MACOSX_BUNDLE_LONG_VERSION_STRING "Version ${PROJECT_VERSION}")
+
+# TODO: darwin < 9
+set(MACOSX_BUNDLE_REQUIRED_PLATFORM Carbon)
+
+set(CPACK_DMG_VOLUME_NAME "Isle Portable")
+
+if(ISLE_BUILD_APP)
+ configure_file(
+ "${CMAKE_CURRENT_SOURCE_DIR}/isle/Info.plist.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/isle/Info.plist"
+ @ONLY
+ )
+ set(RESOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/isle/${_icon_file}.icns")
+ target_sources(${ISLE_TARGET_NAME} PRIVATE ${RESOURCE_FILES})
+ set_target_properties(${ISLE_TARGET_NAME} PROPERTIES
+ MACOSX_BUNDLE TRUE
+ MACOSX_BUNDLE_ICON_FILE "${_icon_file}.icns"
+ MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_BINARY_DIR}/isle/Info.plist"
+ RESOURCE ${RESOURCE_FILES})
+ install(TARGETS ${ISLE_TARGET_NAME} DESTINATION ./)
+ install(CODE "
+ include(BundleUtilities)
+ fixup_bundle(${CMAKE_BINARY_DIR}/${ISLE_TARGET_NAME}.app \"\" \"\")
+ "
+ COMPONENT Runtime)
+ install(CODE "
+ execute_process(COMMAND /usr/bin/codesign
+ --force --deep --sign - --timestamp
+ \"\$\{CMAKE_INSTALL_PREFIX\}/${ISLE_TARGET_NAME}.app/Contents/MacOS/${ISLE_TARGET_NAME}\")
+ ")
+ install(CODE "
+ file(RENAME
+ \"\$\{CMAKE_INSTALL_PREFIX\}/${ISLE_TARGET_NAME}.app\"
+ \"\$\{CMAKE_INSTALL_PREFIX\}/${MACOSX_ISLE_BUNDLE_DISPLAY_NAME}.app\")
+ ")
+endif()
+if(ISLE_BUILD_CONFIG)
+ configure_file(
+ "${CMAKE_CURRENT_SOURCE_DIR}/config/Info.plist.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/config/Info.plist"
+ @ONLY
+ )
+ set(RESOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/config/${_icon_file}.icns")
+ target_sources(${CONFIG_TARGET_NAME} PRIVATE ${RESOURCE_FILES})
+ set_target_properties(${CONFIG_TARGET_NAME} PROPERTIES
+ MACOSX_BUNDLE TRUE
+ MACOSX_BUNDLE_ICON_FILE "${_icon_file}.icns"
+ MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_BINARY_DIR}/config/Info.plist"
+ RESOURCE ${RESOURCE_FILES})
+ install(TARGETS ${CONFIG_TARGET_NAME} DESTINATION ./)
+ install(CODE "
+ include(BundleUtilities)
+ fixup_bundle(${CMAKE_BINARY_DIR}/${CONFIG_TARGET_NAME}.app \"\" \"\")
+ "
+ COMPONENT Runtime)
+ qt_generate_deploy_app_script(
+ TARGET ${CONFIG_TARGET_NAME}
+ OUTPUT_SCRIPT deploy_script
+ NO_COMPILER_RUNTIME
+ NO_TRANSLATIONS
+ )
+ install(SCRIPT "${deploy_script}")
+ install(CODE "
+ execute_process(COMMAND /usr/bin/install_name_tool
+ -add_rpath \"@executable_path/../Frameworks\"
+ \"\$\{CMAKE_INSTALL_PREFIX\}/${CONFIG_TARGET_NAME}.app/Contents/MacOS/${CONFIG_TARGET_NAME}\")
+ ")
+ install(CODE "
+ execute_process(COMMAND /usr/bin/codesign
+ --force --deep --sign - --timestamp
+ \"\$\{CMAKE_INSTALL_PREFIX\}/${CONFIG_TARGET_NAME}.app/Contents/MacOS/${CONFIG_TARGET_NAME}\")
+ ")
+ install(CODE "
+ file(RENAME
+ \"\$\{CMAKE_INSTALL_PREFIX\}/${CONFIG_TARGET_NAME}.app\"
+ \"\$\{CMAKE_INSTALL_PREFIX\}/${MACOSX_CONFIG_BUNDLE_DISPLAY_NAME}.app\")
+ ")
+endif()
+
+install(CODE "
+ if(IS_DIRECTORY \"\$\{CMAKE_INSTALL_PREFIX\}/bin\" OR IS_DIRECTORY \"\$\{CMAKE_INSTALL_PREFIX\}/lib\" OR EXISTS \"\$\{CMAKE_INSTALL_PREFIX\}/AppIcon.icns\")
+ execute_process(COMMAND /bin/rm
+ -rf \"\$\{CMAKE_INSTALL_PREFIX\}/bin\" \"\$\{CMAKE_INSTALL_PREFIX\}/lib\" \"\$\{CMAKE_INSTALL_PREFIX\}/AppIcon.icns\"
+ )
+ endif()
+")
diff --git a/packaging/macos/config/AppIcon.icns b/packaging/macos/config/AppIcon.icns
new file mode 100644
index 00000000..5b67c48a
Binary files /dev/null and b/packaging/macos/config/AppIcon.icns differ
diff --git a/packaging/macos/config/Info.plist.in b/packaging/macos/config/Info.plist.in
new file mode 100644
index 00000000..d128adc0
--- /dev/null
+++ b/packaging/macos/config/Info.plist.in
@@ -0,0 +1,80 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ ${MACOSX_BUNDLE_EXECUTABLE_NAME}
+ CFBundleGetInfoString
+ @MACOSX_BUNDLE_INFO_STRING@
+ CFBundleIconFile
+ @MACOSX_BUNDLE_ICON_FILE@
+ CFBundleIdentifier
+ @MACOSX_BUNDLE_GUI_IDENTIFIER@
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleLongVersionString
+ @MACOSX_BUNDLE_LONG_VERSION_STRING@
+ CFBundleName
+ @MACOSX_CONFIG_BUNDLE_NAME@
+ CFBundleDisplayName
+ @MACOSX_CONFIG_BUNDLE_DISPLAY_NAME@
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ @MACOSX_BUNDLE_SHORT_VERSION_STRING@
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ @MACOSX_BUNDLE_BUNDLE_VERSION@
+ UILaunchStoryboardName
+ LaunchScreen
+ NSHighResolutionCapable
+
+ CSResourcesFileMapped
+
+ LSRequires@MACOSX_BUNDLE_REQUIRED_PLATFORM@
+
+ NSHumanReadableCopyright
+ @MACOSX_BUNDLE_COPYRIGHT@
+ SDL_FILESYSTEM_BASE_DIR_TYPE
+ resource
+ NSSupportsAutomaticGraphicsSwitching
+
+ UIApplicationSupportsIndirectInputEvents
+
+ LSSupportsOpeningDocumentsInPlace
+
+ UIFileSharingEnabled
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiresFullScreen
+
+ UIStatusBarHidden
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+
+ CFBundleAllowMixedLocalizations
+
+
+
\ No newline at end of file
diff --git a/packaging/macos/isle/AppIcon.icns b/packaging/macos/isle/AppIcon.icns
new file mode 100644
index 00000000..61aa735e
Binary files /dev/null and b/packaging/macos/isle/AppIcon.icns differ
diff --git a/packaging/macos/isle/Info.plist.in b/packaging/macos/isle/Info.plist.in
new file mode 100644
index 00000000..2ca3d26e
--- /dev/null
+++ b/packaging/macos/isle/Info.plist.in
@@ -0,0 +1,82 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ ${MACOSX_BUNDLE_EXECUTABLE_NAME}
+ CFBundleGetInfoString
+ @MACOSX_BUNDLE_INFO_STRING@
+ CFBundleIconFile
+ @MACOSX_BUNDLE_ICON_FILE@
+ CFBundleIdentifier
+ @MACOSX_BUNDLE_GUI_IDENTIFIER@
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleLongVersionString
+ @MACOSX_BUNDLE_LONG_VERSION_STRING@
+ CFBundleName
+ @MACOSX_ISLE_BUNDLE_NAME@
+ CFBundleDisplayName
+ @MACOSX_ISLE_BUNDLE_DISPLAY_NAME@
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ @MACOSX_BUNDLE_SHORT_VERSION_STRING@
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ @MACOSX_BUNDLE_BUNDLE_VERSION@
+ UILaunchStoryboardName
+ LaunchScreen
+ NSHighResolutionCapable
+
+ CSResourcesFileMapped
+
+ LSRequires@MACOSX_BUNDLE_REQUIRED_PLATFORM@
+
+ NSHumanReadableCopyright
+ @MACOSX_BUNDLE_COPYRIGHT@
+ SDL_FILESYSTEM_BASE_DIR_TYPE
+ resource
+ NSSupportsAutomaticGraphicsSwitching
+
+ UIApplicationSupportsIndirectInputEvents
+
+ LSSupportsOpeningDocumentsInPlace
+
+ UIFileSharingEnabled
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiresFullScreen
+
+ UIStatusBarHidden
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+
+ CFBundleAllowMixedLocalizations
+
+ LSApplicationCategoryType
+ public.app-category.games
+
+
\ No newline at end of file