include(CMakeDependentOption) include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) include(CheckCXXSourceCompiles) include(GNUWarnings) cmake_policy(SET CMP0091 NEW) # C++14 is the minimum standard version required by Abseil LTS 20230125.1 and later, see # https://github.com/abseil/abseil-cpp/releases/tag/20230125.1 set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ standard to be used") set(CMAKE_C_STANDARD 99 CACHE STRING "C standard to be used") # Export the compile_commands.json file set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Only install what's explicitely said set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY true) set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN ON) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/library/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/library/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/library/bin) # Set C++ compatibility level if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC" AND CMAKE_CXX_STANDARD LESS 17) set(CMAKE_CXX_STANDARD 17) endif() # Set build profiling options if(SFIZZ_PROFILE_BUILD) check_c_compiler_flag("-ftime-trace" SFIZZ_HAVE_CFLAG_FTIME_TRACE) check_cxx_compiler_flag("-ftime-trace" SFIZZ_HAVE_CXXFLAG_FTIME_TRACE) if(SFIZZ_HAVE_CFLAG_FTIME_TRACE) add_compile_options("$<$:-ftime-trace>") endif() if(SFIZZ_HAVE_CXXFLAG_FTIME_TRACE) add_compile_options("$<$:-ftime-trace>") endif() endif() # Process sources as UTF-8 if(MSVC) add_compile_options("/utf-8") endif() # Define the math constants everywhere if(WIN32) add_compile_definitions(_USE_MATH_DEFINES) endif() # Set macOS compatibility level if(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9") endif() # If using C++17, check if aligned-new has runtime support on the platform; # on macOS, this depends on the deployment target. if(CMAKE_CXX_STANDARD LESS 17) # not necessary on older C++, it will call ordinary new and delete set(SFIZZ_IMPLEMENT_CXX17_ALIGNED_NEW_SUPPORT FALSE) else() check_cxx_source_compiles(" struct Test { alignas(1024) int z; }; int main() { new Test; return 0; } " SFIZZ_HAVE_CXX17_ALIGNED_NEW) # if support is absent, sfizz will provide a substitute implementation if(SFIZZ_HAVE_CXX17_ALIGNED_NEW) set(SFIZZ_IMPLEMENT_CXX17_ALIGNED_NEW_SUPPORT FALSE) else() # on macOS, this mandatory flag tells that allocation functions are user-provided check_cxx_compiler_flag("-faligned-allocation" SFIZZ_HAVE_CXXFLAG_FALIGNED_ALLOCATION) if(SFIZZ_HAVE_CXXFLAG_FALIGNED_ALLOCATION) add_compile_options("$<$:-faligned-allocation>") endif() set(SFIZZ_IMPLEMENT_CXX17_ALIGNED_NEW_SUPPORT TRUE) endif() endif() # Do not define macros `min` and `max` if(WIN32) add_compile_definitions(NOMINMAX) endif() # The variable CMAKE_SYSTEM_PROCESSOR is incorrect on Visual studio... # see https://gitlab.kitware.com/cmake/cmake/issues/15170 if(MSVC) set(PROJECT_SYSTEM_PROCESSOR "${MSVC_CXX_ARCHITECTURE_ID}" CACHE STRING "" FORCE) elseif(APPLE) set(PROJECT_SYSTEM_PROCESSOR "arm64;x86_64" CACHE STRING "" FORCE) set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "" FORCE) else() set(PROJECT_SYSTEM_PROCESSOR "${CMAKE_SYSTEM_PROCESSOR}" CACHE STRING "" FORCE) endif() # Add required flags for the builds if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") gw_warn(-Wall -Wextra -Wno-multichar -Werror=return-type -Wno-missing-template-arg-list-after-template-kw) if(PROJECT_SYSTEM_PROCESSOR MATCHES "(i.86|x86_64)") add_compile_options(-msse2) elseif(PROJECT_SYSTEM_PROCESSOR MATCHES "(arm.*)") #add_compile_options(-mfpu=neon) #if(NOT ANDROID) # add_compile_options(-mfloat-abi=hard) #endif() endif() elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") add_compile_options(/Zc:__cplusplus) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") endif() function(sfizz_enable_fast_math NAME) if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") target_compile_options("${NAME}" PRIVATE "-ffast-math") elseif(MSVC) target_compile_options("${NAME}" PRIVATE "/fp:fast") endif() endfunction() # If we build with Clang, optionally use libc++. Enabled by default on Apple OS. cmake_dependent_option(USE_LIBCPP "Use libc++ with clang" "${APPLE}" "CMAKE_CXX_COMPILER_ID MATCHES Clang" OFF) if(USE_LIBCPP) add_compile_options(-stdlib=libc++) add_link_options(-stdlib=libc++) # New command in CMake 3.13 add_link_options(-lc++abi) endif() include(GNUInstallDirs) if(PROJECT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) set(PROJECT_IS_MAIN TRUE) else() set(PROJECT_IS_MAIN FALSE) endif() # Don't show build information when building a different project function(show_build_info_if_needed) if(PROJECT_IS_MAIN) message(STATUS " Project name: ${PROJECT_NAME} C++ standard version: ${CMAKE_CXX_STANDARD} Build type: ${CMAKE_BUILD_TYPE} Build processor: ${PROJECT_SYSTEM_PROCESSOR} Build using LTO: ${ENABLE_LTO} Build as shared library: ${SFIZZ_SHARED} Build JACK stand-alone client: ${SFIZZ_JACK} Build render client: ${SFIZZ_RENDER} Build benchmarks: ${SFIZZ_BENCHMARKS} Build tests: ${SFIZZ_TESTS} Build demos: ${SFIZZ_DEMOS} Build devtools: ${SFIZZ_DEVTOOLS} Use sndfile: ${SFIZZ_USE_SNDFILE} Statically link sndfile: ${SFIZZ_SNDFILE_STATIC} Use vcpkg: ${SFIZZ_USE_VCPKG} Use clang libc++: ${USE_LIBCPP} Release asserts: ${SFIZZ_RELEASE_ASSERTS} Use system abseil-cpp: ${SFIZZ_USE_SYSTEM_ABSEIL} Use system catch: ${SFIZZ_USE_SYSTEM_CATCH} Use system cxxopts: ${SFIZZ_USE_SYSTEM_CXXOPTS} Use system ghc-filesystem: ${SFIZZ_USE_SYSTEM_GHC_FS} Use system kiss-fft: ${SFIZZ_USE_SYSTEM_KISS_FFT} Use system pugixml: ${SFIZZ_USE_SYSTEM_PUGIXML} Use system simde: ${SFIZZ_USE_SYSTEM_SIMDE}") if(CMAKE_PROJECT_NAME STREQUAL "sfizz") message(STATUS " Use system lv2: ${SFIZZ_USE_SYSTEM_LV2} Use system vst3sdk sources: ${SFIZZ_USE_SYSTEM_VST3SDK} Build AU plug-in: ${PLUGIN_AU} Build LV2 plug-in: ${PLUGIN_LV2} Build LV2 user interface: ${PLUGIN_LV2_UI} LV2 plugin-side CC automation ${PLUGIN_LV2_PSA} Build Pure Data plug-in: ${PLUGIN_PUREDATA} Build VST3 plug-in: ${PLUGIN_VST3} AU destination directory: ${AU_PLUGIN_INSTALL_DIR} LV2 destination directory: ${LV2_PLUGIN_INSTALL_DIR} Pd destination directory: ${PD_PLUGIN_INSTALL_DIR} VST3 destination directory: ${VST3_PLUGIN_INSTALL_DIR}") endif() message(STATUS " Install prefix: ${CMAKE_INSTALL_PREFIX} CXX Debug flags: ${CMAKE_CXX_FLAGS_DEBUG} CXX Release flags: ${CMAKE_CXX_FLAGS_RELEASE} CXX MinSize flags: ${CMAKE_CXX_FLAGS_MINSIZEREL} CXX RelWithDebInfo flags: ${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ") endif() endfunction()