cmake_minimum_required(VERSION 3.25)
project(xtc_juce_examples VERSION 0.1.0 LANGUAGES C CXX)
include(CTest)
set(XTC_JUCE_ROOT "" CACHE PATH "External JUCE source checkout")
if(NOT EXISTS "${XTC_JUCE_ROOT}/modules/juce_audio_utils/juce_audio_utils.h")
    message(FATAL_ERROR "Set XTC_JUCE_ROOT to an external JUCE checkout; normal xtc builds do not download JUCE")
endif()
if(NOT UNIX OR APPLE)
    message(FATAL_ERROR "The xtc C core bridge is currently qualified on Linux/POSIX only")
endif()
message(STATUS "JUCE is AGPLv3/commercial: review the external SDK LICENSE.md before distributing these binaries")
set(JUCE_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(JUCE_BUILD_EXTRAS OFF CACHE BOOL "" FORCE)
add_subdirectory("${XTC_JUCE_ROOT}" juce-sdk EXCLUDE_FROM_ALL)
get_filename_component(XTC_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../.." ABSOLUTE)
if(NOT TARGET xtc-core)
    set(XTC_BUILD_GUI OFF CACHE BOOL "" FORCE)
    set(XTC_WITH_JACK OFF CACHE BOOL "" FORCE)
    set(XTC_BUILD_JUCE OFF CACHE BOOL "" FORCE)
    set(XTC_BUILD_STEINBERG OFF CACHE BOOL "" FORCE)
    set(xtc_saved_testing ${BUILD_TESTING})
    set(BUILD_TESTING OFF)
    add_subdirectory("${XTC_ROOT}" c-core EXCLUDE_FROM_ALL)
    set(BUILD_TESTING ${xtc_saved_testing})
endif()

juce_add_plugin(XtcJuceSynth
    COMPANY_NAME xtc
    BUNDLE_ID org.xtc.juce.synth
    PLUGIN_MANUFACTURER_CODE Xtca
    PLUGIN_CODE Xjcs
    PRODUCT_NAME "xtc JUCE Synth"
    IS_SYNTH TRUE
    NEEDS_MIDI_INPUT TRUE
    NEEDS_MIDI_OUTPUT FALSE
    EDITOR_WANTS_KEYBOARD_FOCUS FALSE
    COPY_PLUGIN_AFTER_BUILD FALSE
    FORMATS VST3 Standalone
    NEEDS_WEB_BROWSER FALSE
    NEEDS_CURL FALSE)
target_sources(XtcJuceSynth PRIVATE Processor.cpp Editor.cpp PluginEntry.cpp)
# JUCE’s bundled FLAC uses POSIX fileno; its C module sources need GNU extensions.
# The xtc-core target remains strict C99.
set_target_properties(XtcJuceSynth PROPERTIES C_STANDARD 11 C_EXTENSIONS ON)
target_compile_features(XtcJuceSynth PUBLIC cxx_std_17)
target_compile_definitions(XtcJuceSynth PUBLIC
    JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0 JUCE_VST3_CAN_REPLACE_VST2=0 JUCE_PLUGINHOST_VST3=1
    )
target_include_directories(XtcJuceSynth PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}" "${XTC_ROOT}/include")
target_link_libraries(XtcJuceSynth PRIVATE xtc-core juce::juce_audio_utils juce::juce_dsp
    PUBLIC juce::juce_recommended_config_flags juce::juce_recommended_warning_flags)

add_executable(xtc-juce-render Render.cpp)
set_target_properties(xtc-juce-render PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/xtc-juce-render_artefacts/$<CONFIG>")
target_compile_features(xtc-juce-render PRIVATE cxx_std_17)
target_include_directories(xtc-juce-render PRIVATE "${XTC_JUCE_ROOT}/modules")
# Exact float comparisons intentionally check bit-identical C bridge output.
set_source_files_properties(Render.cpp PROPERTIES COMPILE_OPTIONS "-Wno-float-equal")
target_compile_definitions(xtc-juce-render PRIVATE JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1)
target_link_libraries(xtc-juce-render PRIVATE XtcJuceSynth xtc-core)
if(BUILD_TESTING)
    find_program(XTC_XVFB_RUN xvfb-run REQUIRED)
    add_test(NAME xtc-juce-processor COMMAND ${XTC_XVFB_RUN} -a $<TARGET_FILE:xtc-juce-render> --self-test)
    add_test(NAME xtc-juce-vst3 COMMAND ${XTC_XVFB_RUN} -a $<TARGET_FILE:xtc-juce-render>
        --host-check "$<PATH:GET_PARENT_PATH,$<PATH:GET_PARENT_PATH,$<TARGET_FILE_DIR:XtcJuceSynth_VST3>>>")
    set_tests_properties(xtc-juce-processor xtc-juce-vst3 PROPERTIES LABELS sdk)
endif()
