Skip to content

Commit

Permalink
Convert apple package script to cmake
Browse files Browse the repository at this point in the history
  • Loading branch information
tresf committed May 13, 2024
1 parent 44ec1bf commit 9b9e4af
Show file tree
Hide file tree
Showing 8 changed files with 161 additions and 192 deletions.
69 changes: 45 additions & 24 deletions cmake/apple/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,27 +1,48 @@
# TODO: Re-evaluate these
set(MACOSX_BUNDLE_ICON_FILE "icon.icns")
set(MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_NAME_UCASE}")
set(MACOSX_BUNDLE_LONG_VERSION_STRING "${VERSION}")
set(MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_NAME_UCASE}")
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VERSION}")
set(MACOSX_BUNDLE_BUNDLE_VERSION "${VERSION}")
set(MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT}")
set(MACOSX_BUNDLE_MIMETYPE "application/x-lmms-project")
set(MACOSX_BUNDLE_MIMETYPE_ICON "project.icns")
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}")
# 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)
# Info.plist
set(MACOS_ICON "${PROJECT_NAME_UCASE}.icns")
set(MACOS_MIMETYPE "application/x-lmms-project")
set(MACOS_MIMETYPE_ICON "project.icns")
set(MACOS_MIMETYPE_ID "io.lmms")
configure_file("lmms.plist.in" "Info.plist" @ONLY)

# "Bundle"-specific CPack options
set(CPACK_GENERATOR "Bundle" PARENT_SCOPE)
set(CPACK_BUNDLE_NAME "${PROJECT_NAME_UCASE}" PARENT_SCOPE)
set(CPACK_BUNDLE_PLIST "${CMAKE_CURRENT_BINARY_DIR}/Info.plist" PARENT_SCOPE)
set(CPACK_BUNDLE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icon.icns" PARENT_SCOPE)

# Resource files
configure_file("lmms.plist.in" "Info.plist")
configure_file("package_apple.sh.in" "package_apple.sh" @ONLY)
configure_file("appdmg.json.in" "_appdmg.json.in" @ONLY)
# Standard CPack options
# supress license popup
unset(CPACK_RESOURCE_FILE_LICENSE PARENT_SCOPE)
# strip causes missing symbols on macOS
set(CPACK_STRIP_FILES false PARENT_SCOPE)
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${VERSION}-mac${APPLE_OS_VER}")
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}" PARENT_SCOPE)
set(CPACK_PRE_BUILD_SCRIPTS "${CMAKE_CURRENT_SOURCE_DIR}/CPackPreBuild.cmake" PARENT_SCOPE)
set(CPACK_POST_BUILD_SCRIPTS "${CMAKE_CURRENT_SOURCE_DIR}/CPackPostBuild.cmake" PARENT_SCOPE)
set(CPACK_DMG_VOLUME_NAME "${PROJECT_NAME_UCASE} ${VERSION}" PARENT_SCOPE)
set(CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_CURRENT_BINARY_DIR}/${SUBDIR}/background.tiff" PARENT_SCOPE)
set(CPACK_DMG_DS_STORE "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIR}/DS_Store" PARENT_SCOPE)

