123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412 |
- cmake_minimum_required(VERSION 3.1)
- include(opus_functions.cmake)
- get_library_version(OPUS_LIBRARY_VERSION OPUS_LIBRARY_VERSION_MAJOR)
- message(STATUS "Opus library version: ${OPUS_LIBRARY_VERSION}")
- get_package_version(PACKAGE_VERSION)
- message(STATUS "Opus package version: ${PACKAGE_VERSION}")
- string(REGEX
- REPLACE "^([0-9]+.[0-9]+\\.?([0-9]+)?).*"
- "\\1"
- PROJECT_VERSION
- ${PACKAGE_VERSION})
- message(STATUS "Opus project version: ${PROJECT_VERSION}")
- project(Opus LANGUAGES C VERSION ${PROJECT_VERSION})
- include(opus_buildtype.cmake)
- option(OPUS_STACK_PROTECTOR "Use stack protection" ON)
- option(OPUS_USE_ALLOCA "Use alloca for stack arrays (on non-C99 compilers)" OFF)
- option(OPUS_CUSTOM_MODES "Enable non-Opus modes, e.g. 44.1 kHz & 2^n frames"
- OFF)
- option(OPUS_BUILD_PROGRAMS "Build programs" OFF)
- option(OPUS_FIXED_POINT
- "Compile as fixed-point (for machines without a fast enough FPU)" OFF)
- option(OPUS_ENABLE_FLOAT_API
- "Compile with the floating point API (for machines with float library"
- ON)
- option(OPUS_INSTALL_PKG_CONFIG_MODULE "Install PkgConfig module" ON)
- option(OPUS_INSTALL_CMAKE_CONFIG_MODULE "Install CMake package config module"
- ON)
- include(opus_config.cmake)
- include(opus_sources.cmake)
- include(GNUInstallDirs)
- include(CMakeDependentOption)
- include(FeatureSummary)
- if(OPUS_STACK_PROTECTOR)
- if(NOT MSVC) # GC on by default on MSVC
- check_and_set_flag(STACK_PROTECTION_STRONG -fstack-protector-strong)
- endif()
- else()
- if(MSVC)
- check_and_set_flag(BUFFER_SECURITY_CHECK /GS-)
- endif()
- endif()
- if(OPUS_CPU_X86 OR OPUS_CPU_X64)
- cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE
- "Does runtime check for SSE1 support"
- ON
- "SSE1_SUPPORTED"
- OFF)
- cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE2
- "Does runtime check for SSE2 support"
- ON
- "SSE2_SUPPORTED"
- OFF)
- cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE4_1
- "Does runtime check for SSE4.1 support"
- ON
- "SSE4_1_SUPPORTED"
- OFF)
- cmake_dependent_option(OPUS_X86_MAY_HAVE_AVX
- "Does runtime check for AVX support"
- ON
- "AVX_SUPPORTED"
- OFF)
- if(OPUS_CPU_X64) # Assume 64 bit has SSE2 support
- cmake_dependent_option(OPUS_X86_PRESUME_SSE
- "Assume target CPU has SSE1 support"
- ON
- "OPUS_X86_MAY_HAVE_SSE"
- OFF)
- cmake_dependent_option(OPUS_X86_PRESUME_SSE2
- "Assume target CPU has SSE2 support"
- ON
- "OPUS_X86_MAY_HAVE_SSE2"
- OFF)
- else()
- cmake_dependent_option(OPUS_X86_PRESUME_SSE
- "Assume target CPU has SSE1 support"
- OFF
- "OPUS_X86_MAY_HAVE_SSE"
- OFF)
- cmake_dependent_option(OPUS_X86_PRESUME_SSE2
- "Assume target CPU has SSE2 support"
- OFF
- "OPUS_X86_MAY_HAVE_SSE2"
- OFF)
- endif()
- cmake_dependent_option(OPUS_X86_PRESUME_SSE4_1
- "Assume target CPU has SSE4.1 support"
- OFF
- "OPUS_X86_MAY_HAVE_SSE4_1"
- OFF)
- cmake_dependent_option(OPUS_X86_PRESUME_AVX
- "Assume target CPU has AVX support"
- OFF
- "OPUS_X86_MAY_HAVE_AVX"
- OFF)
- endif()
- set_package_properties(Git
- PROPERTIES
- TYPE
- REQUIRED
- DESCRIPTION
- "fast, scalable, distributed revision control system"
- URL
- "https://git-scm.com/"
- PURPOSE
- "required to set up package version")
- add_feature_info(STACK_PROTECTOR OPUS_STACK_PROTECTOR "Use stack protection")
- add_feature_info(USE_ALLOCA OPUS_USE_ALLOCA
- "Use alloca for stack arrays (on non-C99 compilers)")
- add_feature_info(CUSTOM_MODES OPUS_CUSTOM_MODES
- "Enable non-Opus modes, e.g. 44.1 kHz & 2^n frames")
- add_feature_info(BUILD_PROGRAMS OPUS_BUILD_PROGRAMS "Build programs")
- add_feature_info(
- FIXED_POINT OPUS_FIXED_POINT
- "compile as fixed-point (for machines without a fast enough FPU)")
- add_feature_info(
- FLOAT_API OPUS_ENABLE_FLOAT_API
- "compile with the floating point API (for machines with float library)")
- add_feature_info(INSTALL_PKG_CONFIG_MODULE OPUS_INSTALL_PKG_CONFIG_MODULE
- "install PkgConfig module")
- add_feature_info(INSTALL_CMAKE_CONFIG_MODULE OPUS_INSTALL_CMAKE_CONFIG_MODULE
- "install CMake package config module")
- if(OPUS_CPU_X86 OR OPUS_CPU_X64)
- add_feature_info(X86_MAY_HAVE_SSE OPUS_X86_MAY_HAVE_SSE
- "does runtime check for SSE1 support")
- add_feature_info(X86_MAY_HAVE_SSE2 OPUS_X86_MAY_HAVE_SSE2
- "does runtime check for SSE2 support")
- add_feature_info(X86_MAY_HAVE_SSE4_1 OPUS_X86_MAY_HAVE_SSE4_1
- "does runtime check for SSE4_1 support")
- add_feature_info(X86_MAY_HAVE_AVX OPUS_X86_MAY_HAVE_AVX
- "does runtime check for AVX support")
- add_feature_info(X86_PRESUME_SSE OPUS_X86_PRESUME_SSE
- "assume target CPU has SSE1 support")
- add_feature_info(X86_PRESUME_SSE2 OPUS_X86_PRESUME_SSE2
- "assume target CPU has SSE2 support")
- add_feature_info(X86_PRESUME_SSE4_1 OPUS_X86_PRESUME_SSE4_1
- "assume target CPU has SSE4_1 support")
- add_feature_info(X86_PRESUME_AVX OPUS_X86_PRESUME_AVX
- "assume target CPU has AVX support")
- endif()
- feature_summary(WHAT ALL)
- add_library(opus ${opus_sources} ${opus_sources_float})
- set(Opus_PUBLIC_HEADER
- ${CMAKE_CURRENT_SOURCE_DIR}/include/opus.h
- ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_custom.h
- ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_defines.h
- ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_multistream.h
- ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_projection.h
- ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_types.h)
- set_target_properties(opus
- PROPERTIES SOVERSION
- ${OPUS_LIBRARY_VERSION_MAJOR}
- VERSION
- ${OPUS_LIBRARY_VERSION}
- PUBLIC_HEADER
- "${Opus_PUBLIC_HEADER}")
- target_include_directories(
- opus
- PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
- $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
- PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
- ${CMAKE_CURRENT_SOURCE_DIR}
- celt
- silk)
- target_link_libraries(opus PRIVATE ${OPUS_REQUIRED_LIBRARIES})
- target_compile_definitions(opus PRIVATE OPUS_BUILD ENABLE_HARDENING)
- if(NOT MSVC)
- target_compile_definitions(opus PRIVATE _FORTIFY_SOURCE=2)
- endif()
- # It is strongly recommended to uncomment one of these VAR_ARRAYS: Use C99
- # variable-length arrays for stack allocation USE_ALLOCA: Use alloca() for stack
- # allocation If none is defined, then the fallback is a non-threadsafe global
- # array
- if(OPUS_USE_ALLOCA OR MSVC)
- target_compile_definitions(opus PRIVATE USE_ALLOCA)
- else()
- target_compile_definitions(opus PRIVATE VAR_ARRAYS)
- endif()
- if(OPUS_CUSTOM_MODES)
- target_compile_definitions(opus PRIVATE CUSTOM_MODES)
- endif()
- if(BUILD_SHARED_LIBS)
- if(WIN32)
- target_compile_definitions(opus PRIVATE DLL_EXPORT)
- else()
- include(CheckCCompilerFlag)
- check_c_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY)
- if(COMPILER_HAS_HIDDEN_VISIBILITY)
- set_target_properties(opus PROPERTIES C_VISIBILITY_PRESET hidden)
- endif()
- endif()
- endif()
- add_sources_group(opus silk ${silk_sources})
- add_sources_group(opus celt ${celt_sources})
- if(OPUS_FIXED_POINT)
- add_sources_group(opus silk ${silk_sources_fixed})
- target_include_directories(opus PRIVATE silk/fixed)
- target_compile_definitions(opus PRIVATE FIXED_POINT=1)
- else()
- add_sources_group(opus silk ${silk_sources_float})
- target_include_directories(opus PRIVATE silk/float)
- endif()
- if(NOT OPUS_ENABLE_FLOAT_API)
- target_compile_definitions(opus PRIVATE DISABLE_FLOAT_API)
- endif()
- if(OPUS_X86_MAY_HAVE_SSE
- OR OPUS_X86_MAY_HAVE_SSE2
- OR OPUS_X86_MAY_HAVE_SSE4_1
- OR OPUS_X86_MAY_HAVE_AVX)
- target_compile_definitions(opus PRIVATE OPUS_HAVE_RTCD)
- endif()
- if(OPUS_X86_MAY_HAVE_SSE)
- add_sources_group(opus celt ${celt_sources_sse})
- target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE)
- endif()
- if(OPUS_X86_PRESUME_SSE)
- target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE)
- endif()
- if(OPUS_X86_MAY_HAVE_SSE2)
- add_sources_group(opus celt ${celt_sources_sse2})
- target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE2)
- endif()
- if(OPUS_X86_PRESUME_SSE2)
- target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE2)
- endif()
- if(OPUS_X86_MAY_HAVE_SSE)
- add_sources_group(opus celt ${celt_sources_sse4_1})
- add_sources_group(opus silk ${silk_sources_sse4_1})
- if(OPUS_FIXED_POINT)
- add_sources_group(opus silk ${silk_sources_fixed_sse4_1})
- endif()
- target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE4_1)
- endif()
- if(OPUS_X86_PRESUME_SSE4_1)
- target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE4_1)
- endif()
- if(CMAKE_SYSTEM_PROCESSOR MATCHES "(armv7-a)")
- add_sources_group(opus celt ${celt_sources_arm})
- endif()
- if(COMPILER_SUPPORT_NEON AND OPUS_USE_NEON)
- if(OPUS_MAY_HAVE_NEON)
- if(RUNTIME_CPU_CAPABILITY_DETECTION)
- message(STATUS "OPUS_MAY_HAVE_NEON enabling runtime detection")
- target_compile_definitions(opus PRIVATE OPUS_HAVE_RTCD)
- else()
- message(ERROR "Runtime cpu capability detection needed for MAY_HAVE_NEON")
- endif()
- # Do runtime check for NEON
- target_compile_definitions(opus
- PRIVATE
- OPUS_ARM_MAY_HAVE_NEON
- OPUS_ARM_MAY_HAVE_NEON_INTR)
- endif()
- add_sources_group(opus celt ${celt_sources_arm_neon_intr})
- add_sources_group(opus silk ${silk_sources_arm_neon_intr})
- # silk arm neon depends on main_Fix.h
- target_include_directories(opus PRIVATE silk/fixed)
- if(OPUS_FIXED_POINT)
- add_sources_group(opus silk ${silk_sources_fixed_arm_neon_intr})
- endif()
- if(OPUS_PRESUME_NEON)
- target_compile_definitions(opus
- PRIVATE
- OPUS_ARM_PRESUME_NEON
- OPUS_ARM_PRESUME_NEON_INTR)
- endif()
- endif()
- install(TARGETS opus
- EXPORT OpusTargets
- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
- PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opus)
- if(OPUS_INSTALL_PKG_CONFIG_MODULE)
- set(prefix ${CMAKE_INSTALL_PREFIX})
- set(exec_prefix ${CMAKE_INSTALL_PREFIX})
- set(libdir ${CMAKE_INSTALL_FULL_LIBDIR})
- set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR})
- set(VERSION ${OPUS_LIBRARY_VERSION})
- set(VERSION ${OPUS_LIBRARY_VERSION})
- if(HAVE_LIBM)
- set(LIBM "-lm")
- endif()
- configure_file(opus.pc.in opus.pc)
- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/opus.pc
- DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
- endif()
- if(OPUS_INSTALL_CMAKE_CONFIG_MODULE)
- set(CMAKE_INSTALL_PACKAGEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
- install(EXPORT OpusTargets
- NAMESPACE Opus::
- DESTINATION ${CMAKE_INSTALL_PACKAGEDIR})
- include(CMakePackageConfigHelpers)
- set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR})
- configure_package_config_file(OpusConfig.cmake.in
- OpusConfig.cmake
- INSTALL_DESTINATION
- ${CMAKE_INSTALL_PACKAGEDIR}
- PATH_VARS
- INCLUDE_INSTALL_DIR
- INSTALL_PREFIX
- ${CMAKE_INSTALL_PREFIX})
- write_basic_package_version_file(OpusConfigVersion.cmake
- VERSION ${PROJECT_VERSION}
- COMPATIBILITY SameMajorVersion)
- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/OpusConfig.cmake
- ${CMAKE_CURRENT_BINARY_DIR}/OpusConfigVersion.cmake
- DESTINATION ${CMAKE_INSTALL_PACKAGEDIR})
- endif()
- if(OPUS_BUILD_PROGRAMS)
- # demo
- if(OPUS_CUSTOM_MODES)
- add_executable(opus_custom_demo ${opus_custom_demo_sources})
- target_include_directories(opus_custom_demo
- PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
- target_link_libraries(opus_custom_demo PRIVATE opus)
- endif()
- add_executable(opus_demo ${opus_demo_sources})
- target_include_directories(opus_demo PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
- target_include_directories(opus_demo PRIVATE silk) # debug.h
- target_include_directories(opus_demo PRIVATE celt) # arch.h
- target_link_libraries(opus_demo PRIVATE opus)
- # compare
- add_executable(opus_compare ${opus_compare_sources})
- target_include_directories(opus_compare PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
- target_link_libraries(opus_compare PRIVATE opus)
- endif()
- if(BUILD_TESTING)
- enable_testing()
- # tests
- add_executable(test_opus_decode ${test_opus_decode_sources})
- target_include_directories(test_opus_decode
- PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
- target_link_libraries(test_opus_decode PRIVATE opus)
- if(OPUS_FIXED_POINT)
- target_compile_definitions(test_opus_decode PRIVATE DISABLE_FLOAT_API)
- endif()
- add_test(test_opus_decode test_opus_decode)
- add_executable(test_opus_padding ${test_opus_padding_sources})
- target_include_directories(test_opus_padding
- PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
- target_link_libraries(test_opus_padding PRIVATE opus)
- add_test(test_opus_padding test_opus_padding)
- if(NOT BUILD_SHARED_LIBS)
- # disable tests that depends on private API when building shared lib
- add_executable(test_opus_api ${test_opus_api_sources})
- target_include_directories(test_opus_api
- PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt)
- target_link_libraries(test_opus_api PRIVATE opus)
- if(OPUS_FIXED_POINT)
- target_compile_definitions(test_opus_api PRIVATE DISABLE_FLOAT_API)
- endif()
- add_test(test_opus_api test_opus_api)
- add_executable(test_opus_encode ${test_opus_encode_sources})
- target_include_directories(test_opus_encode
- PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt)
- target_link_libraries(test_opus_encode PRIVATE opus)
- add_test(test_opus_encode test_opus_encode)
- endif()
- endif()
|