481 lines
15 KiB
CMake
481 lines
15 KiB
CMake
# To get started on a new plugin, copy this entire folder (containing this file and C++ sources) to
|
|
# a convenient location, and then start making modifications.
|
|
|
|
# The first line of any CMake project should be a call to `cmake_minimum_required`, which checks
|
|
# that the installed CMake will be able to understand the following CMakeLists, and ensures that
|
|
# CMake's behaviour is compatible with the named version. This is a standard CMake command, so more
|
|
# information can be found in the CMake docs.
|
|
|
|
cmake_minimum_required(VERSION 3.15)
|
|
|
|
|
|
if (WIN32)
|
|
#set (CMAKE_GENERATOR_TOOLSET ClangCL)
|
|
#static linking in Windows
|
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|
endif()
|
|
|
|
# If we are compiling for Mac OS we want to target OS versions down to 10.9
|
|
option(UniversalBinary "Build universal binary for mac" ON)
|
|
|
|
if (APPLE)
|
|
set (CMAKE_OSX_DEPLOYMENT_TARGET "10.10" CACHE INTERNAL "")
|
|
if (UniversalBinary)
|
|
set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64" CACHE INTERNAL "")
|
|
#set(CMAKE_OSX_ARCHITECTURES arm64 x86_64)
|
|
endif()
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# The top-level CMakeLists.txt file for a project must contain a literal, direct call to the
|
|
# `project()` command. `project()` sets up some helpful variables that describe source/binary
|
|
# directories, and the current project version. This is a standard CMake command.
|
|
|
|
project(PaulXStretch VERSION 1.5.4)
|
|
|
|
set(BUILDVERSION 111)
|
|
|
|
|
|
# If you've installed JUCE somehow (via a package manager, or directly using the CMake install
|
|
# target), you'll need to tell this project that it depends on the installed copy of JUCE. If you've
|
|
# included JUCE directly in your source tree (perhaps as a submodule), you'll need to tell CMake to
|
|
# include that subdirectory as part of the build.
|
|
|
|
# find_package(JUCE CONFIG REQUIRED) # If you've installed JUCE to your system
|
|
# or
|
|
|
|
|
|
# By default we don't want Xcode schemes to be made for modules, etc
|
|
set(CMAKE_XCODE_GENERATE_SCHEME OFF)
|
|
|
|
# No ZERO_CHECK target (it helps bust cache for cmake)
|
|
set(CMAKE_SUPPRESS_REGENERATION true)
|
|
|
|
# prevent install all
|
|
#set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY true)
|
|
|
|
# Adds all the module sources so they appear correctly in the IDE
|
|
# Must be set before JUCE is added as a sub-dir (or any targets are made)
|
|
# https://github.com/juce-framework/JUCE/commit/6b1b4cf7f6b1008db44411f2c8887d71a3348889
|
|
set_property(GLOBAL PROPERTY USE_FOLDERS YES)
|
|
|
|
# This is a failed attempt to bury ALL_BUILD in Targets/
|
|
# This should be called before any target is made
|
|
# Bug in Xcode? https://gitlab.kitware.com/cmake/cmake/-/issues/21383
|
|
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "Targets")
|
|
|
|
# Create a /Modules directory in the IDE with the JUCE Module code
|
|
option(JUCE_ENABLE_MODULE_SOURCE_GROUPS "Show all module sources in IDE projects" ON)
|
|
|
|
|
|
# include JUCE
|
|
|
|
add_subdirectory(deps/juce EXCLUDE_FROM_ALL )
|
|
|
|
|
|
# juce_add_modules(deps/ff_meters)
|
|
|
|
|
|
|
|
set (FormatsToBuild VST3 Standalone)
|
|
|
|
# On Mac, an AU version will be built too
|
|
if (APPLE)
|
|
list (APPEND FormatsToBuild AU)
|
|
endif()
|
|
|
|
# If you are building a VST2 or AAX plugin, CMake needs to be told where to find these SDKs on your
|
|
# system. This setup should be done before calling `juce_add_plugin`.
|
|
|
|
#juce_set_vst2_sdk_path("../VST2_SDK")
|
|
#juce_set_aax_sdk_path("../AAX_SDK_2p3p2")
|
|
|
|
|
|
if (AAX_SDK_PATH)
|
|
juce_set_aax_sdk_path (${AAX_SDK_PATH})
|
|
|
|
if (APPLE OR (NOT ("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32")))
|
|
list (APPEND AaxFormatsToBuild AAX)
|
|
endif()
|
|
endif()
|
|
|
|
#if (VST2_SDK_PATH)
|
|
# juce_set_vst2_sdk_path (${VST2_SDK_PATH})
|
|
# list (APPEND FormatsToBuild VST)
|
|
#endif()
|
|
|
|
|
|
set (MacPList "<plist version=\"1.0\">
|
|
<dict>
|
|
<key>CFBundleVersion</key>
|
|
<string>${BUILDVERSION}</string>
|
|
<key>CFBundleURLTypes</key>
|
|
<array>
|
|
<dict>
|
|
<key>CFBundleURLName</key>
|
|
<string>com.sonosaurus.paulxstretch</string>
|
|
<key>CFBundleURLSchemes</key>
|
|
<array>
|
|
<string>paulxstretch</string>
|
|
</array>
|
|
</dict>
|
|
</array>
|
|
</dict>
|
|
</plist>")
|
|
|
|
|
|
# `juce_add_plugin` adds a static library target with the name passed as the first argument
|
|
# (AudioPluginExample here). This target is a normal CMake target, but has a lot of extra properties set
|
|
# up by default. As well as this shared code static library, this function adds targets for each of
|
|
# the formats specified by the FORMATS arguments. This function accepts many optional arguments.
|
|
# Check the readme at `docs/CMake API.md` in the JUCE repo for the full list.
|
|
|
|
function(sono_add_custom_plugin_target target_name product_name formats is_instrument no_fftw plugincode)
|
|
|
|
if (is_instrument)
|
|
set (vst3cats Instrument Network)
|
|
set (vst2cat "kPlugCategSynth")
|
|
else()
|
|
set (vst3cats Fx Network)
|
|
set (vst2cat "kPlugCategEffect")
|
|
endif()
|
|
|
|
juce_add_plugin("${target_name}"
|
|
IS_SYNTH "${is_instrument}"
|
|
NEEDS_MIDI_INPUT TRUE
|
|
NEEDS_MIDI_OUTPUT TRUE
|
|
EDITOR_WANTS_KEYBOARD_FOCUS TRUE
|
|
COMPANY_NAME "Sonosaurus"
|
|
BUNDLE_ID "com.sonosaurus.paulxstretch"
|
|
MICROPHONE_PERMISSION_ENABLED TRUE
|
|
|
|
ICON_BIG "images/paulxstretch_icon_1024_rounded.png"
|
|
ICON_SMALL "images/paulxstretch_icon_256_rounded.png"
|
|
NEEDS_WEB_BROWSER FALSE
|
|
VST2_CATEGORY "${vst2cat}"
|
|
VST3_CATEGORIES "${vst3cats}"
|
|
AAX_CATEGORY "AAX_EPlugInCategory_Effect"
|
|
|
|
|
|
# mac settings
|
|
HARDENED_RUNTIME_ENABLED TRUE
|
|
HARDENED_RUNTIME_OPTIONS "com.apple.security.device.audio-input"
|
|
PLIST_TO_MERGE "${MacPList}"
|
|
AU_MAIN_TYPE "kAudioUnitType_MusicEffect"
|
|
|
|
|
|
# other settings...
|
|
PLUGIN_MANUFACTURER_CODE Sono
|
|
PLUGIN_CODE ${plugincode}
|
|
FORMATS ${formats}
|
|
DESCRIPTION "PaulXStretch - Extreme Timestretching"
|
|
PRODUCT_NAME "${product_name}")
|
|
|
|
juce_generate_juce_header("${target_name}")
|
|
|
|
|
|
set (HEADER_INCLUDES
|
|
# Source/PS_Source
|
|
# Source/WDL
|
|
)
|
|
|
|
set (LIB_PATHS "")
|
|
|
|
#set (PLAT_COMPILE_DEFS
|
|
# $<$<CONFIG:Debug>:LOGLEVEL=2>
|
|
# USE_CODEC_OPUS=1
|
|
# AOO_TIMEFILTER_CHECK=0
|
|
# AOO_STATIC)
|
|
|
|
set(PlatSourceFiles
|
|
Source/CrossPlatformUtils.h
|
|
)
|
|
|
|
|
|
set (FFTW_DEPLIBS "")
|
|
|
|
|
|
# platform specific stuff
|
|
if (APPLE)
|
|
list (APPEND HEADER_INCLUDES deps/mac/include)
|
|
list (APPEND LIB_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/deps/mac/lib)
|
|
list (APPEND PlatSourceFiles Source/CrossPlatformUtilsMac.mm)
|
|
|
|
if (no_fftw)
|
|
# use vDSP
|
|
list (APPEND PLAT_COMPILE_DEFS
|
|
PS_USE_VDSP_FFT=1
|
|
)
|
|
else()
|
|
list (APPEND FFTW_DEPLIBS fftw3f)
|
|
endif()
|
|
elseif (WIN32)
|
|
list (APPEND HEADER_INCLUDES deps/windows ../asiosdk/common)
|
|
list (APPEND PlatSourceFiles Source/CrossPlatformUtilsWindows.cpp)
|
|
|
|
message (STATUS "Win generator platform is: ${CMAKE_VS_PLATFORM_NAME}" )
|
|
if ("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32")
|
|
list (APPEND LIB_PATHS
|
|
$<$<CONFIG:Debug>:${CMAKE_CURRENT_SOURCE_DIR}/deps/windows/Debug32>
|
|
$<$<CONFIG:Release>:${CMAKE_CURRENT_SOURCE_DIR}/deps/windows/Release32>
|
|
)
|
|
else()
|
|
list (APPEND LIB_PATHS
|
|
$<$<CONFIG:Debug>:${CMAKE_CURRENT_SOURCE_DIR}/deps/windows/Debug>
|
|
$<$<CONFIG:Release>:${CMAKE_CURRENT_SOURCE_DIR}/deps/windows/Release>
|
|
)
|
|
endif()
|
|
|
|
list (APPEND PLAT_COMPILE_DEFS
|
|
JUCE_MODAL_LOOPS_PERMITTED
|
|
_USE_MATH_DEFINES
|
|
WINVER=0x0601
|
|
_WIN32_WINNT=0x0601
|
|
NOMINMAX)
|
|
|
|
if (no_fftw)
|
|
# use pffft
|
|
list (APPEND PLAT_COMPILE_DEFS
|
|
PS_USE_PFFFT=1
|
|
)
|
|
else()
|
|
list (APPEND FFTW_DEPLIBS
|
|
fftw3f
|
|
mingwex
|
|
gcc
|
|
mingw32
|
|
msvcrt
|
|
)
|
|
endif()
|
|
|
|
else()
|
|
# Linux
|
|
list (APPEND PlatSourceFiles Source/CrossPlatformUtilsLinux.cpp)
|
|
list ( APPEND PLAT_COMPILE_DEFS
|
|
JUCE_USE_MP3AUDIOFORMAT=1 )
|
|
|
|
if (no_fftw)
|
|
# use pffft
|
|
list (APPEND PLAT_COMPILE_DEFS
|
|
PS_USE_PFFFT=1
|
|
)
|
|
else()
|
|
list (APPEND FFTW_DEPLIBS fftw3f)
|
|
endif()
|
|
endif()
|
|
|
|
|
|
|
|
set(SourceFiles
|
|
${PlatSourceFiles}
|
|
Source/CustomLookAndFeel.cpp
|
|
Source/CustomLookAndFeel.h
|
|
Source/CustomStandaloneFilterApp.cpp
|
|
Source/CustomStandaloneFilterWindow.h
|
|
Source/PluginEditor.cpp
|
|
Source/PluginEditor.h
|
|
Source/PluginProcessor.cpp
|
|
Source/PluginProcessor.h
|
|
Source/RenderSettingsComponent.cpp
|
|
Source/RenderSettingsComponent.h
|
|
Source/envelope_component.cpp
|
|
Source/envelope_component.h
|
|
Source/jcdp_envelope.h
|
|
Source/ps3_BufferingAudioSource.cpp
|
|
Source/ps3_BufferingAudioSource.h
|
|
#Source/PS_Source/fftw3.h
|
|
Source/PS_Source/PaulStretchControl.cpp
|
|
Source/PS_Source/Stretch.h
|
|
Source/PS_Source/version.h
|
|
Source/PS_Source/Player.cpp
|
|
Source/PS_Source/BinauralBeats.h
|
|
Source/PS_Source/StretchSource.h
|
|
Source/PS_Source/ProcessedStretch.cpp
|
|
Source/PS_Source/Input
|
|
Source/PS_Source/Input/AInputS.h
|
|
Source/PS_Source/Input/InputS.h
|
|
Source/PS_Source/BinauralBeats.cpp
|
|
Source/PS_Source/ProcessedStretch.h
|
|
Source/PS_Source/StretchSource.cpp
|
|
Source/PS_Source/Player.h
|
|
Source/PS_Source/globals.h
|
|
Source/PS_Source/Stretch.cpp
|
|
Source/PS_Source/FreeEdit.h
|
|
Source/PS_Source/FreeEdit.cpp
|
|
Source/PS_Source/PaulStretchControl.h
|
|
Source/PS_Source/Input/AInputS.h
|
|
Source/PS_Source/Input/InputS.h
|
|
Source/WDL/resample.h
|
|
Source/WDL/resample.cpp
|
|
Source/WDL/wdltypes.h
|
|
Source/WDL/denormal.h
|
|
Source/WDL/heapbuf.h
|
|
Source/pffft/pffft.h
|
|
Source/pffft/pffft.c
|
|
)
|
|
|
|
target_sources("${target_name}" PRIVATE
|
|
${SourceFiles}
|
|
)
|
|
|
|
# No, we don't want our source buried in extra nested folders
|
|
set_target_properties("${target_name}" PROPERTIES FOLDER "")
|
|
|
|
# The source tree should uhhh, still look like the source tree, yo
|
|
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/Source PREFIX "" FILES ${SourceFiles})
|
|
|
|
# Move the INTERFACE auto-created JUCE library stuff into its own folder
|
|
source_group("JUCE Library Code" REGULAR_EXPRESSION "juce_")
|
|
|
|
|
|
#target_include_directories("${target_name}"
|
|
# INTERFACE
|
|
# $<TARGET_PROPERTY:"${target_name}",INCLUDE_DIRECTORIES>)
|
|
|
|
|
|
|
|
target_include_directories("${target_name}"
|
|
PUBLIC
|
|
${HEADER_INCLUDES}
|
|
)
|
|
|
|
|
|
# Require at least C++17 to build `my_target`
|
|
target_compile_features("${target_name}" PRIVATE cxx_std_17)
|
|
|
|
|
|
# This cleans up the folder organization, especially on Xcode.
|
|
# It tucks the Plugin varieties into a "Targets" folder and generate an Xcode Scheme manually
|
|
# Xcode scheme generation is turned off globally to limit noise from other targets
|
|
# The non-hacky way of doing this is via the global PREDEFINED_TARGETS_FOLDER propety
|
|
# However that doesn't seem to be working in Xcode
|
|
# Not all plugin types (au, vst) available on each build type (win, macos, linux)
|
|
foreach(target ${formats} "All")
|
|
if(TARGET ${target_name}_${target})
|
|
set_target_properties(${target_name}_${target} PROPERTIES
|
|
# Tuck the actual plugin targets into a folder where they won't bother us
|
|
FOLDER "Targets"
|
|
|
|
# MacOS only: Sets the default executable that Xcode will open on build
|
|
# For this exact path to to work, manually build the AudioPluginHost.xcodeproj in the JUCE subdir
|
|
# XCODE_SCHEME_EXECUTABLE "${CMAKE_CURRENT_SOURCE_DIR}/deps/juce/extras/AudioPluginHost/Builds/MacOSX/build/Debug/AudioPluginHost.app"
|
|
|
|
# Let us build the target in Xcode
|
|
XCODE_GENERATE_SCHEME ON)
|
|
endif()
|
|
endforeach()
|
|
|
|
|
|
target_compile_definitions("${target_name}"
|
|
PUBLIC
|
|
JUCE_WEB_BROWSER=0
|
|
JUCE_USE_CURL=0
|
|
JUCE_VST3_CAN_REPLACE_VST2=0
|
|
JUCE_DISPLAY_SPLASH_SCREEN=0
|
|
JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1
|
|
JUCE_USE_WINDOWS_MEDIA_FORMAT=1
|
|
JUCE_LOAD_CURL_SYMBOLS_LAZILY=1
|
|
JUCE_ASIO=1
|
|
JUCE_WASAPI=1
|
|
JUCE_DIRECTSOUND=0
|
|
JUCE_JACK=1
|
|
JUCE_ALSA=1
|
|
JUCE_USE_ANDROID_OBOE=1
|
|
JUCE_USE_OBOE_STABILIZED_CALLBACK=1
|
|
JUCE_LOAD_CURL_SYMBOLS_LAZILY=1
|
|
FF_AUDIO_ALLOW_ALLOCATIONS_IN_MEASURE_BLOCK=0
|
|
PAULXSTRETCH_BUILD_VERSION="${VERSION}"
|
|
${PLAT_COMPILE_DEFS} )
|
|
|
|
juce_add_binary_data("${target_name}_PSData" SOURCES
|
|
images/freeze.svg
|
|
images/loop_icon.svg
|
|
images/passthru.svg
|
|
images/passthru_enabled.svg
|
|
images/pause_icon.svg
|
|
images/play_icon.svg
|
|
images/power.svg
|
|
images/power_sel.svg
|
|
images/record.svg
|
|
images/record_active.svg
|
|
images/skipback_icon.svg
|
|
)
|
|
|
|
set_target_properties(${target_name}_PSData PROPERTIES FOLDER "Targets")
|
|
|
|
|
|
|
|
if (UNIX AND NOT APPLE)
|
|
target_compile_options("${target_name}_PSData"
|
|
PRIVATE
|
|
-fPIC
|
|
)
|
|
|
|
find_library(FFTWF_LIB fftw3f)
|
|
if (NOT FFTWF_LIB)
|
|
message(FATAL_ERROR "fftw3f library not found, please install libfftw3f develop package")
|
|
endif()
|
|
|
|
if (JUCE_LINUX_TARGET_ARCHITECTURE MATCHES "arm" )
|
|
message(STATUS "ARM platform, adding -march=native")
|
|
target_compile_options(${target_name} PUBLIC
|
|
-march=native
|
|
)
|
|
endif()
|
|
|
|
if (TARGET ${target_name}_Standalone)
|
|
# make linux executable all lower case
|
|
string(TOLOWER ${target_name} tmptargname)
|
|
|
|
set_target_properties("${target_name}_Standalone"
|
|
PROPERTIES
|
|
OUTPUT_NAME ${tmptargname}
|
|
)
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
|
target_link_directories("${target_name}" INTERFACE
|
|
${LIB_PATHS}
|
|
)
|
|
|
|
target_link_libraries("${target_name}"
|
|
PRIVATE
|
|
juce::juce_audio_utils
|
|
juce::juce_dsp
|
|
juce::juce_audio_plugin_client
|
|
juce::juce_cryptography
|
|
|
|
${target_name}_PSData
|
|
|
|
${FFTW_DEPLIBS}
|
|
|
|
PUBLIC
|
|
juce::juce_recommended_config_flags
|
|
juce::juce_recommended_lto_flags
|
|
# juce::juce_recommended_warning_flags
|
|
)
|
|
|
|
endfunction()
|
|
|
|
# most of the targets
|
|
sono_add_custom_plugin_target(PaulXStretch PaulXStretch "${FormatsToBuild}" FALSE FALSE "Pxst")
|
|
|
|
if (AaxFormatsToBuild)
|
|
# AAX builds without fftw
|
|
sono_add_custom_plugin_target(PaulXStretchAAX PaulXStretch "${AaxFormatsToBuild}" FALSE TRUE "Pxst")
|
|
endif()
|
|
|
|
# Mobile targets
|
|
#sono_add_custom_plugin_target(PaulXStretch "AUv3 Standalone" FALSE "NBus")
|
|
|
|
# add VSTi target
|
|
# sono_add_custom_plugin_target(PaulXStretchInst "PaulXStretchInstrument" "VST3" TRUE "IBus")
|
|
|