diff --git a/CMakeLists.txt b/CMakeLists.txt
index 63c25d001..030a31344 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -119,6 +119,10 @@ else()
 	set(CMAKE_INSTALL_INCLUDEDIR "include")
 endif()
 
+if(APPLE AND DISTBUILD)
+	set(CMAKE_INSTALL_DOCDIR ".")
+endif()
+
 if(NOT DEFINED LIBDIR)
 	set(LIBDIR "${CMAKE_INSTALL_LIBDIR}")
 endif()
@@ -1064,6 +1068,9 @@ endif()
 
 if(DISTBUILD)
 	set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
+	set(CPACK_DMG_FILESYSTEM "HFS+")
+	set(CPACK_DMG_FORMAT "UDBZ")
+	set(CPACK_DMG_VOLUME_NAME "${PROJECT_NAME} ${VERSION_STRING}")
 	if(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" AND BUILD_SHARED)
 		if(NOT APPLE)
 			add_custom_command(TARGET ${BINARY_NAME} POST_BUILD COMMAND "${OBJCOPY}" --only-keep-debug "$<TARGET_FILE:${BINARY_NAME}>" "$<TARGET_FILE:${BINARY_NAME}>.debug")
@@ -1074,7 +1081,8 @@ if(DISTBUILD)
 	endif()
 	if(APPLE)
 		set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-qt ${BINARY_NAME}-sdl ${BINARY_NAME}-qt-dbg ${BINARY_NAME}-sdl-dbg ${BINARY_NAME}-perf)
-		set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE)
+		configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/platform/cmake/DMGOverrides.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/DMGOverrides.cmake @ONLY)
+		set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_CURRENT_BINARY_DIR}/DMGOverrides.cmake)
 	elseif(WIN32)
 		set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-qt ${BINARY_NAME}-sdl ${BINARY_NAME}-qt-dbg ${BINARY_NAME}-sdl-dbg ${BINARY_NAME}-perf installer)
 	elseif(3DS)
diff --git a/src/platform/cmake/DMGOverrides.cmake.in b/src/platform/cmake/DMGOverrides.cmake.in
new file mode 100644
index 000000000..906853946
--- /dev/null
+++ b/src/platform/cmake/DMGOverrides.cmake.in
@@ -0,0 +1,6 @@
+message(FATAL ${CPACK_GENERATOR})
+if(CPACK_GENERATOR STREQUAL "DragNDrop")
+	set(CPACK_COMPONENTS_ALL @BINARY_NAME@ @BINARY_NAME@-qt @BINARY_NAME@-qt-dbg)
+	set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE)
+	unset(CPACK_RESOURCE_FILE_LICENSE)
+endif()
diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt
index 032d01d07..b2f77d1ae 100644
--- a/src/platform/qt/CMakeLists.txt
+++ b/src/platform/qt/CMakeLists.txt
@@ -241,6 +241,11 @@ if(APPLE)
 	set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
 	set(MACOSX_BUNDLE_GUI_IDENTIFIER com.endrift.${BINARY_NAME}-qt)
 	set_source_files_properties(${CMAKE_SOURCE_DIR}/res/mgba.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
+	if(DISTBUILD)
+		set(APPDIR ".")
+	else()
+		set(APPDIR "Applications")
+	endif()
 endif()
 if(WIN32)
 	configure_file(${CMAKE_SOURCE_DIR}/res/mgba.rc.in ${CMAKE_BINARY_DIR}/res/mgba.rc)
@@ -249,7 +254,7 @@ if(WIN32)
 endif()
 if(NOT DEFINED DATADIR)
 	if(APPLE)
-		set(DATADIR Applications/${PROJECT_NAME}.app/Contents/Resources)
+		set(DATADIR ${APPDIR}/${PROJECT_NAME}.app/Contents/Resources)
 	elseif(WIN32 AND NOT WIN32_UNIX_PATHS)
 		set(DATADIR ".")
 	else()
@@ -336,11 +341,11 @@ set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}" PARENT_SCOPE)
 
 install(TARGETS ${BINARY_NAME}-qt
 	RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt
-	BUNDLE DESTINATION Applications COMPONENT ${BINARY_NAME}-qt)
+	BUNDLE DESTINATION ${APPDIR} COMPONENT ${BINARY_NAME}-qt)
 if(UNIX AND NOT APPLE)
 	install(FILES ${CMAKE_SOURCE_DIR}/res/mgba-qt.desktop DESTINATION share/applications COMPONENT ${BINARY_NAME}-qt)
 endif()
-if(UNIX)
+if(UNIX AND NOT (APPLE AND DISTBUILD))
 	install(FILES ${CMAKE_SOURCE_DIR}/doc/mgba-qt.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-qt)
 endif()
 if(APPLE OR WIN32)
@@ -373,7 +378,7 @@ if(APPLE)
 		if(DEFINED CROSS_ROOT)
 			set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -R "${CROSS_ROOT}")
 		endif()
-		install(CODE "execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/tools/deploy-mac.py\" -v ${DEPLOY_OPTIONS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Applications/${PROJECT_NAME}.app\")")
+		install(CODE "execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/tools/deploy-mac.py\" -v ${DEPLOY_OPTIONS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${APPDIR}/${PROJECT_NAME}.app\")")
 	endif()
 elseif(WIN32)
 	if(CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION EQUAL 8)