# ==============================================================================
#
#  This file is part of the JUCE framework.
#  Copyright (c) Raw Material Software Limited
#
#  JUCE is an open source framework subject to commercial or open source
#  licensing.
#
#  By downloading, installing, or using the JUCE framework, or combining the
#  JUCE framework with any other source code, object code, content or any other
#  copyrightable work, you agree to the terms of the JUCE End User Licence
#  Agreement, and all incorporated terms including the JUCE Privacy Policy and
#  the JUCE Website Terms of Service, as applicable, which will bind you. If you
#  do not agree to the terms of these agreements, we will not license the JUCE
#  framework to you, and you must discontinue the installation or download
#  process and cease use of the JUCE framework.
#
#  JUCE End User Licence Agreement: https://juce.com/legal/juce-9-licence/
#  JUCE Privacy Policy: https://juce.com/juce-privacy-policy
#  JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
#
#  Or:
#
#  You may also use this code under the terms of the AGPLv3:
#  https://www.gnu.org/licenses/agpl-3.0.en.html
#
#  THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
#  WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
#  MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
#
# ==============================================================================

cmake_minimum_required(VERSION 3.22)

get_property(_juce_initial_global_languages GLOBAL PROPERTY ENABLED_LANGUAGES)

project(JUCE VERSION 9.0.1 LANGUAGES C CXX)

if(NOT (JUCE_IS_TOP_LEVEL OR "C" IN_LIST _juce_initial_global_languages))
    message(FATAL_ERROR "A C compiler is required to build targets that depend on JUCE. "
        "Add 'C' to your project's LANGUAGES.")
endif()

include(CMakeDependentOption)

set_property(GLOBAL PROPERTY USE_FOLDERS YES)

set(JUCE_MODULES_DIR "${JUCE_SOURCE_DIR}/modules" CACHE INTERNAL
    "The path to JUCE modules")

# This option will disable most of the JUCE helper functions and tools. This option exists to
# facilitate existing CMake builds which handle things like bundle creation, icons, plists, and
# binary data independently of JUCE. This option is not recommended - use at your own risk!

option(JUCE_MODULES_ONLY "Only configure the JUCE modules" OFF)

include(extras/Build/CMake/JUCEModuleSupport.cmake)

# This option controls whether dummy targets are added to the build, where these targets contain all
# of the source files for each JUCE module. If you're planning to use an IDE and want to be able to
# browse all of JUCE's source files, this may be useful. However, it will increase the size of
# generated IDE projects and might slow down configuration a bit. If you enable this, you should
# probably also add `set_property(GLOBAL PROPERTY USE_FOLDERS YES)` to your top level CMakeLists,
# otherwise the module sources will be added directly to the top level of the project, instead of in
# a nice 'Modules' subfolder.

cmake_dependent_option(JUCE_ENABLE_MODULE_SOURCE_GROUPS
    "Show all module sources in IDE projects" OFF
    "NOT JUCE_MODULES_ONLY" OFF)

add_subdirectory(modules)

if(JUCE_MODULES_ONLY)
    return()
endif()

include(extras/Build/CMake/JUCEUtils.cmake)

set_directory_properties(PROPERTIES
    JUCE_COMPANY_NAME       "JUCE"
    JUCE_COMPANY_WEBSITE    "https://juce.com"
    JUCE_COMPANY_EMAIL      "info@juce.com"
    JUCE_COMPANY_COPYRIGHT  "Copyright (c) - Raw Material Software Limited")

option(JUCE_COPY_PLUGIN_AFTER_BUILD
    "Whether or not plugins should be installed to the system after building" OFF)
set_property(GLOBAL PROPERTY JUCE_COPY_PLUGIN_AFTER_BUILD ${JUCE_COPY_PLUGIN_AFTER_BUILD})

set(CMAKE_CXX_EXTENSIONS FALSE)

juce_disable_default_flags()

add_subdirectory(extras/Build)

# If you want to build the JUCE examples with VST2/ARA support, you'll need to make the
# VST2/ARA headers visible to the juce_audio_processors module. You can either set the paths on
# the command line, (e.g. -DJUCE_GLOBAL_ARA_SDK_PATH=/path/to/sdk) if you're just building the JUCE
# examples, or you can call the `juce_set_*_sdk_path` functions in your own CMakeLists after
# importing JUCE.

if(JUCE_GLOBAL_AAX_SDK_PATH)
    juce_set_aax_sdk_path("${JUCE_GLOBAL_AAX_SDK_PATH}")
endif()

if(JUCE_GLOBAL_VST2_SDK_PATH)
    juce_set_vst2_sdk_path("${JUCE_GLOBAL_VST2_SDK_PATH}")
endif()

# The ARA_SDK path should point to the "Umbrella installer" ARA_SDK directory.
# The directory can be obtained by recursively cloning https://github.com/Celemony/ARA_SDK and
# checking out the tag releases/2.1.0.
if(JUCE_GLOBAL_ARA_SDK_PATH)
    juce_set_ara_sdk_path("${JUCE_GLOBAL_ARA_SDK_PATH}")
endif()

