Skip to content

Commit

Permalink
CPack: Proof of concept for making Apple installers
Browse files Browse the repository at this point in the history
  • Loading branch information
tresf committed May 12, 2024
1 parent acdf05f commit c060230
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 30 deletions.
3 changes: 1 addition & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,7 @@ jobs:
ctest --output-on-failure -j3
- name: Package
run: |
cmake --build build --target install
cmake --build build --target dmg
cmake --build build --target package
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
Expand Down
25 changes: 11 additions & 14 deletions cmake/apple/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,22 @@ SET(MACOSX_BUNDLE_MIMETYPE_ID "io.lmms")
SET(MACOSX_BUNDLE_PROJECT_URL "${PROJECT_URL}")
SET(MACOSX_BUNDLE_DMG_TITLE "${MACOSX_BUNDLE_BUNDLE_NAME} ${MACOSX_BUNDLE_LONG_VERSION_STRING}")

# FIXME: appdmg won't allow volume names > 27 char
# See also https://github.com/LinusU/node-appdmg/issues/48
# appdmg won't allow volume names > 27 char https://github.com/LinusU/node-alias/issues/7
STRING(SUBSTRING "${MACOSX_BUNDLE_DMG_TITLE}" 0 27 MACOSX_BUNDLE_DMG_TITLE)

CONFIGURE_FILE("lmms.plist.in" "${CMAKE_BINARY_DIR}/Info.plist")
CONFIGURE_FILE("install_apple.sh.in" "${CMAKE_BINARY_DIR}/install_apple.sh" @ONLY)
CONFIGURE_FILE("package_apple.json.in" "${CMAKE_BINARY_DIR}/package_apple.json" @ONLY)

# DMG creation target
SET(DMG_FILE "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-${VERSION}-mac${APPLE_OS_VER}.dmg")
FILE(REMOVE "${DMG_FILE}")
ADD_CUSTOM_TARGET(removedmg
COMMAND touch "\"${DMG_FILE}\"" && rm "\"${DMG_FILE}\""
COMMENT "Removing old DMG")
ADD_CUSTOM_TARGET(dmg
COMMAND appdmg "\"${CMAKE_BINARY_DIR}/package_apple.json\"" "\"${DMG_FILE}\""
DEPENDS "${CMAKE_BINARY_DIR}/package_apple.json"
COMMENT "Generating DMG")
ADD_DEPENDENCIES(dmg removedmg)
# Generators "Bundle" and "DragNDrop" don't support macdeployqt, use "External" instead

# see also ../postinstall/CMakeLists.txt
# CPack vars
set(CPACK_STRIP_FILES false PARENT_SCOPE)
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${VERSION}" PARENT_SCOPE)
set(CPACK_GENERATOR "External" PARENT_SCOPE)
set(CPACK_EXTERNAL_ENABLE_STAGING true PARENT_SCOPE)
set(CPACK_POST_BUILD_SCRIPTS "${CMAKE_CURRENT_SOURCE_DIR}/CPackApple.cmake" PARENT_SCOPE)

# Additional vars that aren't exposed to CPack
set(CPACK_BINARY_DIR "${CMAKE_BINARY_DIR}" PARENT_SCOPE)
set(CPACK_DMG_FILE "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-${VERSION}-mac${APPLE_OS_VER}.dmg" PARENT_SCOPE)
15 changes: 15 additions & 0 deletions cmake/apple/CPackApple.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Create LMMS.app bundle using install_apple.sh
# TODO: Port this script to CMake
execute_process(COMMAND chmod u+x ${CPACK_BINARY_DIR}/install_apple.sh)
execute_process(COMMAND ${CPACK_BINARY_DIR}/install_apple.sh ${CPACK_TEMPORARY_INSTALL_DIRECTORY} RESULT_VARIABLE EXIT_CODE)
if(NOT EXIT_CODE EQUAL 0)
message(FATAL_ERROR "Execution of install_apple.sh failed")
endif()

# Create DMG
message("Generating DMG")
# REMOVE_RECURSE supresses missing file warnings
file(REMOVE_RECURSE "${CPACK_DMG_FILE}")
execute_process(
COMMAND appdmg "${CPACK_BINARY_DIR}/package_apple.json" "${CPACK_DMG_FILE}"
)
20 changes: 15 additions & 5 deletions cmake/apple/install_apple.sh.in
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,28 @@ echo -e "$MSG_COLOR\n\nCreating App Bundle \"$APP\"...$COLOR_RESET"
qtpath="$(dirname "@QT_QMAKE_EXECUTABLE@")"
export PATH="$PATH:$qtpath"

# Ensure an install path was passed in
if [ -z "$1" ]; then
echo "An install folder was not provided"
exit 1
fi

if [ -d "$1" ]; then
echo "Directory $1 exists, using..."
else
echo "Provided directory '$1' does not exist"
fi

# Remove any old .app bundles
rm -Rf "$APP"

# Copy/overwrite Info.plist
command cp "@CMAKE_BINARY_DIR@/Info.plist" "@CMAKE_INSTALL_PREFIX@/"

# Create .app bundle containing contents from CMAKE_INSTALL_PREFIX
# Create .app bundle containing contents from CPack's "External" install directory
mkdir -p "$APP/Contents/MacOS"
mkdir -p "$APP/Contents/Frameworks"
mkdir -p "$APP/Contents/Resources"
cd "@CMAKE_INSTALL_PREFIX@"
cd "$1"
cp -R ./* "$APP/Contents"
cp "@CMAKE_BINARY_DIR@/Info.plist" "$APP/Contents/"
cp "@CMAKE_SOURCE_DIR@/cmake/apple/"*.icns "$APP/Contents/Resources/"

# Make all libraries writable for macdeployqt
Expand Down
8 changes: 0 additions & 8 deletions cmake/install/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,3 @@ if(LMMS_HAVE_STK AND (LMMS_BUILD_WIN32 OR LMMS_BUILD_APPLE))
endif()
endif()

IF(LMMS_BUILD_APPLE)
INSTALL(CODE "EXECUTE_PROCESS(COMMAND chmod u+x ${CMAKE_BINARY_DIR}/install_apple.sh)")
INSTALL(CODE "EXECUTE_PROCESS(COMMAND ${CMAKE_BINARY_DIR}/install_apple.sh RESULT_VARIABLE EXIT_CODE)
IF(NOT EXIT_CODE EQUAL 0)
MESSAGE(FATAL_ERROR \"Execution of install_apple.sh failed\")
ENDIF()
")
ENDIF()
2 changes: 1 addition & 1 deletion src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ IF(LMMS_BUILD_MSYS)
SET_PROPERTY(TARGET lmms
APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--out-implib,liblmms.dll.a"
)
ELSEIF(NOT WIN32)
ELSEIF(NOT WIN32 AND NOT LMMS_BUILD_APPLE)
if(CMAKE_INSTALL_MANDIR)
SET(INSTALL_MANDIR ${CMAKE_INSTALL_MANDIR})
ELSE(CMAKE_INSTALL_MANDIR)
Expand Down

0 comments on commit c060230

Please sign in to comment.