Merge pull request #218 from thestk/fix-wasapi-resampler-crash
[rtaudio.git] / CMakeLists.txt
index 9e4060a0064d8af7a296e754e337e03f02b7aa7f..b88963ff7c26ab940eab9041aa381dd59d7611d2 100644 (file)
@@ -1,5 +1,5 @@
 # Set minimum CMake required version for this project.
-cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
 
 # Define a C++ project.
 project(RtAudio LANGUAGES CXX)
@@ -24,17 +24,23 @@ elseif(UNIX AND NOT APPLE)
 endif()
 
 # Necessary for Windows
-if(WIN32)
+if(MINGW)
   set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
-  set(CMAKE_DEBUG_POSTFIX "d")
+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(WINDOWS)
+  set(CMAKE_DEBUG_POSTFIX d CACHE STRING "Postfix for debug version of library")
 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)
-set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (Release,Debug)")
+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)
@@ -177,8 +183,9 @@ endif()
 
 # WASAPI
 if (RTAUDIO_API_WASAPI)
+  include_directories(include)
   set(NEED_WIN32LIBS ON)
-  list(APPEND LINKLIBS uuid ksuser)
+  list(APPEND LINKLIBS ksuser mfplat mfuuid wmcodecdspuuid)
   list(APPEND API_DEFS "-D__WINDOWS_WASAPI__")
   list(APPEND API_LIST "wasapi")
 endif()
@@ -199,56 +206,55 @@ endif()
 # Create library targets.
 cmake_policy(SET CMP0042 OLD)
 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
-    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
-    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
-    ${INCDIRS})
-
-  # Set compile-time definitions
-  target_compile_definitions(rtaudio PRIVATE ${API_DEFS})
-
-  target_link_libraries(rtaudio ${LINKLIBS})
+# 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})
+  endif()
+elseif (DEFINED RTAUDIO_BUILD_STATIC_LIBS)
+  if (RTAUDIO_BUILD_STATIC_LIBS)
+    add_library(rtaudio STATIC ${rtaudio_SOURCES})
+  else()
+    add_library(rtaudio SHARED ${rtaudio_SOURCES})
+  endif()
+else()
+  add_library(rtaudio ${rtaudio_SOURCES})
 endif()
+list(APPEND LIB_TARGETS rtaudio)
 
-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})
+# 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_static PRIVATE
-    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
-    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
-    ${INCDIRS})
+# Set include paths, populate target interface.
+target_include_directories(rtaudio PRIVATE
+  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+  $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
+  ${INCDIRS})
 
-  # Set compile-time definitions
-  target_compile_definitions(rtaudio_static PRIVATE ${API_DEFS})
+# Set compile-time definitions
+target_compile_definitions(rtaudio PRIVATE ${API_DEFS})
+target_compile_definitions(rtaudio PRIVATE RTAUDIO_EXPORT)
+target_link_libraries(rtaudio ${LINKLIBS})
 
-  target_link_libraries(rtaudio_static ${LINKLIBS})
-endif()
 
 # Set standard installation directories.
 include(GNUInstallDirs)
 
 # Subdirs
-if (BUILD_TESTING)
-  include(CTest)
+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 (BUILD_TESTING)
+endif()
 
 # Message
 string(REPLACE ";" " " apilist "${API_LIST}")
@@ -257,7 +263,8 @@ message(STATUS "Compiling with support for: ${apilist}")
 # PkgConfig file
 string(REPLACE ";" " " req "${PKGCONFIG_REQUIRES}")
 string(REPLACE ";" " " api "${API_DEFS}")
-configure_file("rtaudio.pc.in" "rtaudio.pc" @ONLY)
+set(prefix ${CMAKE_INSTALL_PREFIX})
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/rtaudio.pc.in" "rtaudio.pc" @ONLY)
 
 # Add install rule.
 install(TARGETS ${LIB_TARGETS}
@@ -271,17 +278,17 @@ install(TARGETS ${LIB_TARGETS}
 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()
+set(RTAUDIO_CMAKE_DESTINATION share/rtaudio)
 
 # Create CMake configuration export file.
-file(WRITE ${CMAKE_BINARY_DIR}/RtAudioConfig.cmake "include(\${CMAKE_CURRENT_LIST_DIR}/RtAudioTargets.cmake)")
+if(NEED_PTHREAD)
+  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake "find_package(Threads REQUIRED)\n")
+endif()
+
+file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake "include(\${CMAKE_CURRENT_LIST_DIR}/RtAudioTargets.cmake)")
 
 # Install CMake configuration export file.
-install(FILES ${CMAKE_BINARY_DIR}/RtAudioConfig.cmake
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake
         DESTINATION ${RTAUDIO_CMAKE_DESTINATION})
 
 # Export library target (build-tree).
@@ -295,12 +302,12 @@ install(EXPORT RtAudioTargets
 
 # Configure uninstall target.
 configure_file(
-    "${CMAKE_SOURCE_DIR}/cmake/RtAudioConfigUninstall.cmake.in"
-    "${CMAKE_BINARY_DIR}/RtAudioConfigUninstall.cmake" @ONLY)
+    "${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_BINARY_DIR}/RtAudioConfigUninstall.cmake)
+add_custom_target(${RTAUDIO_TARGETNAME_UNINSTALL}
+    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake)
 
 install(
     FILES ${CMAKE_CURRENT_BINARY_DIR}/rtaudio.pc