X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=CMakeLists.txt;h=89b537279f668cbdc24c71ab211666087f8b6666;hb=be212c14cd22c11e7b5c087c2b7aa20ab71f3787;hp=54f8816966122093393af3ae5afe7cc059c4c069;hpb=5c69780f4bf67e26ed370cea39418b2d82df119e;p=rtaudio-cdist.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 54f8816..89b5372 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,139 +1,310 @@ -cmake_minimum_required(VERSION 2.8.10) -project(RtAudio) +# Set minimum CMake required version for this project. +cmake_minimum_required(VERSION 3.0 FATAL_ERROR) -include(CTest) -include(CheckFunctionExists) +# Define a C++ project. +project(RtAudio LANGUAGES CXX) + +# 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(WIN32) + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) + set(CMAKE_DEBUG_POSTFIX "d") +endif() +# Build Options +option(BUILD_SHARED_LIBS "Compile library shared lib." TRUE) +option(BUILD_STATIC_LIBS "Compile library static lib." TRUE) +option(BUILD_TESTING "Compile test programs." TRUE) option(BUILD_PYTHON "Build PyRtAudio python bindings" OFF) -option(AUDIO_WINDOWS_DS "Build Windows DirectSound API" OFF) -option(AUDIO_WINDOWS_ASIO "Build Windows ASIO API" OFF) -option(AUDIO_WINDOWS_WASAPI "Build Windows WASAPI API" OFF) -option(AUDIO_LINUX_OSS "Build Linux OSS API" OFF) -option(AUDIO_LINUX_ALSA "Build Linux ALSA API" OFF) -option(AUDIO_LINUX_PULSE "Build Linux PulseAudio API" OFF) -option(AUDIO_UNIX_JACK "Build Unix JACK audio server API" OFF) -option(AUDIO_OSX_CORE "Build Mac OSX CoreAudio API" OFF) +set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (Release,Debug)") -if (CMAKE_BUILD_TYPE STREQUAL "Debug") - add_definitions(-D__RTAUDIO_DEBUG__) -endif () +# 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") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") endif (CMAKE_COMPILER_IS_GNUCXX) -set(rtaudio_SOURCES RtAudio.cpp rtaudio_c.cpp) +# 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_revision}.${SO_age}") + +# 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) -if (CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*") - message(STATUS "NetBSD detected, using OSS") - find_package(Threads REQUIRED CMAKE_THREAD_PREFER_PTHREAD) - list(APPEND LINKLIBS ossaudio ${CMAKE_THREAD_LIBS_INIT}) - set(AUDIO_LINUX_OSS ON) -elseif (UNIX AND NOT APPLE) - if (NOT AUDIO_LINUX_PULSE AND NOT AUDIO_LINUX_ALSA AND NOT AUDIO_LINUX_OSS AND NOT AUDIO_UNIX_JACK) - set(AUDIO_LINUX_ALSA ON) - endif() - - if (AUDIO_LINUX_PULSE) - find_library(PULSE_LIB pulse) - find_library(PULSESIMPLE_LIB pulse-simple) - find_package(Threads REQUIRED CMAKE_THREAD_PREFER_PTHREAD) - list(APPEND LINKLIBS ${PULSE_LIB} ${PULSESIMPLE_LIB} ${CMAKE_THREAD_LIBS_INIT}) - add_definitions(-D__LINUX_PULSE__) - message(STATUS "Using Linux PulseAudio") - endif (AUDIO_LINUX_PULSE) - if (AUDIO_LINUX_ALSA) - find_package(ALSA) - find_package(Threads REQUIRED CMAKE_THREAD_PREFER_PTHREAD) - if (NOT ALSA_FOUND) - message(FATAL_ERROR "ALSA API requested but no ALSA dev libraries found") - endif() - include_directories(${ALSA_INCLUDE_DIR}) - list(APPEND LINKLIBS ${ALSA_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) - add_definitions(-D__LINUX_ALSA__) - message(STATUS "Using Linux ALSA") - endif (AUDIO_LINUX_ALSA) -endif () +set(PKGCONFIG_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_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 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() -if (APPLE) - if (NOT AUDIO_OSX_CORE AND NOT AUDIO_UNIX_JACK) - set(AUDIO_OSX_CORE ON) - endif() - - if (AUDIO_OSX_CORE) - find_library(COREAUDIO_LIB CoreAudio) - find_library(COREFOUNDATION_LIB CoreFoundation) - list(APPEND LINKLIBS ${COREAUDIO_LIB} ${COREFOUNDATION_LIB}) - add_definitions(-D__MACOSX_CORE__) - message(STATUS "Using OSX CoreAudio") - endif (AUDIO_OSX_CORE) -endif (APPLE) - -# JACK supported on many Unices -if (UNIX) - if (AUDIO_UNIX_JACK) - find_library(JACK_LIB jack) - list(APPEND LINKLIBS ${JACK_LIB}) - add_definitions(-D__UNIX_JACK__) - message(STATUS "Using JACK") - endif (AUDIO_UNIX_JACK) -endif (UNIX) - -if (WIN32) - if (NOT AUDIO_WINDOWS_DS AND NOT AUDIO_WINDOWS_ASIO AND NOT AUDIO_WINDOWS_WASAPI) - set(AUDIO_WINDOWS_WASAPI ON) - endif() - - include_directories(include) - list(APPEND LINKLIBS winmm ole32) - - if (AUDIO_WINDOWS_DS) - add_definitions(-D__WINDOWS_DS__) - message(STATUS "Using Windows DirectSound") - list(APPEND LINKLIBS dsound) - endif (AUDIO_WINDOWS_DS) - if (AUDIO_WINDOWS_WASAPI) - add_definitions(-D__WINDOWS_WASAPI__) - message(STATUS "Using Windows WASAPI") - list(APPEND LINKLIBS uuid ksuser) - endif (AUDIO_WINDOWS_WASAPI) - if (AUDIO_WINDOWS_ASIO) - list(APPEND rtaudio_SOURCES - include/asio.cpp - include/asiodrivers.cpp - include/asiolist.cpp - include/iasiothiscallresolver.cpp) - add_definitions(-D__WINDOWS_ASIO__) - message(STATUS "Using Windows ASIO") - endif (AUDIO_WINDOWS_ASIO) -endif (WIN32) +# 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. cmake_policy(SET CMP0042 OLD) -add_library(rtaudio SHARED ${rtaudio_SOURCES}) -add_library(rtaudio_static STATIC ${rtaudio_SOURCES}) +set(LIB_TARGETS) +if(BUILD_SHARED_LIBS) + add_library(rtaudio SHARED ${rtaudio_SOURCES}) + list(APPEND LIB_TARGETS rtaudio) + + # Add headers destination for install rule. + set_target_properties(rtaudio PROPERTIES PUBLIC_HEADER RtAudio.h + SOVERSION ${SO_VER} + VERSION ${FULL_VER}) + + # Set include paths, populate target interface. + target_include_directories(rtaudio 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}) +endif() + +if(BUILD_STATIC_LIBS) + add_library(rtaudio_static STATIC ${rtaudio_SOURCES}) + list(APPEND LIB_TARGETS rtaudio_static) + + # Add headers destination for install rule. + set_target_properties(rtaudio_static PROPERTIES PUBLIC_HEADER RtAudio.h + SOVERSION ${SO_VER} + VERSION ${FULL_VER}) + + # Set include paths, populate target interface. + target_include_directories(rtaudio_static PRIVATE + $ + $ + ${INCDIRS}) + + # Set compile-time definitions + target_compile_definitions(rtaudio_static PRIVATE ${API_DEFS}) -target_link_libraries(rtaudio ${LINKLIBS}) + target_link_libraries(rtaudio_static ${LINKLIBS}) +endif() +# Set standard installation directories. +include(GNUInstallDirs) + +# Subdirs if (BUILD_TESTING) - add_subdirectory(tests) + include(CTest) + add_subdirectory(tests) endif (BUILD_TESTING) -install(TARGETS rtaudio - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin) +# Message +string(REPLACE ";" " " apilist "${API_LIST}") +message(STATUS "Compiling with support for: ${apilist}") -install( - FILES RtAudio.h - DESTINATION include) +# PkgConfig file +string(REPLACE ";" " " req "${PKGCONFIG_REQUIRES}") +string(REPLACE ";" " " api "${API_DEFS}") +set(prefix ${CMAKE_INSTALL_PREFIX}) +configure_file("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} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + +# Store the package in the user registry. +export(PACKAGE RtAudio) + +# Set installation path for CMake files. +if(WIN32) + set(RTAUDIO_CMAKE_DESTINATION cmake) +else() + set(RTAUDIO_CMAKE_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/RtAudio) +endif() + +# Create CMake configuration export file. +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake "include(\${CMAKE_CURRENT_LIST_DIR}/RtAudioTargets.cmake)") + +# Install CMake configuration export file. +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.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(uninstall + COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake) install( - FILES rtaudio.pc - DESTINATION lib/pkgconfig) + FILES ${CMAKE_CURRENT_BINARY_DIR}/rtaudio.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)