cmake_minimum_required(VERSION 3.22) project(Mindball VERSION 0.0.5 LANGUAGES C CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_OSX_DEPLOYMENT_TARGET 12.0 CACHE STRING "Minimum macOS deployment target") if(CMAKE_BUILD_TYPE STREQUAL "" AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE Release) endif() set(MINDBALL_FORMATS "AU VST3 Standalone" CACHE STRING "Plugin formats to build (space separated)") separate_arguments(_formats UNIX_COMMAND "${MINDBALL_FORMATS}") set(JUCE_ROOT "" CACHE PATH "Path to a local JUCE source tree (default: fetched from GitHub)") if(JUCE_ROOT) add_subdirectory(${JUCE_ROOT} juce) else() include(FetchContent) FetchContent_Declare(juce GIT_REPOSITORY https://github.com/juce-framework/JUCE.git GIT_TAG 8.0.9 GIT_SHALLOW TRUE) FetchContent_MakeAvailable(juce) endif() # A JUCE GUI plugin needs the core system headers to compile on Linux. Detect # them up front so a missing package produces a clear error instead of a # confusing compile failure. GTK and libcurl are never required. if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(_mindball_headers "X11/Xlib.h" "freetype2/freetype/freetype.h" "fontconfig/fontconfig.h" "alsa/asoundlib.h") set(_mindball_packages "libx11-dev" "libfreetype-dev" "libfontconfig-dev" "libasound2-dev") set(_mindball_missing "") foreach(_i RANGE 0 3) list(GET _mindball_headers ${_i} _header) list(GET _mindball_packages ${_i} _package) find_path(_mindball_hdr_${_i} NAMES "${_header}" QUIET) if(NOT _mindball_hdr_${_i}) string(APPEND _mindball_missing " ${_header} (package: ${_package})\n") endif() endforeach() if(_mindball_missing) message(FATAL_ERROR "Missing required system headers for the Linux build:\n${_mindball_missing}" "Install them with:\n" " sudo apt-get install pkg-config libx11-dev libfreetype-dev libfontconfig-dev libasound2-dev\n") endif() endif() juce_add_plugin(Mindball PRODUCT_NAME "Mindball" VENDOR_NAME "Mindball" VERSION "0.0.5" DESCRIPTION "Mindball - a minimalist delay plugin" FORMATS ${_formats} PLUGIN_MANUFACTURER_CODE Mind PLUGIN_CODE Mbll COPY_PLUGIN_AFTER_BUILD TRUE COMPANY_COPYRIGHT "2026 Mindball") target_sources(Mindball PRIVATE Source/PluginProcessor.cpp Source/PluginEditor.cpp) target_include_directories(Mindball PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/buildinfo) target_link_libraries(Mindball PRIVATE juce::juce_audio_processors juce::juce_audio_utils juce::juce_audio_devices juce::juce_gui_basics) # New VST3-only plugin: no VST2 has ever been released, so the parameter-ID # migration warning is irrelevant. target_compile_definitions(Mindball PRIVATE JUCE_IGNORE_VST3_MISMATCHED_PARAMETER_ID_WARNING) # juce_core enables libcurl by default on Linux; without NEEDS_CURL the JUCE # helper targets don't link -lcurl, so that would fail at link time with # undefined references to curl_easy_setopt. We use no network features, so # disable it. (GTK/webkit2gtk is never required because juce_gui_extra is not # linked.) target_compile_definitions(Mindball PRIVATE JUCE_USE_CURL=0) # ---- git / build info ----------------------------------------------------- find_package(Git QUIET) set(MINDBALL_GIT_HASH "n/a") set(MINDBALL_GIT_BRANCH "n/a") set(MINDBALL_GIT_DIRTY false) if(Git_FOUND) execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short=8 HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} RESULT_VARIABLE _git_hash_res OUTPUT_VARIABLE _git_hash ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) if(_git_hash_res EQUAL 0 AND _git_hash) set(MINDBALL_GIT_HASH "${_git_hash}") execute_process(COMMAND ${GIT_EXECUTABLE} branch --show-current WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} RESULT_VARIABLE _git_branch_res OUTPUT_VARIABLE _git_branch ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) if(_git_branch_res EQUAL 0 AND _git_branch) set(MINDBALL_GIT_BRANCH "${_git_branch}") endif() execute_process(COMMAND ${GIT_EXECUTABLE} status --porcelain WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} RESULT_VARIABLE _git_status_res OUTPUT_VARIABLE _git_status ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) string(LENGTH "${_git_status}" _status_len) if(_status_len GREATER 0) set(MINDBALL_GIT_DIRTY true) endif() endif() endif() string(TIMESTAMP MINDBALL_BUILD_TIME "%Y-%m-%d %H:%M:%S") configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Source/BuildInfo.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildinfo/BuildInfo.h @ONLY) juce_generate_juce_header(Mindball)