Add macOS Framework build support

Adds ENABLE_MACOS_FRAMEWORK cmake option to build projectM-4.framework
and projectM-4-playlist.framework bundles instead of plain dylibs.
Only available on macOS with shared library builds.

The frameworks include all public headers in the Headers/ directory
and use standard macOS framework versioning (Version A).

Fixes #924
This commit is contained in:
Mischa
2026-01-21 21:45:50 -08:00
committed by Mischa Spiegelmock
parent a98d21dc0a
commit ef00cfc8e7
4 changed files with 41 additions and 13 deletions

View File

@ -97,6 +97,7 @@ endif()
cmake_dependent_option(BUILD_SHARED_LIBS "Build and install libprojectM as a shared libraries. If OFF, builds as static libraries." ON "NOT ENABLE_EMSCRIPTEN" OFF)
cmake_dependent_option(ENABLE_GLES "Enable OpenGL ES support" OFF "NOT ENABLE_EMSCRIPTEN AND NOT CMAKE_SYSTEM_NAME STREQUAL Android" ON)
cmake_dependent_option(ENABLE_INSTALL "Enable installing projectM libraries and headers." OFF "NOT PROJECT_IS_TOP_LEVEL" ON)
cmake_dependent_option(ENABLE_MACOS_FRAMEWORK "Build as macOS Framework bundles instead of plain shared libraries." OFF "CMAKE_SYSTEM_NAME STREQUAL Darwin AND BUILD_SHARED_LIBS" OFF)
# Experimental/unsupported features
option(ENABLE_CXX_INTERFACE "Enable exporting C++ symbols for ProjectM and PCM classes, not only the C API. Warning: This is not very portable." OFF)
@ -268,6 +269,7 @@ if(ENABLE_SDL_UI)
message(STATUS " SDL2 version: ${SDL2_VERSION}")
endif()
message(STATUS " OpenGL ES: ${ENABLE_GLES}")
message(STATUS " macOS Framework: ${ENABLE_MACOS_FRAMEWORK}")
message(STATUS " Emscripten: ${ENABLE_EMSCRIPTEN}")
if(CMAKE_SYSTEM_NAME STREQUAL Emscripten)
message(STATUS " - PThreads: ${USE_PTHREADS}")

View File

@ -22,24 +22,27 @@ generate_export_header(projectM_api
set(PROJECTM_PUBLIC_HEADERS
"${PROJECTM_EXPORT_HEADER}"
"${CMAKE_CURRENT_BINARY_DIR}/include/projectM-4/version.h"
include/projectM-4/audio.h
include/projectM-4/callbacks.h
include/projectM-4/core.h
include/projectM-4/debug.h
include/projectM-4/logging.h
include/projectM-4/memory.h
include/projectM-4/parameters.h
include/projectM-4/projectM.h
include/projectM-4/render_opengl.h
include/projectM-4/touch.h
include/projectM-4/types.h
include/projectM-4/user_sprites.h
"${CMAKE_CURRENT_SOURCE_DIR}/include/projectM-4/audio.h"
"${CMAKE_CURRENT_SOURCE_DIR}/include/projectM-4/callbacks.h"
"${CMAKE_CURRENT_SOURCE_DIR}/include/projectM-4/core.h"
"${CMAKE_CURRENT_SOURCE_DIR}/include/projectM-4/debug.h"
"${CMAKE_CURRENT_SOURCE_DIR}/include/projectM-4/logging.h"
"${CMAKE_CURRENT_SOURCE_DIR}/include/projectM-4/memory.h"
"${CMAKE_CURRENT_SOURCE_DIR}/include/projectM-4/parameters.h"
"${CMAKE_CURRENT_SOURCE_DIR}/include/projectM-4/projectM.h"
"${CMAKE_CURRENT_SOURCE_DIR}/include/projectM-4/render_opengl.h"
"${CMAKE_CURRENT_SOURCE_DIR}/include/projectM-4/touch.h"
"${CMAKE_CURRENT_SOURCE_DIR}/include/projectM-4/types.h"
"${CMAKE_CURRENT_SOURCE_DIR}/include/projectM-4/user_sprites.h"
)
if(ENABLE_CXX_INTERFACE)
list(APPEND PROJECTM_PUBLIC_HEADERS ${PROJECTM_CXX_EXPORT_HEADER})
endif()
# Make available to parent scope for framework builds
set(PROJECTM_PUBLIC_HEADERS "${PROJECTM_PUBLIC_HEADERS}" PARENT_SCOPE)
target_sources(projectM_api
PRIVATE
${PROJECTM_PUBLIC_HEADERS}

View File

@ -130,6 +130,17 @@ if(BUILD_SHARED_LIBS)
PUBLIC
${CMAKE_DL_LIBS}
)
if(ENABLE_MACOS_FRAMEWORK)
set_target_properties(projectM PROPERTIES
FRAMEWORK TRUE
FRAMEWORK_VERSION A
MACOSX_FRAMEWORK_IDENTIFIER com.github.projectm-visualizer.projectM
MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${PROJECT_VERSION}"
MACOSX_FRAMEWORK_BUNDLE_VERSION "${PROJECT_VERSION}"
PUBLIC_HEADER "${PROJECTM_PUBLIC_HEADERS}"
)
endif()
else()
target_compile_definitions(projectM_main
PUBLIC
@ -158,7 +169,8 @@ if(ENABLE_INSTALL)
LIBRARY DESTINATION "${PROJECTM_LIB_DIR}" COMPONENT Runtime
RUNTIME DESTINATION "${PROJECTM_RUNTIME_DIR}" COMPONENT Runtime
ARCHIVE DESTINATION "${PROJECTM_LIB_DIR}" COMPONENT Devel
PUBLIC_HEADER DESTINATION "${PROJECTM_INCLUDE_DIR}/libprojectM" COMPONENT Devel
PUBLIC_HEADER DESTINATION "${PROJECTM_INCLUDE_DIR}/projectM-4" COMPONENT Devel
FRAMEWORK DESTINATION "${PROJECTM_LIB_DIR}" COMPONENT Runtime
)
if(ENABLE_CXX_INTERFACE)

View File

@ -78,6 +78,16 @@ if(BUILD_SHARED_LIBS)
PUBLIC
${CMAKE_DL_LIBS}
)
if(ENABLE_MACOS_FRAMEWORK)
set_target_properties(projectM_playlist PROPERTIES
FRAMEWORK TRUE
FRAMEWORK_VERSION A
MACOSX_FRAMEWORK_IDENTIFIER com.github.projectm-visualizer.projectM-playlist
MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${PROJECT_VERSION}"
MACOSX_FRAMEWORK_BUNDLE_VERSION "${PROJECT_VERSION}"
)
endif()
else()
target_compile_definitions(projectM_playlist_main
PUBLIC
@ -111,6 +121,7 @@ if(ENABLE_INSTALL)
RUNTIME DESTINATION "${PROJECTM_RUNTIME_DIR}" COMPONENT Runtime
ARCHIVE DESTINATION "${PROJECTM_LIB_DIR}" COMPONENT Devel
PUBLIC_HEADER DESTINATION "${PROJECTM_INCLUDE_DIR}/projectM-4" COMPONENT Devel
FRAMEWORK DESTINATION "${PROJECTM_LIB_DIR}" COMPONENT Runtime
)