diff --git a/CMakeLists.txt b/CMakeLists.txt
index f9669bad..7c7ea9d8 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)
@@ -767,6 +769,8 @@ if(WINDOWS_STORE)
endif()
if(MSVC)
set(CPACK_GENERATOR ZIP)
+elseif(APPLE)
+ 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..5a2229db
--- /dev/null
+++ b/packaging/macos/CMakeLists.txt
@@ -0,0 +1,57 @@
+set(_icon_file AppIcon)
+set(MACOSX_BUNDLE_GUI_IDENTIFIER ${APP_ID})
+set(MACOSX_BUNDLE_COPYRIGHT ${APP_SPDX})
+set(MACOSX_ISLE_BUNDLE_NAME isle)
+set(MACOSX_ISLE_BUNDLE_DISPLAY_NAME ${APP_NAME})
+set(MACOSX_CONFIG_BUNDLE_NAME isle-config)
+set(MACOSX_CONFIG_BUNDLE_DISPLAY_NAME "Configure LEGO Island")
+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)
+
+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 PRIVATE ${RESOURCE_FILES})
+ set_target_properties(isle 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 DESTINATION ./)
+ install(CODE "
+ include(BundleUtilities)
+ fixup_bundle(${CMAKE_BINARY_DIR}/${MACOSX_ISLE_BUNDLE_NAME}.app \"\" \"\")
+ "
+ COMPONENT Runtime)
+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(isle-config PRIVATE ${RESOURCE_FILES})
+ set_target_properties(isle-config 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 isle-config DESTINATION ./)
+ qt_generate_deploy_app_script(
+ TARGET isle-config
+ OUTPUT_SCRIPT deploy_script
+ NO_COMPILER_RUNTIME
+ NO_TRANSLATIONS
+ )
+ install(SCRIPT "${deploy_script}")
+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..9919e7f9
--- /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