# We don't build anything other than the juceaide by default, because we want to keep configuration
# speedy and the number of targets low. If you want to add targets for the extra projects and
# example PIPs (there's a lot of them!), specify -DJUCE_BUILD_EXAMPLES=ON and/or
# -DJUCE_BUILD_EXTRAS=ON when initially generating your build tree.

option(JUCE_BUILD_EXTRAS "Add build targets for the Projucer and other tools" OFF)

if(JUCE_BUILD_EXTRAS)
    add_subdirectory(extras)
endif()

option(JUCE_BUILD_EXAMPLES "Add build targets for the DemoRunner and PIPs" OFF)

if(JUCE_BUILD_EXAMPLES)
    add_subdirectory(examples)
endif()

string(CONCAT webview2_option_message "Location that overrides the default directory where our "
                                      "FindWebView2 script is looking for the "
                                      "*Microsoft.Web.WebView2* directory")

option(JUCE_WEBVIEW2_PACKAGE_LOCATION ${webview2_option_message} "")

# ==================================================================================================
# Install configuration

include(CMakePackageConfigHelpers)
write_basic_package_version_file("${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake"
    VERSION ${JUCE_VERSION}
    COMPATIBILITY ExactVersion)

set(JUCE_INSTALL_DESTINATION "lib/cmake/JUCE-${JUCE_VERSION}" CACHE STRING
    "The location, relative to the install prefix, where the JUCE config file will be installed")

set(JUCE_MODULE_PATH "include/JUCE-${JUCE_VERSION}/modules")
set(UTILS_INSTALL_DIR "${JUCE_INSTALL_DESTINATION}")
set(JUCEAIDE_PATH "${JUCE_TOOL_INSTALL_DIR}/${JUCE_JUCEAIDE_NAME}")
configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in"
    "${JUCE_BINARY_DIR}/JUCEConfig.cmake"
    PATH_VARS UTILS_INSTALL_DIR JUCEAIDE_PATH JUCE_MODULE_PATH
    INSTALL_DESTINATION "${JUCE_INSTALL_DESTINATION}")

set(JUCE_MODULE_PATH "${JUCE_MODULES_DIR}")
set(UTILS_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/extras/Build/CMake")
get_target_property(JUCEAIDE_PATH juceaide IMPORTED_LOCATION)
configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in"
    "${JUCE_BINARY_DIR}/JUCEExportConfig.cmake"
    PATH_VARS UTILS_INSTALL_DIR JUCEAIDE_PATH JUCE_MODULE_PATH
    INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}"
    INSTALL_DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")

install(FILES "${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake"
              "${JUCE_BINARY_DIR}/JUCEConfig.cmake"
              "${JUCE_CMAKE_UTILS_DIR}/FindCppwinrt.cmake"
              "${JUCE_CMAKE_UTILS_DIR}/FindWebView2.cmake"
              "${JUCE_CMAKE_UTILS_DIR}/FindWindowsMIDIServices.cmake"
              "${JUCE_CMAKE_UTILS_DIR}/JUCECheckAtomic.cmake"
              "${JUCE_CMAKE_UTILS_DIR}/JUCEHelperTargets.cmake"
              "${JUCE_CMAKE_UTILS_DIR}/JUCEModuleSupport.cmake"
              "${JUCE_CMAKE_UTILS_DIR}/JUCEUtils.cmake"
              "${JUCE_CMAKE_UTILS_DIR}/JuceLV2Defines.h.in"
              "${JUCE_CMAKE_UTILS_DIR}/LaunchScreen.storyboard"
              "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessor.cpp.in"
              "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessorWithARA.cpp.in"
              "${JUCE_CMAKE_UTILS_DIR}/PIPComponent.cpp.in"
              "${JUCE_CMAKE_UTILS_DIR}/PIPConsole.cpp.in"
              "${JUCE_CMAKE_UTILS_DIR}/RecentFilesMenuTemplate.nib"
              "${JUCE_CMAKE_UTILS_DIR}/UnityPluginGUIScript.cs.in"
              "${JUCE_CMAKE_UTILS_DIR}/bundleplaceholder.mm"
              "${JUCE_CMAKE_UTILS_DIR}/checkBundleSigning.cmake"
              "${JUCE_CMAKE_UTILS_DIR}/copyDir.cmake"
              "${JUCE_CMAKE_UTILS_DIR}/juce_LinuxSubprocessHelper.cpp"
              "${JUCE_CMAKE_UTILS_DIR}/juce_runtime_arch_detection.cpp"
        DESTINATION "${JUCE_INSTALL_DESTINATION}")

install(DIRECTORY "${JUCE_CMAKE_UTILS_DIR}/juce_vst3_helper"
        DESTINATION "${JUCE_INSTALL_DESTINATION}")

if(("${CMAKE_SOURCE_DIR}" STREQUAL "${JUCE_SOURCE_DIR}") AND (NOT JUCE_BUILD_HELPER_TOOLS))
    _juce_add_lv2_manifest_helper_target()

    if(TARGET juce_lv2_helper)
        install(TARGETS juce_lv2_helper EXPORT LV2_HELPER DESTINATION "bin/JUCE-${JUCE_VERSION}")
        install(EXPORT LV2_HELPER NAMESPACE juce:: DESTINATION "${JUCE_INSTALL_DESTINATION}")
    endif()
endif()