# CPack settings/scripts
configure_file("CPackOptions.cmake.in" "CPackOptions.cmake" @ONLY)
configure_file("CPackPreBuild.cmake.in" "CPackPreBuild.cmake" @ONLY)
# Custom vars to expose to Cpack
# must be prefixed with "CPACK_" per https://stackoverflow.com/a/46526757/3196753)
set(CPACK_CURRENT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}" PARENT_SCOPE)
set(CPACK_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" PARENT_SCOPE)
set(CPACK_BINARY_DIR "${CMAKE_BINARY_DIR}" PARENT_SCOPE)
set(CPACK_SOURCE_DIR "${CMAKE_SOURCE_DIR}" PARENT_SCOPE)
set(CPACK_QMAKE_EXECUTABLE "${QT_QMAKE_EXECUTABLE}" PARENT_SCOPE)
set(CPACK_CARLA_LIBRARIES "${CARLA_LIBRARIES}" PARENT_SCOPE)
set(CPACK_PROJECT_NAME_UCASE "${PROJECT_NAME_UCASE}" PARENT_SCOPE)

# appdmg is no longer required, but needed for creating a new .DS_Store file
# make package appdmg
# appdmg won't allow volume names > 27 char https://github.com/LinusU/node-alias/issues/7
string(SUBSTRING "${CPACK_DMG_VOLUME_NAME}" 0 27 "${PROJECT_NAME_UCASE} ${VERSION}")
configure_file("appdmg.json.in" "_appdmg.json.in" @ONLY)
add_custom_target(appdmg
COMMAND touch "${CPACK_PACKAGE_FILE_NAME}.dmg" &&
rm "${CPACK_PACKAGE_FILE_NAME}-appdmg.dmg" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
COMMAND appdmg appdmg.json "${CPACK_PACKAGE_FILE_NAME}-appdmg.dmg" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/appdmg.json"
COMMENT "Generating DMG")

set(CPACK_GENERATOR "DragNDrop" PARENT_SCOPE)
set(CPACK_PROJECT_CONFIG_FILE "${CMAKE_CURRENT_BINARY_DIR}/CPackOptions.cmake" PARENT_SCOPE)
10 changes: 0 additions & 10 deletions cmake/apple/CPackOptions.cmake.in

This file was deleted.

83 changes: 83 additions & 0 deletions cmake/apple/CPackPostBuild.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Variables must be prefixed with "CPACK_" to be visible here
# See also CpackOptions.cmake.in
set(APP "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/${CPACK_PROJECT_NAME_UCASE}.app")

# Copy missing files
file(COPY "${CPACK_CURRENT_SOURCE_DIR}/project.icns" DESTINATION "${APP}/Contents/Resources")

# Updates appdmg.json with CPACK_TEMPORARY_INSTALL_DIRECTORY
# - .DS_Store can be recreated using appdmg appdmg.json lmms.dmg
# - Find new .DS_Store from the root of the DMG file
# - cp /Volumes/lmms-x.x.x/.DS_Store ../cmake/apple/DS_Store
configure_file("${CPACK_CURRENT_BINARY_DIR}/_appdmg.json.in" "${CPACK_CURRENT_BINARY_DIR}/appdmg.json")
file(REMOVE "${CPACK_CURRENT_BINARY_DIR}/_appdmg.json.in")

# Create bundle structure
file(MAKE_DIRECTORY "${APP}/Contents/MacOS")
file(MAKE_DIRECTORY "${APP}/Contents/Frameworks")
file(MAKE_DIRECTORY "${APP}/Contents/Resources")

# Make all libraries writable for macdeployqt
file(CHMOD_RECURSE "${APP}/Contents" PERMISSIONS
OWNER_EXECUTE OWNER_WRITE OWNER_READ
GROUP_EXECUTE GROUP_WRITE GROUP_READ
WORLD_READ)

# Fix layout
file(RENAME "${APP}/Contents/Resources/lib" "${APP}/Contents/lib")
file(RENAME "${APP}/Contents/Resources/share" "${APP}/Contents/share")
file(RENAME "${APP}/Contents/Resources/bin" "${APP}/Contents/bin")

# Move binaries into Contents/MacOS
file(RENAME "${APP}/Contents/bin/lmms" "${APP}/Contents/MacOS/lmms")
file(RENAME "${APP}/Contents/lib/lmms/RemoteZynAddSubFx" "${APP}/Contents/MacOS/RemoteZynAddSubFx")
file(REMOVE_RECURSE "${APP}/Contents/bin")

# Replace @rpath with @loader_path for Carla
execute_process(COMMAND install_name_tool -change
"@rpath/libcarlabase.dylib"
"@loader_path/libcarlabase.dylib"
"${APP}/Contents/lib/lmms/libcarlapatchbay.so"
COMMAND_ERROR_IS_FATAL ANY)
execute_process(COMMAND install_name_tool -change
"@rpath/libcarlabase.dylib"
"@loader_path/libcarlabase.dylib"
"${APP}/Contents/lib/lmms/libcarlarack.so"
COMMAND_ERROR_IS_FATAL ANY)

# Build list of executables to inform macdeployqt about
# e.g. -executable=foo.dylib -executable=bar.dylib
file(GLOB LIBS "${APP}/Contents/lib/lmms/*.so")
file(GLOB LADSPA "${APP}/Contents/lib/lmms/ladspa/*.so")
list(APPEND LIBS "${APP}/Contents/MacOS/RemoteZynAddSubFx")
list(APPEND LIBS ${LADSPA})
list(SORT LIBS)

# Construct macdeployqt parameters
foreach(_LIB IN LISTS LIBS)
list(APPEND EXECUTABLES "-executable=${_LIB}")
endforeach()

# Call macdeployqt
get_filename_component(QTBIN "${CPACK_QMAKE_EXECUTABLE}" DIRECTORY)
message(STATUS "Calling ${QTBIN}/macdeployqt ${APP} [... executables]")
execute_process(COMMAND "${QTBIN}/macdeployqt" "${APP}" ${EXECUTABLES} COMMAND_ERROR_IS_FATAL ANY)

# Remove dummy carla libs, relink to a sane location (e.g. /Applications/Carla.app/...)
# (must be done after calling macdeployqt)
file(GLOB CARLALIBS "${APP}/Contents/lib/lmms/libcarla*")
foreach(_CARLALIB IN LISTS CARLALIBS)
foreach(_LIB "${CPACK_CARLA_LIBRARIES}")
set(_OLDPATH "../../Frameworks/lib${_LIB}.dylib")
set(_NEWPATH "Carla.app/Contents/MacOS/lib${_LIB}.dylib")
execute_process(COMMAND install_name_tool -change
"@loader_path/${_OLDPATH}"
"@executable_path/../../../${_NEWPATH}"
"${_CARLALIB}"
COMMAND_ERROR_IS_FATAL ANY)
file(REMOVE "${APP}/Contents/Frameworks/lib${_LIB}.dylib")
endforeach()
endforeach()

# Call ad-hoc codesign manually (CMake offers this as well)
execute_process(COMMAND codesign --force --deep --sign - "${APP}" COMMAND_ERROR_IS_FATAL ANY)
6 changes: 6 additions & 0 deletions cmake/apple/CPackPreBuild.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Variables must be prefixed with "CPACK_" to be visible here
# See also CpackOptions.cmake.in
execute_process(COMMAND convert
"${CPACK_CURRENT_SOURCE_DIR}/*.png"
"${CPACK_CURRENT_BINARY_DIR}/background.tiff"
COMMAND_ERROR_IS_FATAL ANY)
24 changes: 0 additions & 24 deletions cmake/apple/CPackPreBuild.cmake.in

This file was deleted.

4 changes: 2 additions & 2 deletions cmake/apple/appdmg.json.in
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"title": "@MACOSX_BUNDLE_DMG_TITLE@",
"title": "@APPDMG_VOLUME_NAME@",
"background": "@CMAKE_SOURCE_DIR@/cmake/apple/background.png",
"icon-size": 128,
"contents": [
{ "x": 139, "y": 200, "type": "file", "path": "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/@MACOSX_BUNDLE_BUNDLE_NAME@.app" },
{ "x": 139, "y": 200, "type": "file", "path": "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/@PROJECT_NAME_UCASE@.app" },
{ "x": 568, "y": 200, "type": "link", "path": "/Applications" }
]
}
50 changes: 25 additions & 25 deletions cmake/apple/lmms.plist.in
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
<string>English</string>

