Use cmake build
[platform/upstream/libsndfile.git] / CMakeLists.txt
index 590429b..f938ddc 100644 (file)
-# CMakeLists.txt for libsndfile
+cmake_minimum_required (VERSION 3.1..3.18)
 
-cmake_minimum_required (VERSION 3.0.0)
+# MSVC runtime library flags are selected by an abstraction, CMake >= 3.15
+# This policy still need to be set even with cmake_minimum_required() command above.
+if (POLICY CMP0091)
+       if ((DEFINED ENABLE_STATIC_RUNTIME) AND (DEFINED CMAKE_MSVC_RUNTIME_LIBRARY))
+               message (FATAL_ERROR "Both ENABLE_STATIC_RUNTIME and CMAKE_MSVC_RUNTIME_LIBRARY are set.")
+               return ()
+       endif ()
 
-project (libsndfile)
+       if (DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)
+               cmake_policy (SET CMP0091 NEW)
+       else ()
+               cmake_policy (SET CMP0091 OLD)
+       endif ()
+endif ()
 
-# We may need these programs so detect them now.
-find_program (AUTOGEN autogen)
-find_program (AUTOHEADER autoheader)
-find_program (GREP grep)
-find_program (SED sed)
-find_program (WC wc)
+option (ENABLE_EXTERNAL_LIBS "Enable Vorbis, and Opus codecs" ON)
+if (ENABLE_EXTERNAL_LIBS)
+       list (APPEND VCPKG_MANIFEST_FEATURES "external-libs")
+endif ()
 
-include (CMake/file.cmake)
+option (ENABLE_MPEG "Enable MPEG codecs" ON)
+if (ENABLE_MPEG)
+       list (APPEND VCPKG_MANIFEST_FEATURES "mpeg")
+endif ()
 
-# Duplicate the autoconf/autoheader functionality.
+option (ENABLE_EXPERIMENTAL "Enable experimental code" OFF)
+if (ENABLE_EXPERIMENTAL)
+       list (APPEND VCPKG_MANIFEST_FEATURES "speex")
+endif ()
 
-# Get the version number from configure.ac.
-execute_process (
-       COMMAND ${GREP} ^AC_INIT configure.ac
-       COMMAND ${SED} "s/.*libsndfile[^0-9]*//;s/\\].*//"
-       OUTPUT_VARIABLE LIB_VERSION
-       )
+option (BUILD_REGTEST "Build regtest" OFF)
+if (BUILD_REGTEST)
+       list (APPEND VCPKG_MANIFEST_FEATURES "regtest")
+endif ()
 
-string (STRIP ${LIB_VERSION} LIB_VERSION)
-string (REGEX REPLACE "\\..*" "" LIB_VERSION_MAJOR ${LIB_VERSION})
+project(libsndfile VERSION 1.2.0)
 
-message (STATUS "libsndfile version : ${LIB_VERSION}")
+#
+# Variables
+#
 
-# Generate config.h.in if it does not already exist.
-if (NOT (EXISTS "${CMAKE_SOURCE_DIR}/CMakeFiles/config.h.in"))
-       if (NOT AUTOHEADER)
-               message (FATAL_ERROR "Need autoheader (part of GNU autoconf) to proceed.")
-               endif ()
+set (CMAKE_C_STANDARD 99)
+set (CMAKE_C_STANDARD_REQUIRED TRUE)
+set_property(GLOBAL PROPERTY USE_FOLDERS ON)
 
