cmake_minimum_required(VERSION 3.15) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) project(GelykEQ VERSION 1.0.0 LANGUAGES C CXX) if(NOT DEFINED JUCE_ROOT) include(FetchContent) set(FETCHCONTENT_QUIET OFF) FetchContent_Declare( JUCE GIT_REPOSITORY https://github.com/juce-framework/JUCE.git GIT_TAG 8.0.7 ) FetchContent_MakeAvailable(JUCE) else() add_subdirectory(${JUCE_ROOT} JUCE) endif() juce_add_plugin(GelykEQ VENDOR_NAME "Gelyk Audio" VENDOR_WEBSITE "https://gelyk.example" VENDOR_EMAIL "dev@gelyk.example" VENDOR_VERSION_CODE 1 PLUGIN_MANUFACTURER_CODE Gely PLUGIN_CODE GkEQ FORMATS AU VST3 PRODUCT_NAME "Gelyk EQ" IS_SYNTH FALSE IS_MIDI_EFFECT FALSE NEEDS_MIDI_INPUT FALSE NEEDS_MIDI_OUTPUT FALSE EDITOR_WANTS_KEYBOARD_FOCUS TRUE COPY_PLUGIN_AFTER_BUILD TRUE INSTALL_AU TRUE INSTALL_VST3 TRUE BUNDLE_ID com.gelyk.eq JucePlugin_Name "Gelyk EQ" JucePlugin_Desc "A minimalist cyber/neon multiband equalizer" # Never link libcurl or WebKitGTK. Gelyk does no networking and has no # embedded browser, so both optional Linux dependency groups stay off. # (juce_add_plugin leaves these unset = off, this is just explicit.) NEEDS_CURL FALSE NEEDS_WEB_BROWSER FALSE ) juce_generate_juce_header(GelykEQ) # --- Generate Git build info header ------------------------------------- find_package(Git QUIET) set(GELYK_GIT_BRANCH "unknown") set(GELYK_GIT_SHA "unknown") set(GELYK_GIT_DESCRIBE "no-git") set(GELYK_GIT_DIRTY "") if(Git_FOUND) execute_process( COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE GELYK_GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) execute_process( COMMAND ${GIT_EXECUTABLE} describe --always --tags --dirty WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE GELYK_GIT_DESCRIBE OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) execute_process( COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE GELYK_GIT_SHA OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) execute_process( COMMAND ${GIT_EXECUTABLE} status --porcelain WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE GELYK_GIT_DIRTY ERROR_QUIET) if(NOT GELYK_GIT_DIRTY STREQUAL "") set(GELYK_GIT_DIRTY "dirty") else() set(GELYK_GIT_DIRTY "") endif() endif() string(TIMESTAMP GELYK_BUILD_DATE "%Y-%m-%d %H:%M") configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/Source/GitInfo.h.in ${CMAKE_CURRENT_BINARY_DIR}/Source/GitInfo.h @ONLY ) target_sources(GelykEQ PRIVATE Source/PluginProcessor.cpp Source/PluginEditor.cpp Source/EqualizerDSP.cpp ) target_include_directories(GelykEQ PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/Source ) target_link_libraries(GelykEQ PRIVATE juce::juce_dsp) target_compile_definitions(GelykEQ PRIVATE JUCE_MODULE_AVAILABLE_juce_dsp=1) # Gelyk never uses the embedded web browser, so keep JUCE_WEB_BROWSER off. # Otherwise juce_gui_extra's WebBrowserComponent pulls in WebKitGTK + GTK dev # headers (webkit2gtk, gtk, jsc, libsoup), which would break headless builds # like Arch/Artix where those aren't installed. # # JUCE_USE_CURL is the matching kill switch for juce_core: with it left at its # Linux default of 1, juce_core #includes and compiles # juce_Network_curl.cpp, so libcurl *development headers* become a hard build # requirement even though nothing links libcurl (NEEDS_CURL is FALSE above). # Gelyk never uses URL/WebInputStream, so switching it off costs nothing. # # Native file dialogs are not a problem either: JUCE 8's Linux FileChooser # shells out to zenity/kdialog via ChildProcess instead of linking GTK, and # Gelyk never opens one. target_compile_definitions(GelykEQ PRIVATE JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0 ) # --- Linux / BSD only --------------------------------------------------- # The remaining Linux requirements are genuinely needed (X11 windowing, ALSA # and FreeType/fontconfig for juce_graphics text), but they arrive as several # separate -dev packages on Arch/Artix. Fail early with a useful hint instead # of JUCE's raw pkg-config error. Nothing below pulls in GTK/WebKitGTK/curl. if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME MATCHES ".*BSD") find_package(PkgConfig REQUIRED) foreach(gelyk_dep alsa freetype2 fontconfig) pkg_check_modules(GELYK_HAS_${gelyk_dep} QUIET ${gelyk_dep}) if(NOT GELYK_HAS_${gelyk_dep}_FOUND) message(FATAL_ERROR "Missing required Linux development package: '${gelyk_dep}'.\n" " Arch/Artix: alsa-lib freetype2 fontconfig libx11\n" " Debian/Ubuntu: libasound2-dev libfreetype6-dev libfontconfig1-dev libx11-dev\n" " These are JUCE's own requirements (X11 windowing, ALSA, font rendering),\n" " not Gelyk's. No GTK, WebKitGTK, libcurl or file-selector package is needed.") endif() endforeach() # X11's multi-monitor/DPI extensions are dlsym()ed at runtime by JUCE, so # their headers are optional. Probe instead of hard-failing on distros that # ship just libX11 + libXext (libXrandr/Xinerama/Xcursor are separate # packages there). Only libX11's own headers are truly required. include(CheckIncludeFileCXX) set(gelyk_x11_optional "JUCE_USE_XRANDR|X11/extensions/Xrandr.h" "JUCE_USE_XINERAMA|X11/extensions/Xinerama.h" "JUCE_USE_XSHM|X11/extensions/XShm.h" "JUCE_USE_XCURSOR|X11/Xcursor/Xcursor.h" ) set(gelyk_x11_defines) foreach(gelyk_opt IN LISTS gelyk_x11_optional) string(REPLACE "|" ";" gelyk_parts "${gelyk_opt}") list(GET gelyk_parts 0 gelyk_define) list(GET gelyk_parts 1 gelyk_header) check_include_file_cxx("${gelyk_header}" GELYK_HAVE_${gelyk_define}) # A failed check leaves the variable empty rather than 0, which would # end up as -DJUCE_USE_XCURSOR="" and break the preprocessor. if(NOT GELYK_HAVE_${gelyk_define}) set(GELYK_HAVE_${gelyk_define} 0) endif() list(APPEND gelyk_x11_defines ${gelyk_define}=${GELYK_HAVE_${gelyk_define}}) endforeach() target_compile_definitions(GelykEQ PRIVATE ${gelyk_x11_defines}) endif() target_compile_options(GelykEQ PRIVATE $<$:-Wall -Wextra> ) option(GELYK_BUILD_STANDALONE "Build a standalone audio app target too" OFF) if(GELYK_BUILD_STANDALONE) target_sources(GelykEQ PRIVATE Source/Standalone.cpp) add_executable(GelykEQStandalone ${CMAKE_CURRENT_BINARY_DIR}/JuceLibraryCode/Standalone.cpp) target_link_libraries(GelykEQStandalone PRIVATE GelykEQ_impl juce_recommended_config_flags) endif() set_target_properties(GelykEQ PROPERTIES OUTPUT_NAME GelykEQ )