cmake_minimum_required(VERSION 3.22) project(MonoStep VERSION 1.0.0 LANGUAGES C CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0") set(CMAKE_OSX_ARCHITECTURES "arm64") # --- build metadata (git info + build date) ---------------------------------- set(MONOSTEP_GIT_STRING "no-vcs") find_package(Git QUIET) if(Git_FOUND) execute_process( COMMAND ${GIT_EXECUTABLE} -C "${CMAKE_CURRENT_LIST_DIR}" rev-parse --short HEAD OUTPUT_VARIABLE MONOSTEP_GIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET ) execute_process( COMMAND ${GIT_EXECUTABLE} -C "${CMAKE_CURRENT_LIST_DIR}" status --porcelain OUTPUT_VARIABLE MONOSTEP_GIT_PORCELAIN OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET ) if(MONOSTEP_GIT_HASH) set(MONOSTEP_GIT_STRING "${MONOSTEP_GIT_HASH}") if(NOT MONOSTEP_GIT_PORCELAIN STREQUAL "") string(APPEND MONOSTEP_GIT_STRING "-dirty") endif() endif() endif() if(NOT DEFINED JUCE_DIR) set(JUCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../juce") endif() if(NOT EXISTS "${JUCE_DIR}/CMakeLists.txt") if(Git_FOUND) set(JUCE_CLONE_DIR "${CMAKE_CURRENT_BINARY_DIR}/juce") if(EXISTS "${JUCE_CLONE_DIR}/CMakeLists.txt") message(STATUS "Using JUCE from previous clone at ${JUCE_CLONE_DIR}") set(JUCE_DIR "${JUCE_CLONE_DIR}") elseif(EXISTS "${JUCE_CLONE_DIR}") message(FATAL_ERROR "${JUCE_CLONE_DIR} exists but is not a JUCE checkout. Remove it and re-run, or pass -DJUCE_DIR=.") else() message(STATUS "JUCE not found at ${JUCE_DIR}; cloning into ${JUCE_CLONE_DIR}...") execute_process( COMMAND ${GIT_EXECUTABLE} clone --depth 1 https://github.com/juce-framework/JUCE.git "${JUCE_CLONE_DIR}" RESULT_VARIABLE JUCE_CLONE_RESULT ) if(NOT JUCE_CLONE_RESULT EQUAL 0) message(FATAL_ERROR "Failed to clone JUCE. Pass -DJUCE_DIR= to point at an existing checkout.") endif() set(JUCE_DIR "${JUCE_CLONE_DIR}") endif() else() message(FATAL_ERROR "JUCE not found at ${JUCE_DIR} and Git is unavailable. Pass -DJUCE_DIR= or install Git.") endif() endif() add_subdirectory("${JUCE_DIR}" juce_build) juce_add_plugin(MonoStep VERSION 1.0.0 COMPANY_NAME "armin" BUNDLE_ID "com.armin.monostep" FORMATS VST3 PRODUCT_NAME "MonoStep" PLUGIN_MANUFACTURER_CODE Armn PLUGIN_CODE MStp DESCRIPTION "Monophonic 2-oscillator step-sequencer synth" EDITOR_NAME MonoStepAudioProcessorEditor IS_SYNTH TRUE NEEDS_MIDI_INPUT TRUE VST3_AUTO_MANIFEST TRUE ) juce_generate_juce_header(MonoStep) target_sources(MonoStep PRIVATE Source/PluginProcessor.cpp Source/PluginEditor.cpp Source/ui/SequencerMatrix.cpp ) target_include_directories(MonoStep PRIVATE Source) target_compile_definitions(MonoStep PRIVATE JUCE_WEB_BROWSER=0 JUCE_VST3_CAN_REPLACE_VST2=0 MONOSTEP_GIT_INFO="${MONOSTEP_GIT_STRING}" ) option(MONOSTEP_BUILD_TESTS "Build the headless host test" ON) if(MONOSTEP_BUILD_TESTS) juce_add_console_app(MonoStepTestHost PRODUCT_NAME MonoStepTestHost ) juce_generate_juce_header(MonoStepTestHost) target_link_libraries(MonoStepTestHost PRIVATE juce::juce_audio_processors juce::juce_audio_formats ) target_include_directories(MonoStepTestHost PRIVATE Source) target_sources(MonoStepTestHost PRIVATE Source/PluginProcessor.cpp tests/TestHost.cpp ) target_compile_definitions(MonoStepTestHost PRIVATE MONOSTEP_HEADLESS=1 JUCE_PLUGINHOST_VST3=1 ) endif()