<key>CFBundleIconFile</key>
<string>@MACOSX_BUNDLE_ICON_FILE@</string>
<string>@MACOS_ICON@</string>

<key>CFBundlePackageType</key>
<string>APPL</string>

<key>CFBundleGetInfoString</key>
<string>@MACOSX_BUNDLE_GUI_IDENTIFIER@ @MACOSX_BUNDLE_LONG_VERSION_STRING@</string>
<string>@PROJECT_NAME_UCASE@ @VERSION@</string>

<!--
#############################################################
Expand All @@ -29,38 +29,38 @@
#############################################################
-->
<key>CFBundleSignature</key>
<string>@MACOSX_BUNDLE_GUI_IDENTIFIER@</string>
<string>@PROJECT_NAME_UCASE@</string>

<key>CFBundleExecutable</key>
<string>@MACOSX_BUNDLE_GUI_IDENTIFIER@</string>
<string>@PROJECT_NAME_UCASE@</string>

<key>CFBundleVersion</key>
<string>@MACOSX_BUNDLE_LONG_VERSION_STRING@</string>
<string>@VERSION@</string>

<key>CFBundleShortVersionString</key>
<string>@MACOSX_BUNDLE_LONG_VERSION_STRING@</string>
<string>@VERSION@</string>

<key>CFBundleName</key>
<string>@MACOSX_BUNDLE_BUNDLE_NAME@</string>
<string>@PROJECT_NAME_UCASE@</string>

