diff --git a/cmake/resources/sdl-symbols-patch.h.in b/cmake/resources/sdl-symbols-patch.h.in new file mode 100644 index 000000000..9f77c758a --- /dev/null +++ b/cmake/resources/sdl-symbols-patch.h.in @@ -0,0 +1,63 @@ +/* + ============================================================================== + + This file is part of the YUP library. + Copyright (c) 2026 - kunitoki@gmail.com + + YUP is an open source library subject to open-source licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + to use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + YUP IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#ifndef @YupPluginPrefix@_YUP_SDL_SYMBOLS_PATCH_H +#define @YupPluginPrefix@_YUP_SDL_SYMBOLS_PATCH_H + +// SDL is linked statically into plugin bundles, so its Objective-C runtime +// classes must be private to the plugin image. +#define Cocoa_WindowListener @YupPluginPrefix@_YupPlugin_Cocoa_WindowListener +#define METAL_RenderData @YupPluginPrefix@_YupPlugin_METAL_RenderData +#define METAL_TextureData @YupPluginPrefix@_YupPlugin_METAL_TextureData +#define SDLEAGLContext @YupPluginPrefix@_YupPlugin_SDLEAGLContext +#define SDLOpenGLContext @YupPluginPrefix@_YupPlugin_SDLOpenGLContext +#define SDLApplication @YupPluginPrefix@_YupPlugin_SDLApplication +#define SDLAppDelegate @YupPluginPrefix@_YupPlugin_SDLAppDelegate +#define SDLInterruptionListener @YupPluginPrefix@_YupPlugin_SDLInterruptionListener +#define SDLLaunchScreenController @YupPluginPrefix@_YupPlugin_SDLLaunchScreenController +#define SDLLaunchStoryboardViewController @YupPluginPrefix@_YupPlugin_SDLLaunchStoryboardViewController +#define SDLMessageBoxPresenter @YupPluginPrefix@_YupPlugin_SDLMessageBoxPresenter +#define SDLTranslatorResponder @YupPluginPrefix@_YupPlugin_SDLTranslatorResponder +#define SDLView @YupPluginPrefix@_YupPlugin_SDLView +#define SDLWindow @YupPluginPrefix@_YupPlugin_SDLWindow +#define SDL_CocoaClosure @YupPluginPrefix@_YupPlugin_SDL_CocoaClosure +#define SDL_DisplayData @YupPluginPrefix@_YupPlugin_SDL_DisplayData +#define SDL_DisplayModeData @YupPluginPrefix@_YupPlugin_SDL_DisplayModeData +#define SDL_DisplayWatch @YupPluginPrefix@_YupPlugin_SDL_DisplayWatch +#define SDL_LifecycleObserver @YupPluginPrefix@_YupPlugin_SDL_LifecycleObserver +#define SDL_RumbleContext @YupPluginPrefix@_YupPlugin_SDL_RumbleContext +#define SDL_RumbleMotor @YupPluginPrefix@_YupPlugin_SDL_RumbleMotor +#define SDL_ShapeData @YupPluginPrefix@_YupPlugin_SDL_ShapeData +#define SDL_VideoData @YupPluginPrefix@_YupPlugin_SDL_VideoData +#define SDL_WindowData @YupPluginPrefix@_YupPlugin_SDL_WindowData +#define SDL_cocoametalview @YupPluginPrefix@_YupPlugin_SDL_cocoametalview +#define SDL_uikitmetalview @YupPluginPrefix@_YupPlugin_SDL_uikitmetalview +#define SDL_uikitopenglview @YupPluginPrefix@_YupPlugin_SDL_uikitopenglview +#define SDL_uikitview @YupPluginPrefix@_YupPlugin_SDL_uikitview +#define SDL_uikitviewcontroller @YupPluginPrefix@_YupPlugin_SDL_uikitviewcontroller +#define SDL_uikitwindow @YupPluginPrefix@_YupPlugin_SDL_uikitwindow +#define SDLUIKitDelegate @YupPluginPrefix@_YupPlugin_SDLUIKitDelegate +#define SDLUITextField @YupPluginPrefix@_YupPlugin_SDLUITextField + +#define HIDBLEDevice @YupPluginPrefix@_YupPlugin_HIDBLEDevice +#define HIDBLEManager @YupPluginPrefix@_YupPlugin_HIDBLEManager + +#endif // @YupPluginPrefix@_YUP_SDL_SYMBOLS_PATCH_H diff --git a/cmake/yup.cmake b/cmake/yup.cmake index 4df50e442..c3fcaa353 100644 --- a/cmake/yup.cmake +++ b/cmake/yup.cmake @@ -94,9 +94,10 @@ _yup_setup_platform() include (${CMAKE_CURRENT_LIST_DIR}/yup_utilities.cmake) include (${CMAKE_CURRENT_LIST_DIR}/yup_dependencies.cmake) include (${CMAKE_CURRENT_LIST_DIR}/yup_modules.cmake) +include (${CMAKE_CURRENT_LIST_DIR}/yup_codesign.cmake) +include (${CMAKE_CURRENT_LIST_DIR}/yup_sdl.cmake) include (${CMAKE_CURRENT_LIST_DIR}/yup_standalone.cmake) include (${CMAKE_CURRENT_LIST_DIR}/yup_pluginval.cmake) -include (${CMAKE_CURRENT_LIST_DIR}/yup_codesign.cmake) include (${CMAKE_CURRENT_LIST_DIR}/yup_audio_plugin.cmake) include (${CMAKE_CURRENT_LIST_DIR}/yup_embed_binary.cmake) include (${CMAKE_CURRENT_LIST_DIR}/yup_python.cmake) diff --git a/cmake/yup_audio_plugin.cmake b/cmake/yup_audio_plugin.cmake index 08bcd1000..b0278c0cc 100644 --- a/cmake/yup_audio_plugin.cmake +++ b/cmake/yup_audio_plugin.cmake @@ -108,7 +108,6 @@ function (yup_audio_plugin) # ==== Find dependencies include (FetchContent) _yup_fetch_sdl2() - list (APPEND additional_libraries sdl2::sdl2) _yup_target_list_contains ("${YUP_ARG_MODULES}" yup_audio_plugin_host has_audio_plugin_host) if (has_audio_plugin_host) @@ -146,12 +145,18 @@ function (yup_audio_plugin) YUP_AUDIO_PLUGIN_ENABLE_CLAP=1 YUP_STANDALONE_APPLICATION=0) + _yup_sdl_configure_symbols_patch ("${target_name}_clap_plugin" clap_sdl_symbols_patch_target clap_sdl_symbols_sdl_target) + set (clap_plugin_bundle_libraries + ${clap_sdl_symbols_sdl_target} + ${clap_sdl_symbols_patch_target}) + target_link_libraries (${target_name}_clap_plugin PRIVATE ${target_name}_shared yup_audio_plugin_client clap ${target_name}_clap ${additional_libraries} + ${clap_plugin_bundle_libraries} ${YUP_ARG_MODULES}) _yup_module_apply_arc_to_target_sources (${target_name}_clap_plugin @@ -160,6 +165,7 @@ function (yup_audio_plugin) clap ${target_name}_clap ${additional_libraries} + ${clap_plugin_bundle_libraries} ${YUP_ARG_MODULES}) set_target_properties (${target_name}_clap_plugin PROPERTIES @@ -233,12 +239,18 @@ function (yup_audio_plugin) YUP_AUDIO_PLUGIN_ENABLE_VST3=1 YUP_STANDALONE_APPLICATION=0) + _yup_sdl_configure_symbols_patch ("${target_name}_vst3_plugin" vst3_sdl_symbols_patch_target vst3_sdl_symbols_sdl_target) + set (vst3_plugin_bundle_libraries + ${vst3_sdl_symbols_sdl_target} + ${vst3_sdl_symbols_patch_target}) + target_link_libraries (${target_name}_vst3_plugin PRIVATE ${target_name}_shared yup_audio_plugin_client sdk ${target_name}_vst3 ${additional_libraries} + ${vst3_plugin_bundle_libraries} ${YUP_ARG_MODULES}) _yup_module_apply_arc_to_target_sources (${target_name}_vst3_plugin @@ -247,6 +259,7 @@ function (yup_audio_plugin) sdk ${target_name}_vst3 ${additional_libraries} + ${vst3_plugin_bundle_libraries} ${YUP_ARG_MODULES}) set_target_properties (${target_name}_vst3_plugin PROPERTIES @@ -375,12 +388,18 @@ function (yup_audio_plugin) YUP_AUDIO_PLUGIN_ENABLE_AU=1 YUP_STANDALONE_APPLICATION=0) + _yup_sdl_configure_symbols_patch ("${target_name}_au_plugin" au_sdl_symbols_patch_target au_sdl_symbols_sdl_target) + set (au_plugin_bundle_libraries + ${au_sdl_symbols_sdl_target} + ${au_sdl_symbols_patch_target}) + target_link_libraries (${target_name}_au_plugin PRIVATE ${target_name}_shared yup_audio_plugin_client base-sdk-auv2 ${target_name}_au ${additional_libraries} + ${au_plugin_bundle_libraries} ${YUP_ARG_MODULES} "-framework AudioUnit" "-framework AudioToolbox" @@ -394,6 +413,7 @@ function (yup_audio_plugin) base-sdk-auv2 ${target_name}_au ${additional_libraries} + ${au_plugin_bundle_libraries} ${YUP_ARG_MODULES}) # Generate the AU Info.plist from our template diff --git a/cmake/yup_dependencies.cmake b/cmake/yup_dependencies.cmake index 14e4a2c80..6d0a597da 100644 --- a/cmake/yup_dependencies.cmake +++ b/cmake/yup_dependencies.cmake @@ -60,7 +60,9 @@ function (_yup_fetch_sdl2) FetchContent_MakeAvailable (SDL2) if (APPLE) - target_compile_options (SDL2-static PRIVATE -Wno-deprecated-declarations) + target_compile_options (SDL2-static PRIVATE + -Wno-deprecated-declarations + -Wno-gnu-folding-constant) endif() set_target_properties (SDL2-static PROPERTIES diff --git a/cmake/yup_sdl.cmake b/cmake/yup_sdl.cmake new file mode 100644 index 000000000..9fc9de51b --- /dev/null +++ b/cmake/yup_sdl.cmake @@ -0,0 +1,248 @@ +# ============================================================================== +# +# This file is part of the YUP library. +# Copyright (c) 2026 - kunitoki@gmail.com +# +# YUP is an open source library subject to open-source licensing. +# +# The code included in this file is provided under the terms of the ISC license +# http://www.isc.org/downloads/software-support-policy/isc-license. Permission +# To use, copy, modify, and/or distribute this software for any purpose with or +# without fee is hereby granted provided that the above copyright notice and +# this permission notice appear in all copies. +# +# YUP IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER +# EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE +# DISCLAIMED. +# +# ============================================================================== + +#============================================================================== + +function (_yup_sdl_make_symbols_force_include_options output_variable patch_header) + set (force_include_options "") + + foreach (source_language IN ITEMS C CXX OBJC OBJCXX) + list (APPEND force_include_options + "$<$:/FI${patch_header}>" + "$<$:-include>" + "$<$:${patch_header}>") + endforeach() + + set (${output_variable} "${force_include_options}" PARENT_SCOPE) +endfunction() + +#============================================================================== + +function (_yup_sdl_get_target_property output_variable target_name property_name) + get_target_property (property_value ${target_name} ${property_name}) + if (property_value) + set (${output_variable} "${property_value}" PARENT_SCOPE) + else() + set (${output_variable} "" PARENT_SCOPE) + endif() +endfunction() + +#============================================================================== + +function (_yup_sdl_collect_private_include_dirs output_variable sdl_source_dir) + set (include_dirs "") + + foreach (include_dir IN ITEMS + "${sdl_source_dir}/src" + "${sdl_source_dir}/src/hidapi" + "${sdl_source_dir}/src/video/khronos") + if (EXISTS "${include_dir}") + list (APPEND include_dirs "${include_dir}") + endif() + endforeach() + + file (GLOB_RECURSE sdl_private_headers CONFIGURE_DEPENDS + "${sdl_source_dir}/src/*.h" + "${sdl_source_dir}/src/*.hpp") + + foreach (sdl_private_header IN LISTS sdl_private_headers) + get_filename_component (include_dir "${sdl_private_header}" DIRECTORY) + list (APPEND include_dirs "${include_dir}") + endforeach() + + list (REMOVE_DUPLICATES include_dirs) + set (${output_variable} "${include_dirs}" PARENT_SCOPE) +endfunction() + +#============================================================================== + +function (_yup_sdl_apply_build_options private_sdl_target) + if (NOT TARGET sdl-build-options) + return() + endif() + + _yup_sdl_get_target_property (sdl_build_include_dirs sdl-build-options INTERFACE_INCLUDE_DIRECTORIES) + if (sdl_build_include_dirs) + target_include_directories (${private_sdl_target} SYSTEM PRIVATE ${sdl_build_include_dirs}) + endif() + + _yup_sdl_get_target_property (sdl_build_system_include_dirs sdl-build-options INTERFACE_SYSTEM_INCLUDE_DIRECTORIES) + if (sdl_build_system_include_dirs) + target_include_directories (${private_sdl_target} SYSTEM PRIVATE ${sdl_build_system_include_dirs}) + endif() + + _yup_sdl_get_target_property (sdl_build_compile_definitions sdl-build-options INTERFACE_COMPILE_DEFINITIONS) + if (sdl_build_compile_definitions) + target_compile_definitions (${private_sdl_target} PRIVATE ${sdl_build_compile_definitions}) + endif() + + _yup_sdl_get_target_property (sdl_build_compile_options sdl-build-options INTERFACE_COMPILE_OPTIONS) + if (sdl_build_compile_options) + target_compile_options (${private_sdl_target} PRIVATE ${sdl_build_compile_options}) + endif() + + _yup_sdl_get_target_property (sdl_build_link_libraries sdl-build-options INTERFACE_LINK_LIBRARIES) + if (sdl_build_link_libraries) + target_link_libraries (${private_sdl_target} PRIVATE ${sdl_build_link_libraries}) + endif() +endfunction() + +#============================================================================== + +function (_yup_sdl_configure_private_static_target target_name force_include_options output_target) + if (NOT TARGET SDL2-static) + _yup_message (FATAL_ERROR "Cannot configure private SDL symbols for ${target_name}: SDL2-static target is not available.") + endif() + + _yup_sdl_get_target_property (sdl_sources SDL2-static SOURCES) + if (NOT sdl_sources) + _yup_message (FATAL_ERROR "Cannot configure private SDL symbols for ${target_name}: SDL2-static has no source files.") + endif() + + set (private_sdl_target "${target_name}_sdl2") + add_library (${private_sdl_target} STATIC ${sdl_sources}) + + if (APPLE) + set (sdl_objc_sources "") + foreach (sdl_source IN LISTS sdl_sources) + if (sdl_source MATCHES "^.*\\.m$") + list (APPEND sdl_objc_sources "${sdl_source}") + endif() + endforeach() + + if (sdl_objc_sources) + set_property (SOURCE ${sdl_objc_sources} + TARGET_DIRECTORY ${private_sdl_target} + APPEND_STRING PROPERTY COMPILE_FLAGS " -x objective-c") + endif() + endif() + + if (TARGET sdl_headers_copy) + add_dependencies (${private_sdl_target} sdl_headers_copy) + endif() + + _yup_sdl_get_target_property (sdl_include_dirs SDL2-static INCLUDE_DIRECTORIES) + if (sdl_include_dirs) + target_include_directories (${private_sdl_target} PRIVATE ${sdl_include_dirs}) + endif() + + _yup_sdl_get_target_property (sdl_source_dir SDL2-static SOURCE_DIR) + if (sdl_source_dir) + _yup_sdl_collect_private_include_dirs (sdl_private_include_dirs "${sdl_source_dir}") + if (sdl_private_include_dirs) + target_include_directories (${private_sdl_target} SYSTEM PRIVATE ${sdl_private_include_dirs}) + endif() + endif() + + _yup_sdl_apply_build_options (${private_sdl_target}) + + _yup_sdl_get_target_property (sdl_interface_include_dirs SDL2-static INTERFACE_INCLUDE_DIRECTORIES) + if (sdl_interface_include_dirs) + target_include_directories (${private_sdl_target} INTERFACE ${sdl_interface_include_dirs}) + endif() + + _yup_sdl_get_target_property (sdl_compile_definitions SDL2-static COMPILE_DEFINITIONS) + if (sdl_compile_definitions) + target_compile_definitions (${private_sdl_target} PRIVATE ${sdl_compile_definitions}) + endif() + + _yup_sdl_get_target_property (sdl_interface_compile_definitions SDL2-static INTERFACE_COMPILE_DEFINITIONS) + if (sdl_interface_compile_definitions) + target_compile_definitions (${private_sdl_target} INTERFACE ${sdl_interface_compile_definitions}) + endif() + + _yup_sdl_get_target_property (sdl_compile_options SDL2-static COMPILE_OPTIONS) + target_compile_options (${private_sdl_target} PRIVATE + ${sdl_compile_options} + ${force_include_options}) + + _yup_sdl_get_target_property (sdl_interface_compile_options SDL2-static INTERFACE_COMPILE_OPTIONS) + if (sdl_interface_compile_options) + target_compile_options (${private_sdl_target} INTERFACE ${sdl_interface_compile_options}) + endif() + + _yup_sdl_get_target_property (sdl_link_libraries SDL2-static LINK_LIBRARIES) + if (sdl_link_libraries) + target_link_libraries (${private_sdl_target} PRIVATE ${sdl_link_libraries}) + endif() + + _yup_sdl_get_target_property (sdl_interface_link_libraries SDL2-static INTERFACE_LINK_LIBRARIES) + if (sdl_interface_link_libraries) + target_link_libraries (${private_sdl_target} INTERFACE ${sdl_interface_link_libraries}) + endif() + + _yup_sdl_get_target_property (sdl_link_options SDL2-static LINK_OPTIONS) + if (sdl_link_options) + target_link_options (${private_sdl_target} PRIVATE ${sdl_link_options}) + endif() + + _yup_sdl_get_target_property (sdl_interface_link_options SDL2-static INTERFACE_LINK_OPTIONS) + if (sdl_interface_link_options) + target_link_options (${private_sdl_target} INTERFACE ${sdl_interface_link_options}) + endif() + + _yup_sdl_get_target_property (sdl_position_independent_code SDL2-static POSITION_INDEPENDENT_CODE) + if (sdl_position_independent_code) + set_target_properties (${private_sdl_target} PROPERTIES + POSITION_INDEPENDENT_CODE "${sdl_position_independent_code}") + endif() + + _yup_sdl_get_target_property (sdl_debug_postfix SDL2-static DEBUG_POSTFIX) + if (sdl_debug_postfix) + set_target_properties (${private_sdl_target} PROPERTIES + DEBUG_POSTFIX "${sdl_debug_postfix}") + endif() + + set_target_properties (${private_sdl_target} PROPERTIES + OUTPUT_NAME "${target_name}_SDL2-static" + FOLDER "Thirdparty") + + set_property (TARGET ${private_sdl_target} APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SDL2_SHARED) + set_property (TARGET ${private_sdl_target} PROPERTY INTERFACE_SDL2_SHARED FALSE) + set_property (TARGET ${private_sdl_target} APPEND PROPERTY COMPATIBLE_INTERFACE_STRING "SDL_VERSION") + set_property (TARGET ${private_sdl_target} PROPERTY INTERFACE_SDL_VERSION "SDL2") + + set (${output_target} "${private_sdl_target}" PARENT_SCOPE) +endfunction() + +#============================================================================== + +function (_yup_sdl_configure_symbols_patch target_name output_patch_target output_sdl_target) + string (MAKE_C_IDENTIFIER "${target_name}" YupPluginPrefix) + if (YupPluginPrefix MATCHES "^[0-9]") + set (YupPluginPrefix "_${YupPluginPrefix}") + endif() + + set (patch_header "${CMAKE_CURRENT_BINARY_DIR}/${target_name}_sdl-symbols-patch.h") + configure_file ("${CMAKE_CURRENT_FUNCTION_LIST_DIR}/resources/sdl-symbols-patch.h.in" "${patch_header}" @ONLY) + + set (patch_target "${target_name}_sdl_symbols_patch") + add_library (${patch_target} INTERFACE) + target_sources (${patch_target} INTERFACE "${patch_header}") + + _yup_sdl_make_symbols_force_include_options (force_include_options "${patch_header}") + target_compile_options (${patch_target} INTERFACE ${force_include_options}) + + _yup_sdl_configure_private_static_target ("${target_name}" "${force_include_options}" private_sdl_target) + + set (${output_patch_target} "${patch_target}" PARENT_SCOPE) + set (${output_sdl_target} "${private_sdl_target}" PARENT_SCOPE) +endfunction() + +#==============================================================================