cmake_minimum_required(VERSION 3.22) project(RMX19 VERSION 1.0.0 LANGUAGES C CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") set(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "arch") set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0" CACHE STRING "deployment target") endif() # --------------------------------------------------------------------------- # Git + compile-time build info (shown in the LCD status footer) # --------------------------------------------------------------------------- if(NOT DEFINED BUILD_GIT_BRANCH) execute_process(COMMAND git -C "${CMAKE_CURRENT_SOURCE_DIR}" rev-parse --abbrev-ref HEAD OUTPUT_VARIABLE _GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE _OK) if(NOT _OK EQUAL 0) set(BUILD_GIT_BRANCH "no-vcs") else() set(BUILD_GIT_BRANCH "${_GIT_BRANCH}") endif() endif() if(NOT DEFINED BUILD_GIT_COMMIT) execute_process(COMMAND git -C "${CMAKE_CURRENT_SOURCE_DIR}" rev-parse --short HEAD OUTPUT_VARIABLE _GIT_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE _OK) if(NOT _OK EQUAL 0) set(BUILD_GIT_COMMIT "0000000") else() set(BUILD_GIT_COMMIT "${_GIT_COMMIT}") endif() endif() if(NOT DEFINED BUILD_GIT_DIRTY) execute_process(COMMAND git -C "${CMAKE_CURRENT_SOURCE_DIR}" status --porcelain OUTPUT_VARIABLE _GIT_DIRTY OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE _OK) if(NOT _OK EQUAL 0) set(BUILD_GIT_DIRTY "?") elseif(NOT "${_GIT_DIRTY}" STREQUAL "") set(BUILD_GIT_DIRTY "*") else() set(BUILD_GIT_DIRTY "") endif() endif() string(TIMESTAMP BUILD_DATE "%Y-%m-%d") string(TIMESTAMP BUILD_TIME "%H:%M:%S") configure_file(Source/BuildInfo.h.in ${CMAKE_CURRENT_BINARY_DIR}/Source/BuildInfo.h @ONLY) message(STATUS "RMX-19 build: ${BUILD_GIT_BRANCH} ${BUILD_GIT_COMMIT}${BUILD_GIT_DIRTY} @ ${BUILD_DATE} ${BUILD_TIME}") # --------------------------------------------------------------------------- # JUCE # --------------------------------------------------------------------------- if(NOT DEFINED JUCE_ROOT) if(EXISTS "$ENV{HOME}/JUCE/CMakeLists.txt") set(JUCE_ROOT "$ENV{HOME}/JUCE") elseif(EXISTS "/opt/JUCE/CMakeLists.txt") set(JUCE_ROOT "/opt/JUCE") endif() endif() if(NOT DEFINED JUCE_ROOT OR NOT EXISTS "${JUCE_ROOT}/CMakeLists.txt") message(FATAL_ERROR "JUCE not found. Set -DJUCE_ROOT=") endif() add_subdirectory(${JUCE_ROOT} juce) # RMX-19 has no web UI and does no networking. # - JUCE_WEB_BROWSER=0: juce_audio_processors depends on juce_gui_extra, whose # Linux source includes and the WebKit headers unless the browser # component is switched off. This keeps the Linux build free of GTK/WebKit # (and of native file-chooser dialogs, which this plug-in never uses). # - JUCE_USE_CURL=0: juce_core otherwise compiles libcurl-backed code, which # fails to link on Linux (curl_* undefined) unless libcurl is linked in. # JUCE falls back to its own socket-based implementation. add_compile_definitions(JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0) # AU is only buildable on Apple; on Linux (and everywhere else) ship VST3. if(APPLE) set(RMX19_FORMATS AU VST3) else() set(RMX19_FORMATS VST3) endif() juce_add_plugin(RMX19 PRODUCT_NAME "RMX-19" PLUGIN_NAME "RMX-19" BUNDLE_ID "com.rackmodule.rmx19" COMPANY_NAME "Rack Module Labs" COMPANY_WEBSITE "https://localhost/rmx19" COMPANY_EMAIL "dev@null.local" VERSION "1.0.0" DESCRIPTION "19 inch rack digital sound module" PLUGIN_MANUFACTURER_CODE "Rmlb" PLUGIN_CODE "Rmx1" FORMATS ${RMX19_FORMATS} IS_SYNTH TRUE NEEDS_MIDI_INPUT TRUE EDITOR_WANTS_KEYBOARD_FOCUS TRUE ) set(RMX19_SOURCES Source/PluginProcessor.cpp Source/PluginEditor.cpp Source/LcdPanel.cpp Source/PresetBank.cpp Source/SynthEngine.cpp Source/Params.cpp ) juce_add_binary_data(RMX19_Assets NAMESPACE BinaryData SOURCES b3.png ) target_sources(RMX19 PRIVATE ${RMX19_SOURCES}) target_include_directories(RMX19 PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/Source" "${CMAKE_CURRENT_BINARY_DIR}/Source") target_link_libraries(RMX19 PRIVATE RMX19_Assets juce::juce_audio_utils juce::juce_gui_basics juce::juce_dsp) target_compile_definitions(RMX19 PRIVATE JUCE_MODAL_LOOPS_PERMITTED=1 JUCE_VST3_CAN_REPLACE_VST2=0) # --------------------------------------------------------------------------- # Offline probe (dev only): runs the processor with scripted MIDI, no GUI. # --------------------------------------------------------------------------- add_executable(rmx_probe Source/Probe.cpp Source/PluginProcessor.cpp Source/PluginEditor.cpp Source/LcdPanel.cpp Source/PresetBank.cpp Source/SynthEngine.cpp Source/Params.cpp) target_include_directories(rmx_probe PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/Source" "${CMAKE_CURRENT_BINARY_DIR}/Source" "${CMAKE_CURRENT_BINARY_DIR}/juce_binarydata_RMX19_Assets/JuceLibraryCode") target_link_libraries(rmx_probe PRIVATE RMX19_Assets juce::juce_audio_utils juce::juce_gui_basics juce::juce_dsp)