cmake_minimum_required(VERSION 3.22) project(PluginBridge VERSION 0.4.0 LANGUAGES C CXX OBJCXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_subdirectory(JUCE) # ───────────────────────────────────────────────────────────── # Target 1: PluginBridge VST3/AU (loaded in DAW) # Thin shell: shared memory audio bridge + MCP server # GUI via CARemoteLayerClient (receives remote layer from Helper) # ───────────────────────────────────────────────────────────── juce_add_plugin(PluginBridge COMPANY_NAME "PluginBridge" BUNDLE_ID "com.pluginbridge.pluginbridge" PLUGIN_MANUFACTURER_CODE Plbr PLUGIN_CODE Plbr FORMATS VST3 AU PRODUCT_NAME "PluginBridge" IS_SYNTH FALSE NEEDS_MIDI_INPUT TRUE NEEDS_MIDI_OUTPUT TRUE IS_MIDI_EFFECT FALSE EDITOR_WANTS_KEYBOARD_FOCUS TRUE COPY_PLUGIN_AFTER_BUILD TRUE VST3_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/VST3" AU_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/Components" ) target_sources(PluginBridge PRIVATE Source/Plugin/PluginBridgeProcessor.cpp Source/Plugin/PluginBridgeEditor.mm Source/Plugin/PluginPickerComponent.mm Source/Plugin/HelperConnection.cpp Source/Plugin/McpServer.cpp ) target_include_directories(PluginBridge PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/libs ${CMAKE_CURRENT_SOURCE_DIR}/Source/Plugin ${CMAKE_CURRENT_SOURCE_DIR}/Source/Shared ) target_compile_definitions(PluginBridge PUBLIC JUCE_PLUGINHOST_VST3=1 JUCE_PLUGINHOST_AU=1 JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0 JUCE_VST3_CAN_REPLACE_VST2=0 JUCE_DISPLAY_SPLASH_SCREEN=0 JUCE_REPORT_APP_USAGE=0 ) target_link_libraries(PluginBridge PRIVATE juce::juce_audio_utils juce::juce_audio_processors juce::juce_dsp juce::juce_gui_basics "-framework QuartzCore" PUBLIC juce::juce_recommended_config_flags juce::juce_recommended_lto_flags juce::juce_recommended_warning_flags ) # ───────────────────────────────────────────────────────────── # Target 2: PluginBridgeHelper (separate process) # Hosts the actual plugin: audio processing + GUI rendering # GUI served via CARemoteLayerServer # ───────────────────────────────────────────────────────────── juce_add_gui_app(PluginBridgeHelper PRODUCT_NAME "PluginBridgeHelper" BUNDLE_ID "com.pluginbridge.helper" COMPANY_NAME "PluginBridge" ) target_sources(PluginBridgeHelper PRIVATE Source/Helper/main.cpp Source/Helper/HelperPluginHost.mm Source/Helper/HelperIPC.cpp ) target_include_directories(PluginBridgeHelper PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/libs ${CMAKE_CURRENT_SOURCE_DIR}/Source/Helper ${CMAKE_CURRENT_SOURCE_DIR}/Source/Shared ) target_compile_definitions(PluginBridgeHelper PRIVATE JUCE_PLUGINHOST_VST3=1 JUCE_PLUGINHOST_AU=1 JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0 JUCE_DISPLAY_SPLASH_SCREEN=0 JUCE_REPORT_APP_USAGE=0 ) target_link_libraries(PluginBridgeHelper PRIVATE juce::juce_audio_utils juce::juce_audio_processors juce::juce_dsp juce::juce_gui_basics juce::juce_events "-framework QuartzCore" PUBLIC juce::juce_recommended_config_flags juce::juce_recommended_lto_flags juce::juce_recommended_warning_flags ) # ───────────────────────────────────────────────────────────── # Post-build: Copy full PluginBridgeHelper.app into .vst3 bundle # ───────────────────────────────────────────────────────────── add_dependencies(PluginBridge PluginBridgeHelper) add_custom_command(TARGET PluginBridge POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "$/Contents/Resources" COMMAND ${CMAKE_COMMAND} -E rm -rf "$/Contents/Resources/PluginBridgeHelper.app" COMMAND ${CMAKE_COMMAND} -E copy_directory "$" "$/Contents/Resources/PluginBridgeHelper.app" COMMENT "Bundling PluginBridgeHelper.app inside PluginBridge.vst3" )