I’ve manually done lots that CMake+CPack are meant to do for me, here are the summary of my hacks, hidden behind an if(BUILD_APPLE_BUNDLE)
option
flag:
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY
"${CMAKE_BINARY_DIR}/${EXEC_NAME}.app/Contents/PlugIns")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
set_target_properties(
"${EXEC_NAME}"
PROPERTIES
MACOSX_BUNDLE_NAME "${EXEC_NAME}"
MACOSX_BUNDLE_VERSION "${PROJECT_VERSION}"
MACOSX_BUNDLE_GUI_IDENTIFIER "org.${EXEC_NAME}.gui"
MACOSX_BUNDLE_ICON_FILE "Icon.icns"
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/cmake/Info.plist.in"
MACOSX_BUNDLE "TRUE"
# MACHO_COMPATIBILITY_VERSION "12.0.0"
RESOURCE "${RESOURCE_FILES}"
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ""
XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED NO
XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT dwarf
XCODE_ATTRIBUTE_GCC_INLINES_ARE_PRIVATE_EXTERN YES
XCODE_ATTRIBUTE_CLANG_LINK_OBJC_RUNTIME NO
)
add_custom_command(
TARGET "${EXEC_NAME}" POST_BUILD
COMMAND install_name_tool
-rpath "${CMAKE_BINARY_DIR}/${EXEC_NAME}.app/Contents/PlugIns" '@executable_path/../PlugIns'
"${CMAKE_BINARY_DIR}/${EXEC_NAME}.app/Contents/MacOS/${EXEC_NAME}"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
COMMENT "Replace library search path from absolute to relative"
)
Which works great (finally!). Unfortunately I haven’t figured out to make it play nicely with CPack.
Before I started building my own macOS .app bundles “manually” I did have this code in place:
install(TARGETS "${EXEC_NAME}" "${PROJECT_NAME}_lib"
# TYPE "RUNTIME"
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}/static"
BUNDLE DESTINATION "${CMAKE_INSTALL_BINDIR}/${EXEC_NAME}.app"
COMPONENT "${PROJECT_NAME}")
But now that [obviously] puts my .app within another .app; which doesn’t work.
Can I get some sort of trick like this working?
install(DIRECTORY "${CMAKE_BINARY_DIR}/${EXEC_NAME}.app" DESTINATION .)
Would be great to generate .dmg and .pkg (otherwise I’ll have to manually generate those also!!!)