From d4ef0430430b97e3fee6b9e4e6d57b9cc95d5f0c Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Sat, 3 Sep 2022 20:06:33 +0200 Subject: [PATCH] cmake: Export Loadable Bundles on MacOS With OBS Studio 28.0.0 a new requirement was added to MacOS plugin: Loadable Bundles. These bundles are similar to Application Bundles, and have many of the same features, but are designed to be loaded by Applications instead of being the Application. This allows for almost all of the advantages to persist, with some minimal drawbacks. --- CMakeLists.txt | 78 +++++++++++++++++++---- templates/macos/Info.plist.in | 51 +++++++++++++++ templates/macos/installer.pkgproj.in | 95 +++++++++++++++++++--------- 3 files changed, 180 insertions(+), 44 deletions(-) create mode 100644 templates/macos/Info.plist.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 78a7047..8eda960 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -213,6 +213,7 @@ project( DESCRIPTION "Additional sources, filters, transitions and encoders for OBS Studio." HOMEPAGE_URL "https://streamfx.xaymar.com/" ) +set(PROJECT_IDENTIFER "com.xaymar.${PROJECT_NAME}.obs") set(PROJECT_TITLE "StreamFX (for OBS Studio)") set(PROJECT_AUTHORS "Michael Fabian 'Xaymar' Dirks ") set(PROJECT_COPYRIGHT "2017 - 2022, Michael Fabian Dirks. All Rights Reserved") @@ -370,6 +371,8 @@ if(STANDALONE) set(STRUCTURE_UNIFIED CACHE BOOL "Install for use in a Plugin Manager") if(D_PLATFORM_LINUX) set(STRUCTURE_PACKAGEMANAGER CACHE BOOL "Install for use in a Package Manager (system-wide installation)") + elseif(D_PLATFORM_MAC) + set(STRUCTURE_BUNDLE ON CACHE BOOL "Install as a Loadable Bundle (.plugin)") endif() set(PACKAGE_PREFIX "${CMAKE_BINARY_DIR}" CACHE PATH "Where to place the packages?") @@ -2015,6 +2018,41 @@ if(D_PLATFORM_MAC) BUILD_WITH_INSTALL_RPATH ON ) endif() + + # Bundle exporting + if(STRUCTURE_BUNDLE) + # Proper location for resources in Bundles + foreach(FILE IN LISTS PROJECT_DATA) + cmake_path(ABSOLUTE_PATH FILE OUTPUT_VARIABLE FILE_PATH) + cmake_path(RELATIVE_PATH FILE_PATH BASE_DIRECTORY "${PROJECT_SOURCE_DIR}/data/") + cmake_path(GET FILE_PATH PARENT_PATH FILE_PATH) + set_source_files_properties("${FILE}" PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources/${FILE_PATH}" + ) + endforeach() + + # Bundle Icon + set_source_files_properties("media/icon.png" PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources" + ) + + # Bundle Information + set(MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_NAME}") + set(MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_VERSION}") + set(MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT}") + set(MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_IDENTIFER}") + set(MACOSX_BUNDLE_ICON_FILE "icon.png") + set(MACOSX_BUNDLE_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") + set(MACOSX_BUNDLE_LONG_VERSION_STRING "${_VERSION}") + set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}") + set_target_properties(${PROJECT_NAME} PROPERTIES + BUNDLE ON + BUNDLE_EXTENSION "plugin" + OUTPUT_NAME ${PROJECT_NAME} + MACOSX_BUNDLE_INFO_PLIST "${PROJECT_SOURCE_DIR}/templates/macos/Info.plist.in" + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${MACOSX_BUNDLE_GUI_IDENTIFIER}" + ) + endif() endif() ################################################################################ @@ -2171,19 +2209,29 @@ if(STANDALONE) ) endif() elseif(D_PLATFORM_MAC) - install( - TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION "${PROJECT_NAME}/bin/" COMPONENT StreamFX - LIBRARY DESTINATION "${PROJECT_NAME}/bin/" COMPONENT StreamFX - PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE - ) - install( - DIRECTORY "data/" - DESTINATION "${PROJECT_NAME}/data/" - COMPONENT StreamFX - FILE_PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE - DIRECTORY_PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE - ) + if(STRUCTURE_BUNDLE) + install( + TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION "." COMPONENT StreamFX + LIBRARY DESTINATION "." COMPONENT StreamFX + BUNDLE DESTINATION "." COMPONENT StreamFX + PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE + ) + else() + install( + TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION "${PROJECT_NAME}/bin/" COMPONENT StreamFX + LIBRARY DESTINATION "${PROJECT_NAME}/bin/" COMPONENT StreamFX + PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE + ) + install( + DIRECTORY "data/" + DESTINATION "${PROJECT_NAME}/data/" + COMPONENT StreamFX + FILE_PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE + DIRECTORY_PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE + ) + endif() endif() else() if(COMMAND setup_plugin_target) @@ -2296,6 +2344,10 @@ if(STANDALONE) # Apple MacOS if(D_PLATFORM_MAC) # .pkg Installer + set(PACKAGES_PATH_NAME "${PROJECT_NAME}") + if(STRUCTURE_BUNDLE) + set(PACKAGES_PATH_NAME "${PACKAGES_PATH_NAME}.plugin") + endif() configure_file( "templates/macos/installer.pkgproj.in" "installer.pkgproj" diff --git a/templates/macos/Info.plist.in b/templates/macos/Info.plist.in new file mode 100644 index 0000000..66c46b6 --- /dev/null +++ b/templates/macos/Info.plist.in @@ -0,0 +1,51 @@ + + + + + CFBundleInfoDictionaryVersion + 6.0 + + CFBundleSupportedPlatforms + + MacOSX + + + CFBundlePackageType + BNDL + + CFBundleDevelopmentRegion + English + + CFBundleIdentifier + ${MACOSX_BUNDLE_GUI_IDENTIFIER} + + CFBundleName + ${MACOSX_PLUGIN_BUNDLE_NAME} + CFBundleDisplayName + ${MACOSX_PLUGIN_BUNDLE_NAME} + + CFBundleIconFile + ${MACOSX_BUNDLE_ICON_FILE} + + CFBundleExecutable + ${MACOSX_PLUGIN_EXECUTABLE_NAME} + + CFBundleVersion + ${MACOSX_BUNDLE_VERSION_STRING} + CFBundleShortVersionString + ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + CFBundleLongVersionString + ${MACOSX_BUNDLE_LONG_VERSION_STRING} + + CSResourcesFileMapped + + + CFBundleGetInfoString + ${MACOSX_BUNDLE_COPYRIGHT} + NSHumanReadableCopyright + ${MACOSX_BUNDLE_COPYRIGHT} + + LSMinimumSystemVersion + ${CMAKE_OSX_DEPLOYMENT_TARGET} + + diff --git a/templates/macos/installer.pkgproj.in b/templates/macos/installer.pkgproj.in index 2c33be4..516fa7e 100644 --- a/templates/macos/installer.pkgproj.in +++ b/templates/macos/installer.pkgproj.in @@ -37,14 +37,63 @@ CHILDREN + BUNDLE_CAN_DOWNGRADE + + BUNDLE_POSTINSTALL_PATH + + PATH_TYPE + 0 + + BUNDLE_PREINSTALL_PATH + + PATH_TYPE + 0 + CHILDREN GID 80 + LOCATORS + + + DICTIONARY + + BUNDLE_IDENTIFIER + com.xaymar.StreamFX.obs + DEFAULT_PATH + /Library/Application Support/obs-studio/plugins + PREFER_DEFAULT_PATH + 0 + + IDENTIFIER + fr.whitebox.Packages.locator.standard + NAME + com.xaymar.StreamFX.obs + STATE + + + + DICTIONARY + + BUNDLE_IDENTIFIER + com.xaymar.StreamFX + DEFAULT_PATH + /Library/Application Support/obs-studio/plugins + PREFER_DEFAULT_PATH + 0 + + IDENTIFIER + fr.whitebox.Packages.locator.standard + NAME + com.xaymar.StreamFX + STATE + + + PATH - @CMAKE_INSTALL_PREFIX@/StreamFX + @CMAKE_INSTALL_PREFIX@/@PACKAGES_PATH_NAME@ PATH_TYPE - 3 + 1 PERMISSIONS 493 TYPE @@ -58,9 +107,9 @@ PATH plugins PATH_TYPE - 0 + 2 PERMISSIONS - 493 + 509 TYPE 2 UID @@ -72,9 +121,9 @@ PATH obs-studio PATH_TYPE - 0 + 2 PERMISSIONS - 493 + 509 TYPE 2 UID @@ -445,22 +494,6 @@ UID 0 - - CHILDREN - - GID - 80 - PATH - Applications - PATH_TYPE - 0 - PERMISSIONS - 509 - TYPE - 1 - UID - 0 - GID 0 @@ -506,19 +539,19 @@ PACKAGE_SETTINGS AUTHENTICATION - 1 + 0 CONCLUSION_ACTION 0 FOLLOW_SYMBOLIC_LINKS IDENTIFIER - com.xaymar.@PROJECT_NAME@ + ${PROJECT_IDENTIFER} LOCATION 0 NAME @PROJECT_NAME@ OVERWRITE_PERMISSIONS - + PAYLOAD_SIZE -1 REFERENCE_PATH @@ -526,7 +559,7 @@ RELOCATABLE USE_HFS+_COMPRESSION - + VERSION @PROJECT_VERSION@ @@ -574,7 +607,7 @@ OPTIONS HIDDEN - + STATE 1 @@ -593,7 +626,7 @@ MODE - 1 + 0 INSTALLATION_STEPS @@ -669,7 +702,7 @@ VALUE PATH - @PROJECT_SOURCE_DIR@/license + @PROJECT_SOURCE_DIR@/LICENSE PATH_TYPE 0 @@ -706,14 +739,14 @@ DICTIONARY IC_REQUIREMENT_OS_DISK_TYPE - 0 + 1 IC_REQUIREMENT_OS_DISTRIBUTION_TYPE 0 IC_REQUIREMENT_OS_MINIMUM_VERSION 101500 IC_REQUIREMENT_CHECK_TYPE - 1 + 0 IDENTIFIER fr.whitebox.Packages.requirement.os MESSAGE