<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>

<key>CFBundleIdentifier</key>
<string>@MACOSX_BUNDLE_MIMETYPE_ID@</string>
<string>@MACOS_MIMETYPE_ID@</string>

<key>CFBundleDocumentTypes</key>
<array>

<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>mmpz</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>@MACOSX_BUNDLE_MIMETYPE_ICON@</string>
<string>@MACOS_MIMETYPE_ICON@</string>
<key>CFBundleTypeName</key>
<string>@MACOSX_BUNDLE_GUI_IDENTIFIER@ Project</string>
<string>@PROJECT_NAME_UCASE@ Project</string>
<key>CFBundleTypeOSTypes</key>
<array>
<string>mmpz</string>
Expand All @@ -69,19 +69,19 @@
<string>Editor</string>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>@MACOSX_BUNDLE_MIMETYPE@</string>
<string>@MACOS_MIMETYPE@</string>
</array>
</dict>

<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>mmp</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>@MACOSX_BUNDLE_MIMETYPE_ICON@</string>
<string>@MACOS_MIMETYPE_ICON@</string>
<key>CFBundleTypeName</key>
<string>@MACOSX_BUNDLE_GUI_IDENTIFIER@ Project (uncompressed)</string>
<string>@PROJECT_NAME_UCASE@ Project (uncompressed)</string>
<key>CFBundleTypeOSTypes</key>
<array>
<string>mmp</string>
Expand All @@ -90,23 +90,23 @@
<string>Editor</string>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>@MACOSX_BUNDLE_MIMETYPE@</string>
<string>@MACOS_MIMETYPE@</string>
</array>
</dict>

</array>

<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeIdentifier</key>
<string>@MACOSX_BUNDLE_MIMETYPE_ID@.mmpz</string>
<string>@MACOS_MIMETYPE_ID@.mmpz</string>
<key>UTTypeReferenceURL</key>
<string>@MACOSX_BUNDLE_PROJECT_URL@</string>
<string>@PROJECT_URL@</string>
<key>UTTypeDescription</key>
<string>@MACOSX_BUNDLE_GUI_IDENTIFIER@ Project</string>
<string>@PROJECT_NAME_UCASE@ Project</string>
<key>UTTypeIconFile</key>
<string>@MACOSX_BUNDLE_MIMETYPE_ICON@</string>
<string>@MACOS_MIMETYPE_ICON@</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
Expand All @@ -122,13 +122,13 @@

<dict>
<key>UTTypeIdentifier</key>
<string>@MACOSX_BUNDLE_MIMETYPE_ID@.mmp</string>
<string>@MACOS_MIMETYPE_ID@.mmp</string>
<key>UTTypeReferenceURL</key>
<string>@MACOSX_BUNDLE_PROJECT_URL@</string>
<string>@PROJECT_URL@</string>
<key>UTTypeDescription</key>
<string>@MACOSX_BUNDLE_GUI_IDENTIFIER@ Project (uncompressed)</string>
<string>@PROJECT_NAME_UCASE@ Project (uncompressed)</string>
<key>UTTypeIconFile</key>
<string>@MACOSX_BUNDLE_MIMETYPE_ICON@</string>
<string>@MACOS_MIMETYPE_ICON@</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.xml</string>
Expand Down
Loading

0 comments on commit 9b9e4af

Please sign in to comment.