-       message (STATUS "Running autoheader to create src/config.h.in")
-       execute_process (COMMAND ${AUTOHEADER} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
+set (PACKAGE_NAME ${PROJECT_NAME})
+set (CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
+set (CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
+set (CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
+set (CPACK_PACKAGE_VERSION_STAGE "")
+set (CPACK_PACKAGE_VERSION_FULL "${PROJECT_VERSION}${CPACK_PACKAGE_VERSION_STAGE}")
 
-       assert_line_count_non_zero ("${CMAKE_SOURCE_DIR}/src/config.h.in")
+#
+# System-wide includes
+#
 
-       message (STATUS "Post processing src/config.h.in")
-       execute_process (
-               COMMAND ${SED} -E "s/undef([ \\t]+)([a-zA-Z0-8_]+)/define\\1\\2\\1@\\2@/" src/config.h.in
-               COMMAND ${SED} "s/.*_FILE_OFFSET_BITS.*//"
-               OUTPUT_FILE ${CMAKE_SOURCE_DIR}/CMakeFiles/config.h.in
-               WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
-               )
+include (GNUInstallDirs)
+include (FeatureSummary)
+include (CMakeDependentOption)
+include (CTest)
+include (CheckCCompilerFlag)
 
-       execute_process (
-               COMMAND ${GREP} -c undef ${CMAKE_SOURCE_DIR}/CMakeFiles/config.h.in
-               OUTPUT_VARIABLE undef_count
-               )
+#
+# Options
+#
+
+option (BUILD_SHARED_LIBS "Build shared libraries" OFF)
+if (BUILD_SHARED_LIBS AND BUILD_TESTING)
+       set (BUILD_TESTING OFF)
+       message ("Build testing required static libraries. To prevent build errors BUILD_TESTING disabled.")
+endif ()
+option (BUILD_PROGRAMS "Build programs" ON)
+option (BUILD_EXAMPLES "Build examples" ON)
+option (ENABLE_CPACK "Enable CPack support" ON)
+option (ENABLE_BOW_DOCS "Enable black-on-white html docs" OFF)
+if (MSVC AND (DEFINED ENABLE_STATIC_RUNTIME))
+       option (ENABLE_STATIC_RUNTIME "Enable static runtime" ${ENABLE_STATIC_RUNTIME})
+elseif (MINGW)
+       option (ENABLE_STATIC_RUNTIME "Enable static runtime" OFF)
+endif ()
+option (ENABLE_PACKAGE_CONFIG "Generate and install package config file" ON)
+option (INSTALL_PKGCONFIG_MODULE "Generate and install pkg-config module" ON)
+
+list (APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
+if (CMAKE_VERSION VERSION_LESS 3.14)
+       list (APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/sqlite")
+endif ()
+
+#
+# Setup definitions
+#
+
+include(SndFileChecks)
+
+if (ENABLE_EXTERNAL_LIBS AND NOT (Vorbis_FOUND OR OPUS_FOUND))
+       set (ENABLE_EXTERNAL_LIBS OFF)
+endif()
+if(ENABLE_MPEG AND (NOT HAVE_MPEG_LIBS))
+       set (ENABLE_MPEG OFF)
+endif()
+if (BUILD_REGTEST AND (NOT SQLITE3_FOUND))
+       set (BUILD_REGTEST OFF)
+endif()
+
+cmake_dependent_option (ENABLE_CPU_CLIP "Enable tricky cpu specific clipper" ON "CPU_CLIPS_POSITIVE;CPU_CLIPS_NEGATIVE" OFF)
+if (NOT ENABLE_CPU_CLIP)
+       set (CPU_CLIPS_POSITIVE FALSE)
+       set (CPU_CLIPS_NEGATIVE FALSE)
+endif ()
+cmake_dependent_option (ENABLE_COMPATIBLE_LIBSNDFILE_NAME "Set DLL name to libsndfile-1.dll (canonical name), sndfile.dll otherwise" OFF "WIN32;BUILD_SHARED_LIBS" OFF)
+cmake_dependent_option (INSTALL_MANPAGES "Install man pages for programs" ON "BUILD_PROGRAMS" OFF)
 
-       if (${undef_count} GREATER 0)
-               message (FATAL_ERROR "CMake processing of CMakeFIles/config.h.in has failed.")
+if (NOT MSVC)
+       if (CPU_IS_X86)
+               check_c_compiler_flag (-msse2 HAVE_MSSE2_COMPILER_FLAG)
+               if (HAVE_MSSE2_COMPILER_FLAG)
+                       cmake_dependent_option (ENABLE_SSE2 "Add SSE2 compiler flag" ON "HAVE_MSSE2_COMPILER_FLAG" OFF)
                endif ()
        endif ()
+endif ()
+if (ENABLE_SSE2)
+       add_compile_options (-msse2)
+endif ()
 
-assert_line_count_non_zero ("${CMAKE_SOURCE_DIR}/CMakeFiles/config.h.in")
-
-# Use autogen to generate files if they don't already exist.
-include (CMake/autogen.cmake)
-lsf_autogen (src test_endswap)
-lsf_autogen (tests pcm_test)
-lsf_autogen (tests utils)
-lsf_autogen (tests floating_point_test)
-lsf_autogen (tests header_test)
-lsf_autogen (tests pipe_test)
-lsf_autogen (tests write_read_test)
-lsf_autogen (tests scale_clip_test)
-lsf_autogen (tests rdwr_test)
-lsf_autogen (tests benchmark)
-
-if (DEFINED ENV{CC})
-       set (CMAKE_C_COMPILER $ENV{CC})
-       endif()
+set (HAVE_EXTERNAL_XIPH_LIBS ${ENABLE_EXTERNAL_LIBS})
+set (HAVE_SQLITE3 ${BUILD_REGTEST})
+set (HAVE_ALSA_ASOUNDLIB_H ${ALSA_FOUND})
+set (HAVE_SNDIO_H ${SNDIO_FOUND})
 
-if (DEFINED ENV{CXX})
-       set (CMAKE_CXX_COMPILER $ENV{CXX})
-       endif()
+set (ENABLE_EXPERIMENTAL_CODE ${ENABLE_EXPERIMENTAL})
+set (HAVE_MPEG ${ENABLE_MPEG})
+set (HAVE_SPEEX ${ENABLE_EXPERIMENTAL})
+
+add_feature_info (BUILD_SHARED_LIBS BUILD_SHARED_LIBS "build shared libraries")
+add_feature_info (ENABLE_EXTERNAL_LIBS ENABLE_EXTERNAL_LIBS "enable Vorbis, and Opus codecs")
+add_feature_info (ENABLE_MPEG ENABLE_MPEG "enable MPEG audio (including mp3) codecs")
+add_feature_info (ENABLE_EXPERIMENTAL ENABLE_EXPERIMENTAL "enable experimental code")
+add_feature_info (BUILD_TESTING BUILD_TESTING "build tests")
+add_feature_info (BUILD_REGTEST BUILD_REGTEST "build regtest")
+add_feature_info (ENABLE_CPACK ENABLE_CPACK "enable CPack support")
+add_feature_info (ENABLE_CPU_CLIP ENABLE_CPU_CLIP "Enable tricky cpu specific clipper")
+add_feature_info (ENABLE_BOW_DOCS ENABLE_BOW_DOCS "enable black-on-white html docs")
+add_feature_info (ENABLE_PACKAGE_CONFIG ENABLE_PACKAGE_CONFIG "generate and install package config file")
+add_feature_info (INSTALL_PKGCONFIG_MODULE INSTALL_PKGCONFIG_MODULE "generate and install pkg-config module")
+add_feature_info (INSTALL_MANPAGES INSTALL_MANPAGES "install man pages for programs")
+if (WIN32 AND BUILD_SHARED_LIBS)
+       add_feature_info (ENABLE_COMPATIBLE_LIBSNDFILE_NAME ENABLE_COMPATIBLE_LIBSNDFILE_NAME "Set DLL name to libsndfile-1.dll (canonical name), sndfile.dll otherwise")
+endif ()
 
-message (STATUS "System       : ${CMAKE_SYSTEM_NAME}")
-message (STATUS "Processor    : ${CMAKE_SYSTEM_PROCESSOR}")
-message (STATUS "C compiler   : ${CMAKE_C_COMPILER_ID}")
-message (STATUS "C++ compiler : ${CMAKE_CXX_COMPILER_ID}")
+if (HAVE_MSSE2_COMPILER_FLAG)
+       add_feature_info (ENABLE_SSE2 ENABLE_SSE2 "add SSE2 compiler flag")
+endif ()
 
-#-------------------------------------------------------------------------------
 
-set (PACKAGE \"libsndfile\")
-set (PACKAGE_NAME \"libsndfile\")
-set (VERSION \"${LIB_VERSION}\")
-set (PACKAGE_VERSION \"${LIB_VERSION}\")
 
-set (BASEPATH "${CMAKE_SOURCE_DIR}")
 
-include (CMake/build.cmake)
-include (CMake/external_libs.cmake)
-include (CMake/libsndfile.cmake)
+set_package_properties (Ogg PROPERTIES
+       TYPE RECOMMENDED
+       URL "www.xiph.org/ogg/"
+       DESCRIPTION "library for manipulating ogg bitstreams"
+       PURPOSE "Required to enable Vorbis, Speex, and Opus support"
+       )
+set_package_properties (Vorbis PROPERTIES
+       TYPE RECOMMENDED
+       URL "www.vorbis.com/"
+       DESCRIPTION "open source lossy audio codec"
+       PURPOSE "Enables Vorbis support"
+       )
+set_package_properties (mp3lame PROPERTIES
+       TYPE RECOMMENDED
+       URL "https://lame.sourceforge.io/"
+       DESCRIPTION "High quality MPEG Audio Layer III (MP3) encoder"
+       PURPOSE "Enables MPEG layer III (MP3) writing support"
+       )
+set_package_properties (MPG123 PROPERTIES
+       TYPE RECOMMENDED
+       URL "https://www.mpg123.de/"
+       DESCRIPTION "MPEG Audio Layer I/II/III decoder"
+       PURPOSE "Enables MPEG Audio reading support"
+       )
+set_package_properties(Opus PROPERTIES
+       TYPE RECOMMENDED
+       URL     "www.opus-codec.org/"
+       DESCRIPTION "Standardized open source low-latency fullband codec"
+       PURPOSE "Enables experimental Opus support"
+       )
+set_package_properties(Speex PROPERTIES TYPE OPTIONAL
+       URL "www.speex.org/"
+       DESCRIPTION "an audio codec tuned for speech"
+       PURPOSE "Enables experemental Speex support"
+       )
+set_package_properties (SQLite3 PROPERTIES
+       TYPE OPTIONAL
+       URL "www.sqlite.org/"
+       DESCRIPTION "light weight SQL database engine."
+       PURPOSE "Enables regtest"
+       )
+if (BUILD_SHARED_LIBS)
+       set_package_properties (PythonInterp PROPERTIES
+               TYPE REQUIRED
+               URL "www.python.org/"
+               DESCRIPTION "Python is a widely used high-level programming language."
+               PURPOSE "Required to build shared libraries"
+               )
+endif()
+
+feature_summary (WHAT ALL)
+
+#
+# Setup configuration
+#
 
-if (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
-       set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -std=gnu99 -Wall -Wextra" CACHE STRING "" FORCE)
-       set (CMAKE_CXX__FLAGS "${CMAKE_C_FLAGS} -O3 -std=gnu99 -Wall -Wextra" CACHE STRING "" FORCE)
+configure_file (src/config.h.cmake src/config.h)
 
-       set (COMPILER_IS_GCC 1)
-       set (_POSIX_SOURCE 1)
+if (INSTALL_PKGCONFIG_MODULE)
 
-       if (${Werror} MATCHES "on")
-               set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror" CACHE STRING "" FORCE)
+       set (prefix ${CMAKE_INSTALL_PREFIX})
+       set (exec_prefix "\$\{prefix\}")
+       set (libdir "\$\{prefix\}/${CMAKE_INSTALL_LIBDIR}")
+       set (includedir "\$\{prefix\}/${CMAKE_INSTALL_INCLUDEDIR}")
+       set (VERSION ${PROJECT_VERSION})
+       if (ENABLE_EXTERNAL_LIBS)
+               set (EXTERNAL_XIPH_REQUIRE "ogg vorbis vorbisenc opus")
+               if (ENABLE_EXPERIMENTAL)
+                       set (EXTERNAL_XIPH_REQUIRE "${EXTERNAL_XIPH_REQUIRE} speex")
                endif ()
        endif ()
+       if (ENABLE_MPEG)
+               set (EXTERNAL_MPEG_REQUIRE "libmpg123")
+               set (EXTERNAL_MPEG_LIBS "-lmp3lame")
+       endif ()
 
-if (CMAKE_C_COMPILER_ID STREQUAL "MSVC")
-       # Untested. Probably does not work. Patches accepted.
+       configure_file (sndfile.pc.in sndfile.pc @ONLY)
 
-       set (CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} /wd4244 /wd4996" CACHE STRING "" FORCE)
-       add_definitions ("/wd4244 /wd4996")
-       endif ()
+endif ()
 
+#
+# libsndfile
+#
 
-# Need to actually detect this.
-set (CPU_CLIPS_POSITIVE 0)
-set (CPU_CLIPS_NEGATIVE 0)
-
-set (ENABLE_EXPERIMENTAL_CODE 0)
-
-find_external_xiph_libs (HAVE_EXTERNAL_XIPH_LIBS EXTERNAL_XIPH_CFLAGS EXTERNAL_XIPH_LIBS)
-
-#-------------------------------------------------------------------------------
-# Project definitions follow.
-
-configure_file (${CMAKE_SOURCE_DIR}/src/sndfile.h.in ${CMAKE_SOURCE_DIR}/src/sndfile.h)
-configure_file (${CMAKE_SOURCE_DIR}/CMakeFiles/config.h.in ${CMAKE_SOURCE_DIR}/src/config.h)
-
-include_directories (src)
-
-set (libsndfile_sources
-       src/ALAC/ALACBitUtilities.c
-       src/ALAC/ag_dec.c
-       src/ALAC/ag_enc.c
-       src/ALAC/alac_decoder.c
-       src/ALAC/alac_encoder.c
-       src/ALAC/dp_dec.c
-       src/ALAC/dp_enc.c
-       src/ALAC/matrix_dec.c
-       src/ALAC/matrix_enc.c
-
-       src/G72x/g721.c
-       src/G72x/g723_16.c
-       src/G72x/g723_24.c
-       src/G72x/g723_40.c
-       src/G72x/g72x.c
-       src/G72x/g72x_test.c
-
-       src/GSM610/add.c
-       src/GSM610/code.c
-       src/GSM610/decode.c
-       src/GSM610/gsm_create.c
-       src/GSM610/gsm_decode.c
-       src/GSM610/gsm_destroy.c
-       src/GSM610/gsm_encode.c
-       src/GSM610/gsm_option.c
-       src/GSM610/long_term.c
-       src/GSM610/lpc.c
-       src/GSM610/preprocess.c
-       src/GSM610/rpe.c
-       src/GSM610/short_term.c
-       src/GSM610/table.c
+# Public libsndfile headers
+set (sndfile_HDRS
+       include/sndfile.h
+       include/sndfile.hh
+       )
 
-       src/aiff.c
-       src/alac.c
+#
+# libsndfile static library
+#
+
+add_library (sndfile
+       src/sfconfig.h
+       src/sfendian.h
+       src/sf_unistd.h
+       src/common.h
+       src/common.c
+       src/file_io.c
+       src/command.c
+       src/pcm.c
+       src/ulaw.c
        src/alaw.c
-       src/au.c
-       src/audio_detect.c
-       src/avr.c
-       src/broadcast.c
-       src/caf.c
+       src/float32.c
+       src/double64.c
+       src/ima_adpcm.c
+       src/ms_adpcm.c
+       src/dwvw.c
+       src/vox_adpcm.c
+       src/interleave.c
+       src/strings.c
+       src/dither.c
        src/cart.c
-       src/chanmap.c
+       src/broadcast.c
+       src/audio_detect.c
+       src/ima_oki_adpcm.c
+       src/ima_oki_adpcm.h
        src/chunk.c
-       src/command.c
-       src/common.c
-       src/dither.c
-       src/double64.c
+       src/ogg.h
+       src/ogg.c
+       src/chanmap.h
+       src/chanmap.c
+       src/id3.h
+       src/id3.c
+       $<$<BOOL:${WIN32}>:src/windows.c>
+       src/sndfile.c
+       src/aiff.c
+       src/au.c
+       src/avr.c
        src/dwd.c
-       src/dwvw.c
-       src/file_io.c
        src/flac.c
-       src/float32.c
-       src/g72x.c
-       src/gsm610.c
        src/htk.c
-       src/id3.c
-       src/ima_adpcm.c
-       src/ima_oki_adpcm.c
-       src/interleave.c
        src/ircam.c
        src/macos.c
        src/mat4.c
        src/mat5.c
-       src/mpc2k.c
-       src/ms_adpcm.c
        src/nist.c
-       src/ogg.c
-       src/ogg_opus.c
-       src/ogg_pcm.c
-       src/ogg_speex.c
-       src/ogg_vorbis.c
        src/paf.c
-       src/pcm.c
        src/pvf.c
        src/raw.c
-       src/rf64.c
        src/rx2.c
        src/sd2.c
        src/sds.c
-       src/sndfile.c
-       src/strings.c
        src/svx.c
        src/txw.c
-       src/ulaw.c
        src/voc.c
-       src/vox_adpcm.c
+       src/wve.c
        src/w64.c
-       src/wav.c
+       src/wavlike.h
        src/wavlike.c
-       src/windows.c
-       src/wve.c
+       src/wav.c
        src/xi.c
+       src/mpc2k.c
+       src/rf64.c
+       src/ogg_vorbis.c
+       src/ogg_speex.c
+       src/ogg_pcm.c
+       src/ogg_opus.c
+       src/ogg_vcomment.h
+       src/ogg_vcomment.c
+       src/nms_adpcm.c
+       src/mpeg.c
+       src/mpeg_decode.c
+       src/mpeg_l3_encode.c
+       ${sndfile_HDRS}
+       ${CMAKE_CURRENT_BINARY_DIR}/src/config.h
        )
 
-add_library (sndfile SHARED
-       ${libsndfile_sources}
+add_library (SndFile::sndfile ALIAS sndfile)
+
+target_include_directories (sndfile
+       PUBLIC
+               $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+               $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
+               $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
+       PRIVATE
+               src
+               $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/src>
+       )
+target_link_libraries (sndfile
+       PRIVATE
+               $<$<BOOL:${LIBM_REQUIRED}>:m>
+               $<$<BOOL:${LIBM_REQUIRED}>:dl>
+               $<$<BOOL:${HAVE_EXTERNAL_XIPH_LIBS}>:Vorbis::vorbisenc>
+               $<$<AND:$<BOOL:${ENABLE_EXPERIMENTAL}>,$<BOOL:${HAVE_EXTERNAL_XIPH_LIBS}>,$<BOOL:${HAVE_SPEEX}>>:Speex::Speex>
+               $<$<BOOL:${HAVE_EXTERNAL_XIPH_LIBS}>:Opus::opus>
+               $<$<BOOL:${HAVE_MPEG}>:MPG123::libmpg123>
+               $<$<BOOL:${HAVE_MPEG}>:mp3lame::mp3lame>
+       )
+set_target_properties (sndfile PROPERTIES
+       PUBLIC_HEADER "${sndfile_HDRS}"
        )
 
-target_link_libraries (sndfile LINK_PRIVATE ${EXTERNAL_XIPH_LIBS} LINK_PUBLIC m)
+if (ENABLE_COMPATIBLE_LIBSNDFILE_NAME)
+       if (MINGW OR CYGWIN)
+               set_target_properties (sndfile PROPERTIES
+                       RUNTIME_OUTPUT_NAME "sndfile-1"
+                       )
+       else ()
+               set_target_properties (sndfile PROPERTIES
+                       RUNTIME_OUTPUT_NAME "libsndfile-1"
+                       )
+       endif ()
+endif ()
+
+if (BUILD_SHARED_LIBS)
+
+       #
+       # ABI version of library.
+       #
+
+       #
+       # Read libtool version from `configure.ac` and set libsndfile ABI version:
+       #
+       #   SNDFILE_ABI_VERSION_MAJOR
+       #   SNDFILE_ABI_VERSION_MINOR
+       #   SNDFILE_ABI_VERSION_PATCH
+       #   SNDFILE_ABI_VERSION
+       #
+       # and Mach-O current and compatibility versions:
+       #
+       #   SNDFILE_MACHO_CURRENT_VERSION
+       #   SNDFILE_MACHO_COMPATIBILITY_VERSION
+       #
+
+       include (SetupABIVersions)
+
+       setup_abi_versions()
+
+       if (WIN32)
+               set (VERSION_MAJOR ${CPACK_PACKAGE_VERSION_MAJOR})
+               set (GEN_TOOL cmake)
+               
+               set (WIN_RC_VERSION "${CPACK_PACKAGE_VERSION_MAJOR},${CPACK_PACKAGE_VERSION_MINOR},${CPACK_PACKAGE_VERSION_PATCH}")
+               set (CLEAN_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
+               set (PACKAGE_VERSION ${CPACK_PACKAGE_VERSION})
+
+               configure_file (src/version-metadata.rc.in src/version-metadata.rc @ONLY)
+               target_sources (sndfile PRIVATE ${PROJECT_BINARY_DIR}/src/version-metadata.rc)
+       endif ()
+
+
+       set_target_properties (sndfile PROPERTIES
+               SOVERSION ${SNDFILE_ABI_VERSION_MAJOR}
+               VERSION ${SNDFILE_ABI_VERSION}
+               )
+
+       if (APPLE)
+               if (NOT (CMAKE_VERSION VERSION_LESS 3.17))
+                       set_target_properties (sndfile PROPERTIES
+                               MACHO_CURRENT_VERSION ${SNDFILE_MACHO_CURRENT_VERSION}
+                               MACHO_COMPATIBILITY_VERSION ${SNDFILE_MACHO_COMPATIBILITY_VERSION}
+                               )
+               else ()
+                       message (FATAL_ERROR "Apple platform requires cmake >= 3.17 to build dylib.")
+               endif ()
+       endif ()
+
+       # Symbol files generation
+
+       if (WIN32)
+               set (SYMBOL_FILENAME "sndfile.def")
+               set (SYMBOL_OS "win32")
+       elseif ((CMAKE_SYSTEM_NAME MATCHES "Darwin") OR (CMAKE_SYSTEM_NAME MATCHES "Rhapsody"))
+               set (SYMBOL_FILENAME "Symbols.darwin")
+               set (SYMBOL_OS "darwin")
+       elseif (CMAKE_SYSTEM_NAME MATCHES "OS2")
+               set (SYMBOL_FILENAME "Symbols.os2")
+               set (SYMBOL_OS "os2")
+       elseif (UNIX)
+               set (SYMBOL_FILENAME "Symbols.gnu-binutils")
+               set (SYMBOL_OS "linux")
+       endif ()
+
+       if (DEFINED SYMBOL_OS)
+               add_custom_command (
+                       OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}
+                       COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/src/create_symbols_file.py ${SYMBOL_OS} ${SNDFILE_ABI_VERSION} > ${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}
+                       COMMENT "Generating ${SYMBOL_FILENAME}..."
+                       )
+
+               add_custom_target (GENFILES DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME})
+               if (SYMBOL_OS MATCHES "win32")
+                       target_sources (sndfile
+                               PRIVATE
+                                       ${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}
+                               )
+               elseif (SYMBOL_OS MATCHES "darwin")
+                       add_dependencies (sndfile GENFILES)
+                       if (CMAKE_VERSION VERSION_LESS 3.13)
+                               set_property (TARGET sndfile APPEND_STRING PROPERTY
+                                       LINK_FLAGS "-Wl,-exported_symbols_list -Wl,${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}"
+                                       )
+                       else ()
+                               target_link_options (sndfile PRIVATE "LINKER:-exported_symbols_list,${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}")
+                       endif()
+               elseif (SYMBOL_OS MATCHES "os")
+                       add_dependencies (sndfile GENFILES)
+                       if (CMAKE_VERSION VERSION_LESS 3.13)
+                               set_property (TARGET sndfile APPEND_STRING PROPERTY
+                                       LINK_FLAGS "-Wl,-export-symbols ${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}"
+                                       )
+                       else ()
+                               target_link_options (sndfile PRIVATE "LINKER:-export-symbols ${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}")
+                       endif()
+               elseif (UNIX)
+                       add_dependencies (sndfile GENFILES)
+                       if (CMAKE_VERSION VERSION_LESS 3.13)
+                               set_property (TARGET sndfile APPEND_STRING PROPERTY
+                                       LINK_FLAGS "-Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}"
+                                       )
+                       else ()
+                               target_link_options (sndfile PRIVATE "LINKER:--version-script,${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}")
+                       endif()
+               endif()
+       endif()
+
+endif ()
+
+#
+# Programs
+#
+
+if (BUILD_PROGRAMS)
+
+# sndfile-info
+
+       add_executable (sndfile-info
+               programs/sndfile-info.c
+               programs/common.c
+               programs/common.h
+               )
+       target_link_libraries (sndfile-info
+               PRIVATE
+                       sndfile
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+# sndfile-play
+
+       add_executable (sndfile-play
+               $<$<NOT:$<BOOL:${BEOS}>>:programs/sndfile-play.c>
+               $<$<NOT:$<BOOL:${BEOS}>>:programs/common.c>
+               $<$<NOT:$<BOOL:${BEOS}>>:programs/sndfile-play.c>
+               $<$<BOOL:${BEOS}>:programs/sndfile-play-beos.cpp>
+               )
+       target_include_directories (sndfile-play
+               PRIVATE
+                       src
+                       ${CMAKE_CURRENT_BINARY_DIR}/src
+               )
+       target_link_libraries (sndfile-play PRIVATE $<$<BOOL:${LIBM_REQUIRED}>:m>)
+       target_link_libraries (sndfile-play PRIVATE sndfile)
+       if (WIN32)
+               target_link_libraries(sndfile-play PRIVATE winmm)
+       # Maybe ALSA & Sndio are present in BeOS. They are not required
+       # so skip them anyway.
+       elseif ((NOT BEOS) AND ALSA_FOUND)
+               target_include_directories (sndfile-play PRIVATE ${ALSA_INCLUDE_DIRS})
+               target_link_libraries (sndfile-play PRIVATE ${ALSA_LIBRARIES})
+       elseif (CMAKE_SYSTEM_NAME STREQUAL "OpenBSD")
+               target_link_libraries (sndfile-play PRIVATE Sndio::Sndio)
+       endif ()
+
+# sndfile-convert
+
+       add_executable (sndfile-convert
+               programs/sndfile-convert.c
+               programs/common.c
+               programs/common.h
+               )
+       target_link_libraries (sndfile-convert PRIVATE sndfile $<$<BOOL:${LIBM_REQUIRED}>:m>)
+
+# sndfile-cmp
+
+       add_executable (sndfile-cmp
+               programs/sndfile-cmp.c
+               programs/common.c
+               programs/common.h
+               )
+       target_include_directories (sndfile-cmp
+               PUBLIC
+                       src
+                       ${CMAKE_CURRENT_BINARY_DIR}/src
+                       ${CMAKE_CURRENT_BINARY_DIR}/tests
+               )
+       target_link_libraries (sndfile-cmp PRIVATE sndfile $<$<BOOL:${LIBM_REQUIRED}>:m>)
+
+# sndfile-metadata-set
+
+       add_executable (sndfile-metadata-set
+               programs/sndfile-metadata-set.c
+               programs/common.c
+               programs/common.h
+               )
+       target_include_directories (sndfile-metadata-set
+               PUBLIC
+                       src
+                       ${CMAKE_CURRENT_BINARY_DIR}/src
+                       ${CMAKE_CURRENT_BINARY_DIR}/tests
+               )
+       target_link_libraries (sndfile-metadata-set PRIVATE sndfile $<$<BOOL:${LIBM_REQUIRED}>:m>)
+
+# sndfile-metadata-get
+
+       add_executable (sndfile-metadata-get
+               programs/sndfile-metadata-get.c
+               programs/common.c
+               programs/common.h
+               )
+       target_include_directories (sndfile-metadata-get
+               PUBLIC
+                       src
+                       ${CMAKE_CURRENT_BINARY_DIR}/src
+                       ${CMAKE_CURRENT_BINARY_DIR}/tests
+               )
+       target_link_libraries (sndfile-metadata-get PRIVATE sndfile $<$<BOOL:${LIBM_REQUIRED}>:m>)
+
+# sndfile-interleave
+
+       add_executable (sndfile-interleave
+               programs/sndfile-interleave.c
+               programs/common.c
+               programs/common.h
+               )
+       target_link_libraries (sndfile-interleave PRIVATE sndfile $<$<BOOL:${LIBM_REQUIRED}>:m>)
+
+# sndfile-deinterleave
+
+       add_executable (sndfile-deinterleave
+               programs/sndfile-deinterleave.c
+               programs/common.c
+               programs/common.h
+               )
+       target_link_libraries (sndfile-deinterleave PRIVATE sndfile $<$<BOOL:${LIBM_REQUIRED}>:m>)
+
+# sndfile-concat
+
+       add_executable (sndfile-concat
+               programs/sndfile-concat.c
+               programs/common.c
+               programs/common.h
+               )
+       target_link_libraries (sndfile-concat PRIVATE sndfile $<$<BOOL:${LIBM_REQUIRED}>:m>)
+
+# sndfile-salvage
+
+       add_executable (sndfile-salvage
+               programs/sndfile-salvage.c
+               programs/common.c
+               programs/common.h
+               )
+       target_include_directories (sndfile-salvage
+               PUBLIC
+                       src
+                       ${CMAKE_CURRENT_BINARY_DIR}/src
+                       ${CMAKE_CURRENT_BINARY_DIR}/tests
+               )
+       target_link_libraries (sndfile-salvage PRIVATE sndfile $<$<BOOL:${LIBM_REQUIRED}>:m>)
+
+       set (SNDFILE_PROGRAM_TARGETS
+               sndfile-info
+               sndfile-play
+               sndfile-convert
+               sndfile-cmp
+               sndfile-metadata-set
+               sndfile-metadata-get
+               sndfile-interleave
+               sndfile-deinterleave
+               sndfile-concat
+               sndfile-salvage
+               )
+
+       set_target_properties(${SNDFILE_PROGRAM_TARGETS} PROPERTIES FOLDER Programs)
+
+endif ()
+
+#
+# Examples
+#
+
+if (BUILD_EXAMPLES)
+
+# sndfile-to-text
+
+       add_executable (sndfile-to-text examples/sndfile-to-text.c)
+       target_link_libraries (sndfile-to-text PRIVATE sndfile)
+
+# sndfile-loopify
+
+       add_executable (sndfile-loopify examples/sndfile-loopify.c)
+       target_link_libraries (sndfile-loopify PRIVATE sndfile)
+
+# make_sine
+
+       add_executable (make_sine examples/make_sine.c)
+       target_link_libraries (make_sine
+               PRIVATE
+                       sndfile
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+# sfprocess
+
+       add_executable (sfprocess examples/sfprocess.c)
+       target_link_libraries (sfprocess
+               PRIVATE
+                       sndfile
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+# list_formats
+
+       add_executable (list_formats examples/list_formats.c)
+       target_link_libraries (list_formats
+               PRIVATE
+                       sndfile
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+# generate
+
+       add_executable (generate examples/generate.c)
+       target_link_libraries (generate PRIVATE sndfile)
+
+# sndfilehandle
+
+       add_executable (sndfilehandle examples/sndfilehandle.cc)
+       target_link_libraries (sndfilehandle PUBLIC sndfile)
+
+       set (SNDFILE_EXAMPLE_TARGETS
+               sndfile-to-text
+               sndfile-loopify
+               make_sine
+               sfprocess
+               list_formats
+               generate
+               sndfilehandle
+               )
+
+       set_target_properties(${SNDFILE_EXAMPLE_TARGETS} PROPERTIES FOLDER Examples)
 
-set_target_properties (sndfile
-       PROPERTIES
-       VERSION ${LIB_VERSION}
-       SOVERSION ${LIB_VERSION_MAJOR}
-       LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/src
+
+endif ()
+
+#
+# sndfile-regtest
+#
+
+if (BUILD_REGTEST)
+
+       add_executable (sndfile-regtest
+               regtest/sndfile-regtest.c
+               regtest/database.c
+               regtest/checksum.c
+               )
+       target_include_directories (sndfile-regtest
+               PUBLIC
+                       src
+                       ${CMAKE_CURRENT_BINARY_DIR}/src
+                       ${CMAKE_CURRENT_BINARY_DIR}/tests
+               )
+       target_link_libraries(sndfile-regtest
+               PRIVATE
+                       sndfile
+                       SQLite::SQLite3
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+endif ()
+
+#
+# Installation
+#
+
+if (ENABLE_PACKAGE_CONFIG)
+
+       if (WIN32 AND (NOT MINGW) AND (NOT CYGWIN))
+               set (CMAKE_INSTALL_PACKAGEDIR cmake) 
+        else ()
+               set (CMAKE_INSTALL_PACKAGEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/SndFile)
+        endif()
+
+        install (TARGETS ${SNDFILE_PROGRAM_TARGETS}
+               RUNTIME DESTINATION                     ${CMAKE_INSTALL_BINDIR}
+       )
+
+       install (TARGETS sndfile
+               EXPORT SndFileTargets
+               RUNTIME DESTINATION                     ${CMAKE_INSTALL_BINDIR}
+               ARCHIVE DESTINATION                     ${CMAKE_INSTALL_LIBDIR}
+               LIBRARY DESTINATION                     ${CMAKE_INSTALL_LIBDIR}
+               PUBLIC_HEADER DESTINATION       ${CMAKE_INSTALL_INCLUDEDIR}
        )
 
-#-------------------------------------------------------------------------------
-# Programs.
-
-lsf_build_program (sndfile-cmp)
-lsf_build_program (sndfile-concat)
-lsf_build_program (sndfile-convert)
-lsf_build_program (sndfile-deinterleave)
-lsf_build_program (sndfile-info)
-lsf_build_program (sndfile-interleave)
-lsf_build_program (sndfile-metadata-get)
-lsf_build_program (sndfile-metadata-set)
-lsf_build_program (sndfile-salvage)
-lsf_build_program_extra (sndfile-play asound)
-
-#-------------------------------------------------------------------------------
-# Tests.
-
-configure_file (${CMAKE_SOURCE_DIR}/tests/test_wrapper.sh.in ${CMAKE_SOURCE_DIR}/tests/test_wrapper.sh)
-configure_file (${CMAKE_SOURCE_DIR}/tests/pedantic-header-test.sh.in ${CMAKE_SOURCE_DIR}/tests/pedantic-header-test.sh)
-
-add_custom_target (check
-       COMMAND src/test_main && bash tests/test_wrapper.sh
-       DEPENDS src/test_main tests/test_wrapper.sh
+       export (EXPORT SndFileTargets NAMESPACE SndFile:: FILE ${PROJECT_BINARY_DIR}/SndFileTargets.cmake)
+
+       include (CMakePackageConfigHelpers)
+
+       if (ENABLE_EXTERNAL_LIBS)
+               set (SndFile_WITH_EXTERNAL_LIBS 1)
+       else ()
+               set (SndFile_WITH_EXTERNAL_LIBS 0)
+       endif ()
+
+       if(ENABLE_MPEG)
+               set (SndFile_WITH_MPEG 1)
+       else ()
+               set (SndFile_WITH_MPEG 0)
+       endif ()
+
+       set (INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR})
+       configure_package_config_file(cmake/SndFileConfig.cmake.in SndFileConfig.cmake
+               INSTALL_DESTINATION ${PROJECT_BINARY_DIR}
+               INSTALL_PREFIX ${PROJECT_BINARY_DIR}
+               PATH_VARS INCLUDE_INSTALL_DIR
+               )
+       configure_package_config_file(cmake/SndFileConfig.cmake.in SndFileConfig2.cmake
+               INSTALL_DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}
+               PATH_VARS INCLUDE_INSTALL_DIR
+               )
+       write_basic_package_version_file (SndFileConfigVersion.cmake COMPATIBILITY SameMajorVersion)
+
+       install(EXPORT SndFileTargets
+               NAMESPACE SndFile::
+               DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}
+               )
+       install(
+               FILES ${CMAKE_CURRENT_BINARY_DIR}/SndFileConfig2.cmake
+               RENAME SndFileConfig.cmake
+               DESTINATION     ${CMAKE_INSTALL_PACKAGEDIR}
+               )
+       install(
+               FILES
+                       ${CMAKE_CURRENT_BINARY_DIR}/SndFileConfigVersion.cmake
+               DESTINATION     ${CMAKE_INSTALL_PACKAGEDIR}
+               )
+
+else ()
+
+       install (TARGETS sndfile ${sdnfile_PROGRAMS}
+               RUNTIME DESTINATION                     ${CMAKE_INSTALL_BINDIR}
+               ARCHIVE DESTINATION                     ${CMAKE_INSTALL_LIBDIR}
+               LIBRARY DESTINATION                     ${CMAKE_INSTALL_LIBDIR}
+               PUBLIC_HEADER DESTINATION       ${CMAKE_INSTALL_INCLUDEDIR})
+
+endif ()
+
+if (INSTALL_MANPAGES)
+
+       set (man_MANS
+               man/sndfile-info.1
+               man/sndfile-play.1
+               man/sndfile-convert.1
+               man/sndfile-cmp.1
+               man/sndfile-metadata-get.1
+               man/sndfile-concat.1
+               man/sndfile-interleave.1
+               man/sndfile-salvage.1
+               )
+       install (FILES ${man_MANS} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
+       install (FILES man/sndfile-metadata-get.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 RENAME sndfile-metadata-set.1)
+       install (FILES man/sndfile-interleave.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 RENAME sndfile-deinterleave.1)
+endif ()
+
+if (ENABLE_BOW_DOCS)
+       set (HTML_BGCOLOUR "white")
+       set (HTML_FGCOLOUR "black")
+else ()
+       set (HTML_BGCOLOUR "black")
+       set (HTML_FGCOLOUR "white")
+endif ()
+set (dist_doc_DATA
+       docs/index.md
+       docs/libsndfile.jpg
+       docs/libsndfile.css
+       docs/print.css
+       docs/api.md
+       docs/command.md
+       docs/bugs.md
+       docs/formats.md
+       docs/sndfile_info.md
+       docs/new_file_type_howto.md
+       docs/win32.md
+       docs/FAQ.md
+       docs/lists.md
+       docs/embedded_files.md
+       docs/octave.md
+       docs/tutorial.md
        )
+install (FILES ${dist_doc_DATA} DESTINATION ${CMAKE_INSTALL_DOCDIR})
 
-# Tests from the src/ directory.
-set (src_test_sources
-       src/audio_detect.c
-       src/broadcast.c
-       src/cart.c
-       src/common.c
-       src/double64.c
-       src/file_io.c
-       src/float32.c
-       src/test_audio_detect.c
-       src/test_broadcast_var.c
-       src/test_cart_var.c
-       src/test_conversions.c
-       src/test_endswap.c
-       src/test_file_io.c
-       src/test_float.c
-       src/test_ima_oki_adpcm.c
-       src/test_log_printf.c
-       src/test_strncpy_crlf.c
+if (INSTALL_PKGCONFIG_MODULE)
+       install (FILES ${CMAKE_CURRENT_BINARY_DIR}/sndfile.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
+endif ()
+
+#
+# Testing
+#
+
+if (BUILD_TESTING)
+
+       enable_testing ()
+
+       include (CMakeAutoGen)
+
+       # generate tests sources from autogen templates
+       lsf_autogen (tests benchmark c)
+       lsf_autogen (tests floating_point_test c)
+       lsf_autogen (tests header_test c)
+       lsf_autogen (tests pcm_test c)
+       lsf_autogen (tests pipe_test c)
+       lsf_autogen (tests rdwr_test c)
+       lsf_autogen (tests scale_clip_test c)
+       lsf_autogen (tests utils c h)
+       lsf_autogen (tests write_read_test c)
+       lsf_autogen (src test_endswap c)
+
+       # utils static library
+       add_library(test_utils STATIC tests/utils.c)
+       target_include_directories (test_utils
+               PUBLIC
+                       src
+                       ${CMAKE_CURRENT_BINARY_DIR}/src
+                       ${CMAKE_CURRENT_BINARY_DIR}/tests
+               )
+       target_link_libraries(test_utils PRIVATE sndfile)
+
+       ### test_main
+
+       add_executable (test_main
+               src/test_main.c
+               src/test_main.h
+               src/test_conversions.c
+               src/test_float.c
+               src/test_endswap.c
+               src/test_audio_detect.c
+               src/test_log_printf.c
+               src/test_file_io.c
+               src/test_ima_oki_adpcm.c
+               src/test_strncpy_crlf.c
+               src/test_broadcast_var.c
+               src/test_cart_var.c
+               src/test_binheader_writef.c
+               src/test_nms_adpcm.c
+               )
+       target_include_directories (test_main
+               PUBLIC
+                       src
+                       ${CMAKE_CURRENT_BINARY_DIR}/src
+                       ${CMAKE_CURRENT_BINARY_DIR}/tests
+               )
+       target_link_libraries (test_main PRIVATE sndfile)
+       if (MSVC)
+               target_compile_definitions (test_main PRIVATE _USE_MATH_DEFINES)
+       endif ()
+       add_test (test_main test_main)
+
+       ### sfversion_test
+
+       add_executable (sfversion tests/sfversion.c)
+       target_include_directories (sfversion
+               PRIVATE
+                       src
+                       ${CMAKE_CURRENT_BINARY_DIR}/src
+               )
+       target_link_libraries (sfversion sndfile)
+       add_test (sfversion sfversion)
+       set_tests_properties (sfversion PROPERTIES
+               PASS_REGULAR_EXPRESSION "${PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_FULL}"
+               )
+
+       ### error_test
+
+       add_executable (error_test tests/error_test.c)
+       target_link_libraries (error_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (error_test error_test)
+
+       ### ulaw_test
+       add_executable (ulaw_test tests/ulaw_test.c)
+       target_link_libraries (ulaw_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (ulaw_test ulaw_test)
+
+       ### alaw_test
+       add_executable (alaw_test tests/alaw_test.c)
+       target_link_libraries (alaw_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (alaw_test alaw_test)
+
+       ### dwvw_test
+
+       add_executable (dwvw_test tests/dwvw_test.c)
+       target_link_libraries (dwvw_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (dwvw_test dwvw_test)
+
+       ### command_test
+
+       add_executable (command_test tests/command_test.c)
+       target_link_libraries (command_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (command_test command_test all)
+
+       ### floating_point_test
+
+       add_executable (floating_point_test
+               tests/dft_cmp.c
+               tests/floating_point_test.c
+               )
+       target_link_libraries (floating_point_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       target_include_directories (floating_point_test PRIVATE tests)
+       add_test (floating_point_test floating_point_test)
+
+       ### checksum_test
+
+       add_executable (checksum_test tests/checksum_test.c)
+       target_link_libraries (checksum_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (checksum_test checksum_test)
+
+       ### scale_clip_test
+
+       add_executable (scale_clip_test tests/scale_clip_test.c)
+       target_link_libraries (scale_clip_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (scale_clip_test scale_clip_test)
+
+       ### headerless_test
+
+       add_executable (headerless_test tests/headerless_test.c)
+       target_link_libraries (headerless_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (headerless_test headerless_test)
+
+       ### rdwr_test
+
+       add_executable (rdwr_test tests/rdwr_test.c)
+       target_link_libraries (rdwr_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (rdwr_test rdwr_test)
+
+       ### locale_test
+
+       add_executable (locale_test tests/locale_test.c)
+       target_link_libraries (locale_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (locale_test locale_test)
+
+       ### win32_ordinal_test
+
+# Disabled because we cannot test with shared sndfile library
+#      if (WIN32 AND BUILD_SHARED_LIBS)
+#              add_executable (win32_ordinal_test tests/win32_ordinal_test.c)
+#              target_link_libraries (win32_ordinal_test PRIVATE sndfile test_utils)
+#              add_test (win32_ordinal_test win32_ordinal_test)
+#      endif ()
+
+       ### cpp_test
+
+       add_executable (cpp_test tests/cpp_test.cc)
+       target_link_libraries (cpp_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (cpp_test cpp_test)
+
+       ### external_libs_test
+
+       add_executable (external_libs_test tests/external_libs_test.c)
+       target_link_libraries (external_libs_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (external_libs_test external_libs_test)
+
+       ### format_check_test
+
+       add_executable (format_check_test tests/format_check_test.c)
+       target_link_libraries (format_check_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (format_check_test format_check_test)
+
+       ### channel_test
+
+       add_executable (channel_test tests/channel_test.c)
+       target_link_libraries (channel_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (channel_test channel_test)
+
+       ### pcm_test
+
+       add_executable (pcm_test tests/pcm_test.c)
+       target_link_libraries (pcm_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       add_test (pcm_test pcm_test)
+
+       ### common test executables
+
+       add_executable (write_read_test
+               tests/generate.c
+               tests/write_read_test.c
        )
+       target_link_libraries (write_read_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       target_include_directories (write_read_test PRIVATE tests)
+
+       add_executable (lossy_comp_test tests/lossy_comp_test.c)
+       target_link_libraries (lossy_comp_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (peak_chunk_test tests/peak_chunk_test.c)
+       target_link_libraries (peak_chunk_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (header_test tests/header_test.c)
+       target_link_libraries (header_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (misc_test tests/misc_test.c)
+       target_link_libraries (misc_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (string_test tests/string_test.c)
+       target_link_libraries (string_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (multi_file_test tests/multi_file_test.c)
+       target_link_libraries (multi_file_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (aiff_rw_test tests/aiff_rw_test.c)
+       target_link_libraries (aiff_rw_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (chunk_test tests/chunk_test.c)
+       target_link_libraries (chunk_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (long_read_write_test tests/long_read_write_test.c)
+       target_link_libraries (long_read_write_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (raw_test tests/raw_test.c)
+       target_link_libraries (raw_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (compression_size_test tests/compression_size_test.c)
+       target_link_libraries (compression_size_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (ogg_test tests/ogg_test.c)
+       target_link_libraries (ogg_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (ogg_opus_test tests/ogg_opus_test.c)
+       target_link_libraries (ogg_opus_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (mpeg_test tests/mpeg_test.c)
+       target_link_libraries (mpeg_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (stdin_test tests/stdin_test.c)
+       target_link_libraries (stdin_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       set_target_properties (stdin_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY "tests")
+
+       add_executable (stdout_test tests/stdout_test.c)
+       target_link_libraries (stdout_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+       set_target_properties (stdout_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY "tests")
+
+       add_executable (stdio_test tests/stdio_test.c)
+       target_link_libraries (stdio_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (pipe_test tests/pipe_test.c)
+       target_link_libraries (pipe_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       add_executable (virtual_io_test tests/virtual_io_test.c)
+       target_link_libraries (virtual_io_test
+               PRIVATE
+                       sndfile
+                       test_utils
+                       $<$<BOOL:${LIBM_REQUIRED}>:m>
+               )
+
+       ### aiff-tests
+
+       add_test (write_read_test_aiff write_read_test aiff)
+       add_test (lossy_comp_test_aiff_ulaw lossy_comp_test aiff_ulaw)
+       add_test (lossy_comp_test_aiff_alaw lossy_comp_test aiff_alaw)
+       add_test (peak_chunk_test_aiff peak_chunk_test aiff)
+       add_test (header_test_aiff header_test aiff)
+       add_test (misc_test_aiff misc_test aiff)
+       add_test (string_test_aiff string_test aiff)
+       add_test (multi_file_test_aiff multi_file_test aiff)
+       add_test (aiff_rw_test aiff_rw_test)
+
+       ### au-tests
+
+       add_test (write_read_test_au write_read_test au)
+       add_test (lossy_comp_test_au_ulaw lossy_comp_test au_ulaw)
+       add_test (lossy_comp_test_au_alaw lossy_comp_test au_alaw)
+       add_test (header_test_au header_test au)
+       add_test (misc_test_au misc_test au)
+       add_test (multi_file_test_au multi_file_test au)
+
+       # wav-tests
+       add_test (write_read_test_wav write_read_test wav)
+       add_test (lossy_comp_test_wav_pcm lossy_comp_test wav_pcm)
+       add_test (lossy_comp_test_wav_ima lossy_comp_test wav_ima)
+       add_test (lossy_comp_test_wav_msadpcm lossy_comp_test wav_msadpcm)
+       add_test (lossy_comp_test_wav_ulaw lossy_comp_test wav_ulaw)
+       add_test (lossy_comp_test_wav_alaw lossy_comp_test wav_alaw)
+       add_test (lossy_comp_test_wav_nmsadpcm lossy_comp_test wav_nmsadpcm)
+       add_test (peak_chunk_test_wav peak_chunk_test wav)
+       add_test (header_test_wav header_test wav)
+       add_test (misc_test_wav misc_test wav)
+       add_test (string_test_wav string_test wav)
+       add_test (multi_file_test_wav multi_file_test wav)
+       add_test (chunk_test_wav chunk_test wav)
+
+       ### w64-tests
+
+       add_test (write_read_test_w64 write_read_test w64)
+       add_test (lossy_comp_test_w64_ima lossy_comp_test w64_ima)
+       add_test (lossy_comp_test_w64_msadpcm lossy_comp_test w64_msadpcm)
+       add_test (lossy_comp_test_w64_ulaw lossy_comp_test w64_ulaw)
+       add_test (lossy_comp_test_w64_alaw lossy_comp_test w64_alaw)
+       add_test (header_test_w64 header_test w64)
+       add_test (misc_test_w64 misc_test w64)
+
+       ### rf64-tests
+
+       add_test (write_read_test_rf64 write_read_test rf64)
+       add_test (header_test_rf64 header_test rf64)
+       add_test (misc_test_rf64 misc_test rf64)
+       add_test (string_test_rf64 string_test rf64)
+       add_test (peak_chunk_test_rf64 peak_chunk_test rf64)
+       add_test (chunk_test_rf64 chunk_test rf64)
+
+       ### raw-tests
+       add_test (write_read_test_raw write_read_test raw)
+       add_test (lossy_comp_test_raw_ulaw lossy_comp_test raw_ulaw)
+       add_test (lossy_comp_test_raw_alaw lossy_comp_test raw_alaw)
+       add_test (lossy_comp_test_vox_adpcm lossy_comp_test vox_adpcm)
+       add_test (raw_test raw_test)
+
+       ### paf-tests
+       add_test (write_read_test_paf write_read_test paf)
+       add_test (header_test_paf header_test paf)
+       add_test (misc_test_paf misc_test paf)
+
+       ### svx-tests
+       add_test (write_read_test_svx write_read_test svx)
+       add_test (header_test_svx header_test svx)
+       add_test (misc_test_svx misc_test svx)
+
+       ### nist-tests
+       add_test (write_read_test_nist write_read_test nist)
+       add_test (lossy_comp_test_nist_ulaw lossy_comp_test nist_ulaw)
+       add_test (lossy_comp_test_nist_alaw lossy_comp_test nist_alaw)
+       add_test (header_test_nist header_test nist)
+       add_test (misc_test_nist misc_test nist)
+
+       ### ircam-tests
+       add_test (write_read_test_ircam write_read_test ircam)
+       add_test (lossy_comp_test_ircam_ulaw lossy_comp_test ircam_ulaw)
+       add_test (lossy_comp_test_ircam_alaw lossy_comp_test ircam_alaw)
+       add_test (header_test_ircam header_test ircam)
+       add_test (misc_test_ircam misc_test ircam)
 
-lsf_build_src_test_c (test_main "${src_test_sources}")
-
-# Tests from the tests/ directory.
-
-lsf_build_test_c (aiff_rw_test "")
-lsf_build_test_c (alaw_test "")
-lsf_build_test_c (benchmark "")
-lsf_build_test_c (channel_test "")
-lsf_build_test_c (checksum_test "")
-lsf_build_test_c (chunk_test "")
-lsf_build_test_c (command_test "")
-lsf_build_test_c (compression_size_test "")
-lsf_build_test_cc (cpp_test "")
-lsf_build_test_c (dither_test "")
-lsf_build_test_c (dwvw_test "")
-lsf_build_test_c (error_test "")
-lsf_build_test_c (external_libs_test "")
-lsf_build_test_c (fix_this "")
-lsf_build_test_c (floating_point_test "tests/dft_cmp.c")
-lsf_build_test_c (format_check_test "")
-lsf_build_test_c (headerless_test "")
-lsf_build_test_c (header_test "")
-lsf_build_test_c (largefile_test "")
-lsf_build_test_c (locale_test "")
-lsf_build_test_c (lossy_comp_test "")
-lsf_build_test_c (long_read_write_test "")
-lsf_build_test_c (misc_test "")
-lsf_build_test_c (multi_file_test "")
-lsf_build_test_c (ogg_test "")
-lsf_build_test_c (pcm_test "")
-lsf_build_test_c (peak_chunk_test "")
-lsf_build_test_c (pipe_test "")
-lsf_build_test_c (raw_test "")
-lsf_build_test_c (rdwr_test "")
-lsf_build_test_c (scale_clip_test "")
-lsf_build_test_c (sfversion "")
-lsf_build_test_c (stdin_test "")
-lsf_build_test_c (stdio_test "")
-lsf_build_test_c (stdout_test "")
-lsf_build_test_c (string_test "")
-lsf_build_test_c (ulaw_test "")
-lsf_build_test_c (virtual_io_test "")
-lsf_build_test_c (win32_ordinal_test "")
-lsf_build_test_c (win32_test "")
-lsf_build_test_c (write_read_test "tests/generate.c")
+       ### voc-tests
+       add_test (write_read_test_voc write_read_test voc)
+       add_test (lossy_comp_test_voc_ulaw lossy_comp_test voc_ulaw)
+       add_test (lossy_comp_test_voc_alaw lossy_comp_test voc_alaw)
+       add_test (header_test_voc header_test voc)
+       add_test (misc_test_voc misc_test voc)
+
+       ### mat4-tests
+       add_test (write_read_test_mat4 write_read_test mat4)
+       add_test (header_test_mat4 header_test mat4)
+       add_test (misc_test_mat4 misc_test mat4)
+
+       ### mat5-tests
+       add_test (write_read_test_mat5 write_read_test mat5)
+       add_test (header_test_mat5 header_test mat5)
+       add_test (misc_test_mat5 misc_test mat5)
+
+       ### pvf-tests
+       add_test (write_read_test_pvf write_read_test pvf)
+       add_test (header_test_pvf header_test pvf)
+       add_test (misc_test_pvf misc_test pvf)
+
+       ### xi-tests
+       add_test (lossy_comp_test_xi_dpcm lossy_comp_test xi_dpcm)
+
+       ### htk-tests
+       add_test (write_read_test_htk write_read_test htk)
+       add_test (header_test_htk header_test htk)
+       add_test (misc_test_htk misc_test htk)
+
+       ### avr-tests
+       add_test (write_read_test_avr write_read_test avr)
+       add_test (header_test_avr header_test avr)
+       add_test (misc_test_avr misc_test avr)
+
+       ### sds-tests
+       add_test (write_read_test_sds write_read_test sds)
+       add_test (header_test_sds header_test sds)
+       add_test (misc_test_sds misc_test sds)
+
+       # sd2-tests
+       add_test (write_read_test_sd2 write_read_test sd2)
+
+       ### wve-tests
+       add_test (lossy_comp_test_wve lossy_comp_test wve)
+
+       ### mpc2k-tests
+       add_test (write_read_test_mpc2k write_read_test mpc2k)
+       add_test (header_test_mpc2k header_test mpc2k)
+       add_test (misc_test_mpc2k misc_test mpc2k)
+
+       add_test (string_test_flac string_test flac)
+
+       ### vorbis-tests
+       add_test (ogg_test ogg_test)
+       add_test (compression_size_test_vorbis compression_size_test vorbis)
+       add_test (lossy_comp_test_ogg_vorbis lossy_comp_test ogg_vorbis)
+       add_test (string_test_ogg string_test ogg)
+       add_test (misc_test_ogg misc_test ogg)
+
+       ### opus-tests ###
+       add_test (ogg_opus_test ogg_opus_test)
+       add_test (compression_size_test_opus compression_size_test opus)
+       add_test (lossy_comp_test_ogg_opus lossy_comp_test ogg_opus)
+       add_test (string_test_opus string_test opus)
+
+       ### mpeg-tests ###
+       add_test (mpeg_test mpeg_test)
+       add_test (compression_size_test_mpeg compression_size_test mpeg)
+
+       ### io-tests
+       add_test (stdio_test stdio_test)
+       add_test (pipe_test pipe_test)
+       add_test (virtual_io_test virtual_io_test)
+
+       set (SNDFILE_TEST_TARGETS
+               test_utils
+               test_main
+               sfversion
+               error_test
+               ulaw_test
+               alaw_test
+               dwvw_test
+               command_test
+               floating_point_test
+               checksum_test
+               scale_clip_test
+               headerless_test
+               rdwr_test
+               locale_test
+               cpp_test
+               external_libs_test
+               format_check_test
+               channel_test
+               pcm_test
+               write_read_test
+               lossy_comp_test
+               peak_chunk_test
+               header_test
+               misc_test
+               string_test
+               multi_file_test
+               aiff_rw_test
+               chunk_test
+               long_read_write_test
+               raw_test
+               compression_size_test
+               ogg_test
+               stdin_test
+               stdout_test
+               stdio_test
+               pipe_test
+               virtual_io_test
+               )
+
+#      if (WIN32 AND BUILD_SHARED_LIBS)
+#              list (APPEND SNDFILE_TEST_TARGETS win32_ordinal_test)
+#      endif ()
+
+       set_target_properties(${SNDFILE_TEST_TARGETS} PROPERTIES FOLDER Tests)
+
+endif ()
+
+if (ENABLE_CPACK)
+       if ((NOT CPACK_PACKAGE_VERSION) AND CPACK_PACKAGE_VERSION_STAGE)
+               set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_FULL}")
+       endif ()
+       include (CPack)
+endif ()