cmake_minimum_required(VERSION 3.24)
project(DengueVoz VERSION 0.1.5 LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
option(DENGUE_COVERAGE "Instrument project production sources with LLVM coverage" OFF)
include(FetchContent)
FetchContent_Declare(JUCE GIT_REPOSITORY https://github.com/juce-framework/JUCE.git GIT_TAG 3fb5cbc0340758596dac39f7c8de47d562b4896e)
FetchContent_Declare(signalsmith-linear GIT_REPOSITORY https://github.com/Signalsmith-Audio/linear.git GIT_TAG 7bb1c8f36794d6980080ce817c91f8da8fe56a66)
FetchContent_Declare(signalsmith-stretch GIT_REPOSITORY https://github.com/Signalsmith-Audio/signalsmith-stretch.git GIT_TAG 88061fd4eda56a2353c5d65c74aa3f4ccf76f9da)
FetchContent_MakeAvailable(JUCE signalsmith-linear signalsmith-stretch)
find_program(DENGUE_NODE node REQUIRED)
add_custom_command(OUTPUT "${CMAKE_BINARY_DIR}/generated/LocaleData.h"
 COMMAND "${DENGUE_NODE}" "${CMAKE_SOURCE_DIR}/scripts/generate-ui.mjs" "${CMAKE_BINARY_DIR}/generated"
 DEPENDS scripts/generate-ui.mjs assets/ui-copy.json assets/language-options.json assets/translation-notices.json assets/studio-credit.json)
add_custom_target(DengueLocales DEPENDS "${CMAKE_BINARY_DIR}/generated/LocaleData.h")
juce_add_binary_data(DengueArt HEADER_NAME DengueArt.h NAMESPACE DengueArt SOURCES assets/brand.png assets/icon.png assets/approved.png assets/studio.png)
add_library(DengueEngine STATIC src/Engine.cpp src/KeyAnalyzer.cpp)
target_include_directories(DengueEngine PUBLIC src)
target_link_libraries(DengueEngine PUBLIC signalsmith-stretch)
juce_add_plugin(DengueVoz
 COMPANY_NAME "Smegmo Company" COMPANY_WEBSITE "https://licenciadodengue.com"
 BUNDLE_ID "com.licenciadodengue.voz" PLUGIN_MANUFACTURER_CODE Smeg PLUGIN_CODE Dngv
 PRODUCT_NAME "Dengue Voz" FORMATS VST3 IS_SYNTH FALSE NEEDS_MIDI_INPUT FALSE
 NEEDS_MIDI_OUTPUT FALSE IS_MIDI_EFFECT FALSE EDITOR_WANTS_KEYBOARD_FOCUS FALSE
 COPY_PLUGIN_AFTER_BUILD FALSE VST3_CATEGORIES Fx PitchShift
 ICON_BIG assets/icon.png ICON_SMALL assets/icon.png)
target_sources(DengueVoz PRIVATE src/Processor.cpp src/Editor.cpp)
add_dependencies(DengueVoz DengueLocales)
target_include_directories(DengueVoz PRIVATE "${CMAKE_BINARY_DIR}/generated")
target_include_directories(DengueVoz PUBLIC src)
target_compile_definitions(DengueVoz PUBLIC JUCE_WEB_BROWSER=0 JUCE_USE_CURL=0 JUCE_VST3_CAN_REPLACE_VST2=0 JUCE_DISPLAY_SPLASH_SCREEN=0 JUCE_REPORT_APP_USAGE=0)
target_link_libraries(DengueVoz PRIVATE DengueEngine DengueArt juce::juce_audio_utils PUBLIC juce::juce_recommended_config_flags)
if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
 target_compile_options(DengueVoz PUBLIC "$<$<COMPILE_LANGUAGE:CXX>:/FIcctype>")
endif()
juce_add_gui_app(DenguePreview PRODUCT_NAME "Dengue Voz" COMPANY_NAME "Smegmo Company" BUNDLE_ID "com.licenciadodengue.voz.preview" ICON_BIG assets/icon.png ICON_SMALL assets/icon.png)
target_sources(DenguePreview PRIVATE src/Preview.cpp)
target_link_libraries(DenguePreview PRIVATE DengueVoz DengueArt)
target_include_directories(DenguePreview PRIVATE "${juce_SOURCE_DIR}/modules")
add_executable(dengue_tests tests/EngineTests.cpp tests/KeyAnalyzerTests.cpp)
target_link_libraries(dengue_tests PRIVATE DengueEngine)
juce_add_console_app(dengue_host_tests PRODUCT_NAME "Dengue native validation")
target_sources(dengue_host_tests PRIVATE tests/HostTests.cpp)
target_link_libraries(dengue_host_tests PRIVATE DengueVoz DengueArt)
target_include_directories(dengue_host_tests PRIVATE "${juce_SOURCE_DIR}/modules")
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
 # JUCE 9.0.4's resource command depends on the icon, but omits Info.txt.
 # Track version information so incremental builds refresh Windows properties.
 foreach(target DengueVoz DenguePreview dengue_host_tests)
  get_target_property(resource_dir ${target} JUCE_GENERATED_SOURCES_DIRECTORY)
  get_target_property(resource_info ${target} JUCE_INFO_FILE)
  add_custom_command(OUTPUT "${resource_dir}/${target}_resources.rc" APPEND DEPENDS "${resource_info}")
 endforeach()
endif()
enable_testing()
add_test(NAME audio_engine COMMAND dengue_tests)
add_test(NAME native_processor_and_gui COMMAND dengue_host_tests)
if(MINGW)
 foreach(target DengueVoz DenguePreview)
  target_link_libraries(${target} PRIVATE dwmapi)
 endforeach()
endif()
foreach(target DengueEngine DengueVoz DengueArt DengueVoz_VST3 DenguePreview dengue_tests dengue_host_tests)
 if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC" AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  target_compile_options(${target} PRIVATE "/clang:-ffile-prefix-map=${CMAKE_SOURCE_DIR}=." "/clang:-ffile-prefix-map=${CMAKE_BINARY_DIR}=build")
 elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
  target_compile_options(${target} PRIVATE "-ffile-prefix-map=${CMAKE_SOURCE_DIR}=." "-ffile-prefix-map=${CMAKE_BINARY_DIR}=build")
 endif()
endforeach()
if(DENGUE_COVERAGE)
 # Compile the LLVM runtime for the same MSVC CRT/ABI as the plugin. The mingw
 # runtime uses different stack probes and imported CRT symbols.
 file(GLOB DENGUE_PROFILE_SOURCES CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/work/deps/llvm-profile/*.c" "${CMAKE_SOURCE_DIR}/work/deps/llvm-profile/*.cpp")
 add_library(DengueProfileRuntime STATIC ${DENGUE_PROFILE_SOURCES})
 target_include_directories(DengueProfileRuntime PRIVATE "${CMAKE_SOURCE_DIR}/work/deps/llvm-profile")
 target_compile_definitions(DengueProfileRuntime PRIVATE COMPILER_RT_HAS_ATOMICS=1 _CRT_SECURE_NO_WARNINGS)
 set_source_files_properties(src/KeyAnalyzer.cpp src/Engine.cpp src/Processor.cpp src/Editor.cpp src/Preview.cpp PROPERTIES COMPILE_OPTIONS "/clang:-fprofile-instr-generate;/clang:-fcoverage-mapping")
 foreach(target DengueEngine DengueVoz DenguePreview dengue_tests dengue_host_tests)
  target_link_libraries(${target} PUBLIC DengueProfileRuntime)
  target_link_options(${target} PUBLIC /INCLUDE:__llvm_profile_runtime /NODEFAULTLIB:clang_rt.profile.lib)
 endforeach()
endif()

if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
 target_link_options(DengueVoz_VST3 PRIVATE "/MAP:${CMAKE_BINARY_DIR}/DengueVoz.map" /Brepro)
 target_link_options(DenguePreview PRIVATE /Brepro)
endif()
