arduino_midi_player/Midi/music-box-pc-master/rtaudio/CMakeLists.txt
2025-03-24 14:30:56 +08:00

372 lines
11 KiB
CMake

# Set minimum CMake required version for this project.
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
# Define a C++ project.
project(RtAudio LANGUAGES CXX)
# standards version
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Check for Jack (any OS)
find_library(JACK_LIB jack)
find_package(PkgConfig)
pkg_check_modules(jack jack)
if(JACK_LIB OR jack_FOUND)
set(HAVE_JACK TRUE)
endif()
# Check for Pulse (any OS)
pkg_check_modules(pulse libpulse-simple)
# Check for known non-Linux unix-likes
if (CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*")
message(STATUS "NetBSD detected, using OSS")
set(xBSD ON)
elseif(UNIX AND NOT APPLE)
set(LINUX ON)
endif()
# Necessary for Windows
if(MINGW)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()
# Standard CMake options
option(BUILD_SHARED_LIBS "Build as shared library" ON)
if (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release;RelWithDebInfo;MinSizeRel")
endif()
if(WIN32)
set(CMAKE_DEBUG_POSTFIX d CACHE STRING "Postfix for debug version of library")
endif()
# Build Options
option(RTAUDIO_BUILD_PYTHON "Build PyRtAudio python bindings" OFF)
set(RTAUDIO_TARGETNAME_UNINSTALL "uninstall" CACHE STRING "Name of 'uninstall' build target")
# API Options
option(RTAUDIO_API_DS "Build DirectSound API" OFF)
option(RTAUDIO_API_ASIO "Build ASIO API" OFF)
option(RTAUDIO_API_WASAPI "Build WASAPI API" ${WIN32})
option(RTAUDIO_API_OSS "Build OSS4 API" ${xBSD})
option(RTAUDIO_API_ALSA "Build ALSA API" ${LINUX})
option(RTAUDIO_API_PULSE "Build PulseAudio API" ${pulse_FOUND})
option(RTAUDIO_API_JACK "Build JACK audio server API" ${HAVE_JACK})
option(RTAUDIO_API_CORE "Build CoreAudio API" ${APPLE})
# Check for functions
include(CheckFunctionExists)
check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
if (HAVE_GETTIMEOFDAY)
add_definitions(-DHAVE_GETTIMEOFDAY)
endif ()
# Add -Wall if possible
if (CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
endif (CMAKE_COMPILER_IS_GNUCXX)
# Add debug flags
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
add_definitions(-D__RTAUDIO_DEBUG__)
if (CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
endif (CMAKE_COMPILER_IS_GNUCXX)
endif ()
# Read libtool version info from configure.ac
set(R "m4_define\\(\\[lt_([a-z]+)\\], ([0-9]+)\\)")
file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
REGEX ${R})
foreach(_S ${CONFIGAC})
string(REGEX REPLACE ${R} "\\1" k ${_S})
string(REGEX REPLACE ${R} "\\2" v ${_S})
set(SO_${k} ${v})
endforeach()
math(EXPR SO_current_minus_age "${SO_current} - ${SO_age}")
set(SO_VER "${SO_current_minus_age}")
set(FULL_VER "${SO_current_minus_age}.${SO_age}.${SO_revision}")
# Read package version info from configure.ac
set(R "AC_INIT\\(RtAudio, ([0-9\\.]+),.*\\)")
file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
REGEX "${R}")
string(REGEX REPLACE "${R}" "\\1" PACKAGE_VERSION "${CONFIGAC}")
# Init variables
set(rtaudio_SOURCES RtAudio.cpp RtAudio.h rtaudio_c.cpp rtaudio_c.h)
set(LINKLIBS)
set(PKGCONFIG_REQUIRES)
set(LIBS_REQUIRES)
set(API_DEFS)
set(API_LIST)
# Tweak API-specific configuration.
# Jack
if (RTAUDIO_API_JACK AND jack_FOUND)
set(NEED_PTHREAD ON)
list(APPEND PKGCONFIG_REQUIRES "jack")
list(APPEND API_DEFS "-D__UNIX_JACK__")
list(APPEND API_LIST "jack")
if(jack_FOUND)
list(APPEND LINKLIBS ${jack_LIBRARIES})
list(APPEND INCDIRS ${jack_INCLUDEDIR})
else()
list(APPEND LINKLIBS ${JACK_LIB})
endif()
endif()
# ALSA
if (RTAUDIO_API_ALSA)
set(NEED_PTHREAD ON)
find_package(ALSA)
if (NOT ALSA_FOUND)
message(FATAL_ERROR "ALSA API requested but no ALSA dev libraries found")
endif()
list(APPEND INCDIRS ${ALSA_INCLUDE_DIR})
list(APPEND LINKLIBS ${ALSA_LIBRARY})
list(APPEND PKGCONFIG_REQUIRES "alsa")
list(APPEND API_DEFS "-D__LINUX_ALSA__")
list(APPEND API_LIST "alsa")
endif()
# OSS
if (RTAUDIO_API_OSS)
set(NEED_PTHREAD ON)
find_library(OSSAUDIO_LIB ossaudio)
if (OSSAUDIO_LIB)
list(APPEND LINKLIBS ossaudio)
# Note: not an error on some systems
endif()
list(APPEND API_DEFS "-D__LINUX_OSS__")
list(APPEND API_LIST "oss")
endif()
# Pulse
if (RTAUDIO_API_PULSE)
set(NEED_PTHREAD ON)
find_library(PULSE_LIB pulse)
find_library(PULSESIMPLE_LIB pulse-simple)
list(APPEND LINKLIBS ${PULSE_LIB} ${PULSESIMPLE_LIB})
list(APPEND PKGCONFIG_REQUIRES "libpulse-simple")
list(APPEND API_DEFS "-D__LINUX_PULSE__")
list(APPEND API_LIST "pulse")
endif()
# CoreAudio
if (RTAUDIO_API_CORE)
find_library(COREAUDIO_LIB CoreAudio)
find_library(COREFOUNDATION_LIB CoreFoundation)
list(APPEND LINKLIBS ${COREAUDIO_LIB} ${COREFOUNDATION_LIB})
list(APPEND LIBS_REQUIRES "-framework CoreAudio -framework CoreFoundation")
list(APPEND API_DEFS "-D__MACOSX_CORE__")
list(APPEND API_LIST "core")
endif()
# ASIO
if (RTAUDIO_API_ASIO)
set(NEED_WIN32LIBS ON)
include_directories(include)
list(APPEND rtaudio_SOURCES
include/asio.cpp
include/asiodrivers.cpp
include/asiolist.cpp
include/iasiothiscallresolver.cpp)
list(APPEND API_DEFS "-D__WINDOWS_ASIO__")
list(APPEND API_LIST "asio")
endif()
# DSound
if (RTAUDIO_API_DS)
set(NEED_WIN32LIBS ON)
list(APPEND LINKLIBS dsound)
list(APPEND API_DEFS "-D__WINDOWS_DS__")
list(APPEND API_LIST "ds")
endif()
# WASAPI
if (RTAUDIO_API_WASAPI)
include_directories(include)
set(NEED_WIN32LIBS ON)
list(APPEND LINKLIBS ksuser mfplat mfuuid wmcodecdspuuid)
list(APPEND API_DEFS "-D__WINDOWS_WASAPI__")
list(APPEND API_LIST "wasapi")
endif()
# Windows libs
if (NEED_WIN32LIBS)
list(APPEND LINKLIBS winmm ole32)
endif()
# pthread
if (NEED_PTHREAD)
find_package(Threads REQUIRED
CMAKE_THREAD_PREFER_PTHREAD
THREADS_PREFER_PTHREAD_FLAG)
list(APPEND LINKLIBS Threads::Threads)
endif()
# Create library targets.
set(LIB_TARGETS)
# Use RTAUDIO_BUILD_SHARED_LIBS / RTAUDIO_BUILD_STATIC_LIBS if they
# are defined, otherwise default to standard BUILD_SHARED_LIBS.
if (DEFINED RTAUDIO_BUILD_SHARED_LIBS)
if (RTAUDIO_BUILD_SHARED_LIBS)
add_library(rtaudio SHARED ${rtaudio_SOURCES})
else()
add_library(rtaudio STATIC ${rtaudio_SOURCES})
set(RTAUDIO_IS_STATIC TRUE)
endif()
elseif (DEFINED RTAUDIO_BUILD_STATIC_LIBS)
if (RTAUDIO_BUILD_STATIC_LIBS)
add_library(rtaudio STATIC ${rtaudio_SOURCES})
set(RTAUDIO_IS_STATIC TRUE)
else()
add_library(rtaudio SHARED ${rtaudio_SOURCES})
endif()
else()
add_library(rtaudio ${rtaudio_SOURCES})
if(NOT BUILD_SHARED_LIBS)
set(RTAUDIO_IS_STATIC TRUE)
endif()
endif()
list(APPEND LIB_TARGETS rtaudio)
# Windows: If RTAUDIO_STATIC_MSVCRT is not set, it defaults to ON when building as a
# static library and OFF when building as a DLL. If you want to have more control, you
# can explicitly override RTAUDIO_STATIC_MSVCRT to turn it off/on. It controls the flags
# related to MSVC runtime linkage in the next clause, below.
if (NOT DEFINED RTAUDIO_STATIC_MSVCRT)
set(RTAUDIO_STATIC_MSVCRT ${RTAUDIO_IS_STATIC})
endif()
# In MSVC, set MD/MT appropriately for a static library
# (From https://github.com/protocolbuffers/protobuf/blob/master/cmake/CMakeLists.txt)
if(MSVC AND RTAUDIO_STATIC_MSVCRT)
foreach(flag_var
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
if(${flag_var} MATCHES "/MD")
string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
endif(${flag_var} MATCHES "/MD")
endforeach(flag_var)
endif()
set_target_properties(rtaudio PROPERTIES
SOVERSION ${SO_VER}
VERSION ${FULL_VER})
# Set standard installation directories.
include(GNUInstallDirs)
# Set include paths, populate target interface.
target_include_directories(rtaudio
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
PRIVATE
${INCDIRS}
)
# Set compile-time definitions
target_compile_definitions(rtaudio PRIVATE ${API_DEFS})
target_compile_definitions(rtaudio PRIVATE RTAUDIO_EXPORT)
target_link_libraries(rtaudio ${LINKLIBS})
# Subdirs
include(CTest)
if (NOT DEFINED RTAUDIO_BUILD_TESTING OR RTAUDIO_BUILD_TESTING STREQUAL "")
set(RTAUDIO_BUILD_TESTING ${BUILD_TESTING})
endif()
if (RTAUDIO_BUILD_TESTING)
add_subdirectory(tests)
endif()
# Message
string(REPLACE ";" " " apilist "${API_LIST}")
message(STATUS "Compiling with support for: ${apilist}")
# PkgConfig file
string(REPLACE ";" " " req "${PKGCONFIG_REQUIRES}")
string(REPLACE ";" " " req_libs "${LIBS_REQUIRES}")
string(REPLACE ";" " " api "${API_DEFS}")
set(prefix ${CMAKE_INSTALL_PREFIX})
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/rtaudio.pc.in" "rtaudio.pc" @ONLY)
# Add install rule.
install(TARGETS ${LIB_TARGETS}
EXPORT RtAudioTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/rtaudio)
# Install public header files
install(FILES RtAudio.h rtaudio_c.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/rtaudio)
# Store the package in the user registry.
export(PACKAGE RtAudio)
# Set installation path for CMake files.
set(RTAUDIO_CMAKE_DESTINATION share/rtaudio)
# Create CMake configuration export file.
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake.in "@PACKAGE_INIT@\n")
if(NEED_PTHREAD)
file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake.in "find_package(Threads REQUIRED)\n")
endif()
file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake.in "include(\${CMAKE_CURRENT_LIST_DIR}/RtAudioTargets.cmake)")
# Install CMake configuration export file.
include(CMakePackageConfigHelpers)
configure_package_config_file(
${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake
INSTALL_DESTINATION ${RTAUDIO_CMAKE_DESTINATION}
)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig-version.cmake
VERSION ${FULL_VER}
COMPATIBILITY AnyNewerVersion
)
install(
FILES
${CMAKE_BINARY_DIR}/RtAudioConfig.cmake
${CMAKE_BINARY_DIR}/RtAudioConfig-version.cmake
DESTINATION
${RTAUDIO_CMAKE_DESTINATION}
)
# Export library target (build-tree).
export(EXPORT RtAudioTargets
NAMESPACE RtAudio::)
# Export library target (install-tree).
install(EXPORT RtAudioTargets
DESTINATION ${RTAUDIO_CMAKE_DESTINATION}
NAMESPACE RtAudio::)
# Configure uninstall target.
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/RtAudioConfigUninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake" @ONLY)
# Create uninstall target.
add_custom_target(${RTAUDIO_TARGETNAME_UNINSTALL}
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/rtaudio.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)