cs-midi/tests/examples/CMakeLists.txt

134 lines
3.9 KiB
CMake

# Compile-verify all examples as a single OBJECT library.
# Each .cpp compiles independently — no linking, no main() conflicts.
# --------------------------------------------------------------------------- #
# pico_deps — aggregates all pico-sdk and cs_midi include directories
# and compile definitions into one STATIC library. Everything links PRIVATE
# so INTERFACE_SOURCES compile only once here. Examples then copy the
# resolved includes/defs via generator expressions (no target_link_libraries
# on the OBJECT library, so no INTERFACE_SOURCES leak into it).
# --------------------------------------------------------------------------- #
add_library(pico_deps STATIC pico_deps_stub.c)
target_include_directories(pico_deps PUBLIC
${CMAKE_SOURCE_DIR}
${CMAKE_CURRENT_LIST_DIR}
)
target_link_libraries(pico_deps PRIVATE pico_stdlib hardware_adc hardware_sync cs_midi)
if(CS_MIDI_BLE)
target_link_libraries(pico_deps PRIVATE
pico_cyw43_arch_lwip_threadsafe_background
pico_btstack_ble
pico_btstack_cyw43
)
endif()
if(CS_MIDI_USB)
target_link_libraries(pico_deps PRIVATE tinyusb_device tinyusb_board)
endif()
if(CS_MIDI_SERIAL)
target_link_libraries(pico_deps PRIVATE hardware_uart)
endif()
if(CS_MIDI_APPLEMIDI)
target_link_libraries(pico_deps PRIVATE pico_lwip_mdns)
if(NOT CS_MIDI_BLE)
target_link_libraries(pico_deps PRIVATE
pico_cyw43_arch_lwip_threadsafe_background)
endif()
endif()
# --------------------------------------------------------------------------- #
# Example sources
# --------------------------------------------------------------------------- #
set(EXAMPLE_SOURCES
# Output elements
output/note_button.cpp
output/cc_button.cpp
output/pc_button.cpp
output/note_chord_button.cpp
output/note_button_latched.cpp
output/note_button_latching.cpp
output/note_buttons.cpp
output/note_button_matrix.cpp
output/cc_button_latched.cpp
output/cc_button_latching.cpp
output/cc_buttons.cpp
output/cc_button_matrix.cpp
output/cc_potentiometer.cpp
output/pb_potentiometer.cpp
output/cc_rotary_encoder.cpp
output/cc_absolute_encoder.cpp
output/pb_absolute_encoder.cpp
output/cc_increment_decrement_buttons.cpp
output/program_changer.cpp
output/cc_potentiometers.cpp
output/borrowed_cc_rotary_encoder.cpp
# Input elements
input/note_led.cpp
input/note_range_leds.cpp
input/cc_value.cpp
input/pb_value.cpp
input/note_value.cpp
input/kp_value.cpp
input/cc_led.cpp
input/note_range.cpp
input/cc_range.cpp
# Interfaces
interfaces/ble_midi.cpp
interfaces/midi_pipes.cpp
# Banks
banks/bank_cc_values.cpp
banks/transposer.cpp
banks/encoder_selector.cpp
banks/many_buttons_selector.cpp
banks/switch_selector.cpp
banks/program_change_selector.cpp
banks/bankable_note_led.cpp
)
if(CS_MIDI_USB)
list(APPEND EXAMPLE_SOURCES
interfaces/usb_midi.cpp
usb_descriptors.c
)
endif()
if(CS_MIDI_SERIAL)
list(APPEND EXAMPLE_SOURCES interfaces/serial_midi.cpp)
endif()
if(CS_MIDI_BLE AND CS_MIDI_USB)
list(APPEND EXAMPLE_SOURCES interfaces/dual_midi.cpp)
endif()
if(CS_MIDI_APPLEMIDI)
list(APPEND EXAMPLE_SOURCES interfaces/applemidi.cpp)
endif()
if(CS_MIDI_APPLEMIDI AND CS_MIDI_BLE)
list(APPEND EXAMPLE_SOURCES interfaces/applemidi_ble.cpp)
endif()
# --------------------------------------------------------------------------- #
# OBJECT library — compile only, no linking.
# Uses resolved includes/defs from pico_deps directly to avoid
# pico-sdk INTERFACE_SOURCES being injected into this target.
# --------------------------------------------------------------------------- #
add_library(examples OBJECT ${EXAMPLE_SOURCES})
target_include_directories(examples PRIVATE
$<TARGET_PROPERTY:pico_deps,INCLUDE_DIRECTORIES>
)
target_compile_definitions(examples PRIVATE
$<TARGET_PROPERTY:pico_deps,COMPILE_DEFINITIONS>
)