1*a58d3d2aSXin Licmake_minimum_required(VERSION 3.1) 2*a58d3d2aSXin Lilist(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") 3*a58d3d2aSXin Li 4*a58d3d2aSXin Liinclude(OpusPackageVersion) 5*a58d3d2aSXin Liget_package_version(PACKAGE_VERSION PROJECT_VERSION) 6*a58d3d2aSXin Li 7*a58d3d2aSXin Liproject(Opus LANGUAGES C VERSION ${PROJECT_VERSION}) 8*a58d3d2aSXin Li 9*a58d3d2aSXin Liinclude(OpusFunctions) 10*a58d3d2aSXin Liinclude(OpusBuildtype) 11*a58d3d2aSXin Liinclude(OpusConfig) 12*a58d3d2aSXin Liinclude(OpusSources) 13*a58d3d2aSXin Liinclude(GNUInstallDirs) 14*a58d3d2aSXin Liinclude(CMakeDependentOption) 15*a58d3d2aSXin Liinclude(FeatureSummary) 16*a58d3d2aSXin Li 17*a58d3d2aSXin Liset(OPUS_BUILD_SHARED_LIBRARY_HELP_STR "build shared library.") 18*a58d3d2aSXin Lioption(OPUS_BUILD_SHARED_LIBRARY ${OPUS_BUILD_SHARED_LIBRARY_HELP_STR} OFF) 19*a58d3d2aSXin Liif(OPUS_BUILD_SHARED_LIBRARY OR BUILD_SHARED_LIBS OR OPUS_BUILD_FRAMEWORK) 20*a58d3d2aSXin Li # Global flag to cause add_library() to create shared libraries if on. 21*a58d3d2aSXin Li set(BUILD_SHARED_LIBS ON) 22*a58d3d2aSXin Li set(OPUS_BUILD_SHARED_LIBRARY ON) 23*a58d3d2aSXin Liendif() 24*a58d3d2aSXin Liadd_feature_info(OPUS_BUILD_SHARED_LIBRARY OPUS_BUILD_SHARED_LIBRARY ${OPUS_BUILD_SHARED_LIBRARY_HELP_STR}) 25*a58d3d2aSXin Li 26*a58d3d2aSXin Liset(OPUS_BUILD_TESTING_HELP_STR "build tests.") 27*a58d3d2aSXin Lioption(OPUS_BUILD_TESTING ${OPUS_BUILD_TESTING_HELP_STR} OFF) 28*a58d3d2aSXin Liif(OPUS_BUILD_TESTING OR BUILD_TESTING) 29*a58d3d2aSXin Li set(OPUS_BUILD_TESTING ON) 30*a58d3d2aSXin Li set(BUILD_TESTING ON) 31*a58d3d2aSXin Liendif() 32*a58d3d2aSXin Liadd_feature_info(OPUS_BUILD_TESTING OPUS_BUILD_TESTING ${OPUS_BUILD_TESTING_HELP_STR}) 33*a58d3d2aSXin Li 34*a58d3d2aSXin Liset(OPUS_CUSTOM_MODES_HELP_STR "enable non-Opus modes, e.g. 44.1 kHz & 2^n frames.") 35*a58d3d2aSXin Lioption(OPUS_CUSTOM_MODES ${OPUS_CUSTOM_MODES_HELP_STR} OFF) 36*a58d3d2aSXin Liadd_feature_info(OPUS_CUSTOM_MODES OPUS_CUSTOM_MODES ${OPUS_CUSTOM_MODES_HELP_STR}) 37*a58d3d2aSXin Li 38*a58d3d2aSXin Liset(OPUS_BUILD_PROGRAMS_HELP_STR "build programs.") 39*a58d3d2aSXin Lioption(OPUS_BUILD_PROGRAMS ${OPUS_BUILD_PROGRAMS_HELP_STR} OFF) 40*a58d3d2aSXin Liadd_feature_info(OPUS_BUILD_PROGRAMS OPUS_BUILD_PROGRAMS ${OPUS_BUILD_PROGRAMS_HELP_STR}) 41*a58d3d2aSXin Li 42*a58d3d2aSXin Liset(OPUS_DISABLE_INTRINSICS_HELP_STR "disable all intrinsics optimizations.") 43*a58d3d2aSXin Lioption(OPUS_DISABLE_INTRINSICS ${OPUS_DISABLE_INTRINSICS_HELP_STR} OFF) 44*a58d3d2aSXin Liadd_feature_info(OPUS_DISABLE_INTRINSICS OPUS_DISABLE_INTRINSICS ${OPUS_DISABLE_INTRINSICS_HELP_STR}) 45*a58d3d2aSXin Li 46*a58d3d2aSXin Liset(OPUS_FIXED_POINT_HELP_STR "compile as fixed-point (for machines without a fast enough FPU).") 47*a58d3d2aSXin Lioption(OPUS_FIXED_POINT ${OPUS_FIXED_POINT_HELP_STR} OFF) 48*a58d3d2aSXin Liadd_feature_info(OPUS_FIXED_POINT OPUS_FIXED_POINT ${OPUS_FIXED_POINT_HELP_STR}) 49*a58d3d2aSXin Li 50*a58d3d2aSXin Liset(OPUS_ENABLE_FLOAT_API_HELP_STR "compile with the floating point API (for machines with float library).") 51*a58d3d2aSXin Lioption(OPUS_ENABLE_FLOAT_API ${OPUS_ENABLE_FLOAT_API_HELP_STR} ON) 52*a58d3d2aSXin Liadd_feature_info(OPUS_ENABLE_FLOAT_API OPUS_ENABLE_FLOAT_API ${OPUS_ENABLE_FLOAT_API_HELP_STR}) 53*a58d3d2aSXin Li 54*a58d3d2aSXin Liset(OPUS_FLOAT_APPROX_HELP_STR "enable floating point approximations (Ensure your platform supports IEEE 754 before enabling).") 55*a58d3d2aSXin Lioption(OPUS_FLOAT_APPROX ${OPUS_FLOAT_APPROX_HELP_STR} OFF) 56*a58d3d2aSXin Liadd_feature_info(OPUS_FLOAT_APPROX OPUS_FLOAT_APPROX ${OPUS_FLOAT_APPROX_HELP_STR}) 57*a58d3d2aSXin Li 58*a58d3d2aSXin Liset(OPUS_ASSERTIONS_HELP_STR "additional software error checking.") 59*a58d3d2aSXin Lioption(OPUS_ASSERTIONS ${OPUS_ASSERTIONS_HELP_STR} OFF) 60*a58d3d2aSXin Liadd_feature_info(OPUS_ASSERTIONS OPUS_ASSERTIONS ${OPUS_ASSERTIONS_HELP_STR}) 61*a58d3d2aSXin Li 62*a58d3d2aSXin Liset(OPUS_HARDENING_HELP_STR "run-time checks that are cheap and safe for use in production.") 63*a58d3d2aSXin Lioption(OPUS_HARDENING ${OPUS_HARDENING_HELP_STR} ON) 64*a58d3d2aSXin Liadd_feature_info(OPUS_HARDENING OPUS_HARDENING ${OPUS_HARDENING_HELP_STR}) 65*a58d3d2aSXin Li 66*a58d3d2aSXin Liset(OPUS_FUZZING_HELP_STR "causes the encoder to make random decisions (do not use in production).") 67*a58d3d2aSXin Lioption(OPUS_FUZZING ${OPUS_FUZZING_HELP_STR} OFF) 68*a58d3d2aSXin Liadd_feature_info(OPUS_FUZZING OPUS_FUZZING ${OPUS_FUZZING_HELP_STR}) 69*a58d3d2aSXin Li 70*a58d3d2aSXin Liset(OPUS_CHECK_ASM_HELP_STR "enable bit-exactness checks between optimized and c implementations.") 71*a58d3d2aSXin Lioption(OPUS_CHECK_ASM ${OPUS_CHECK_ASM_HELP_STR} OFF) 72*a58d3d2aSXin Liadd_feature_info(OPUS_CHECK_ASM OPUS_CHECK_ASM ${OPUS_CHECK_ASM_HELP_STR}) 73*a58d3d2aSXin Li 74*a58d3d2aSXin Liset(OPUS_DNN_FLOAT_DEBUG_HELP_STR "Run DNN computations as float for debugging purposes.") 75*a58d3d2aSXin Lioption(OPUS_DNN_FLOAT_DEBUG ${OPUS_DNN_FLOAT_DEBUG_HELP_STR} OFF) 76*a58d3d2aSXin Liadd_feature_info(OPUS_DNN_FLOAT_DEBUG OPUS_DNN_FLOAT_DEBUG ${OPUS_DNN_FLOAT_DEBUG_HELP_STR}) 77*a58d3d2aSXin Li 78*a58d3d2aSXin Liset(OPUS_INSTALL_PKG_CONFIG_MODULE_HELP_STR "install pkg-config module.") 79*a58d3d2aSXin Lioption(OPUS_INSTALL_PKG_CONFIG_MODULE ${OPUS_INSTALL_PKG_CONFIG_MODULE_HELP_STR} ON) 80*a58d3d2aSXin Liadd_feature_info(OPUS_INSTALL_PKG_CONFIG_MODULE OPUS_INSTALL_PKG_CONFIG_MODULE ${OPUS_INSTALL_PKG_CONFIG_MODULE_HELP_STR}) 81*a58d3d2aSXin Li 82*a58d3d2aSXin Liset(OPUS_INSTALL_CMAKE_CONFIG_MODULE_HELP_STR "install CMake package config module.") 83*a58d3d2aSXin Lioption(OPUS_INSTALL_CMAKE_CONFIG_MODULE ${OPUS_INSTALL_CMAKE_CONFIG_MODULE_HELP_STR} ON) 84*a58d3d2aSXin Liadd_feature_info(OPUS_INSTALL_CMAKE_CONFIG_MODULE OPUS_INSTALL_CMAKE_CONFIG_MODULE ${OPUS_INSTALL_CMAKE_CONFIG_MODULE_HELP_STR}) 85*a58d3d2aSXin Li 86*a58d3d2aSXin Liset(OPUS_DRED_HELP_STR "enable DRED.") 87*a58d3d2aSXin Lioption(OPUS_DRED ${OPUS_DRED_HELP_STR} OFF) 88*a58d3d2aSXin Liadd_feature_info(OPUS_DRED OPUS_DRED ${OPUS_DRED_HELP_STR}) 89*a58d3d2aSXin Li 90*a58d3d2aSXin Liset(OPUS_OSCE_HELP_STR "enable OSCE.") 91*a58d3d2aSXin Lioption(OPUS_OSCE ${OPUS_OSCE_HELP_STR} OFF) 92*a58d3d2aSXin Liadd_feature_info(OPUS_OSCE OPUS_OSCE ${OPUS_OSCE_HELP_STR}) 93*a58d3d2aSXin Li 94*a58d3d2aSXin Liif(APPLE) 95*a58d3d2aSXin Li set(OPUS_BUILD_FRAMEWORK_HELP_STR "build Framework bundle for Apple systems.") 96*a58d3d2aSXin Li option(OPUS_BUILD_FRAMEWORK ${OPUS_BUILD_FRAMEWORK_HELP_STR} OFF) 97*a58d3d2aSXin Li add_feature_info(OPUS_BUILD_FRAMEWORK OPUS_BUILD_FRAMEWORK ${OPUS_BUILD_FRAMEWORK_HELP_STR}) 98*a58d3d2aSXin Liendif() 99*a58d3d2aSXin Li 100*a58d3d2aSXin Liset(OPUS_FIXED_POINT_DEBUG_HELP_STR "debug fixed-point implementation.") 101*a58d3d2aSXin Licmake_dependent_option(OPUS_FIXED_POINT_DEBUG 102*a58d3d2aSXin Li ${OPUS_FIXED_POINT_DEBUG_HELP_STR} 103*a58d3d2aSXin Li ON 104*a58d3d2aSXin Li "OPUS_FIXED_POINT; OPUS_FIXED_POINT_DEBUG" 105*a58d3d2aSXin Li OFF) 106*a58d3d2aSXin Liadd_feature_info(OPUS_FIXED_POINT_DEBUG OPUS_FIXED_POINT_DEBUG ${OPUS_FIXED_POINT_DEBUG_HELP_STR}) 107*a58d3d2aSXin Li 108*a58d3d2aSXin Liset(OPUS_VAR_ARRAYS_HELP_STR "use variable length arrays for stack arrays.") 109*a58d3d2aSXin Licmake_dependent_option(OPUS_VAR_ARRAYS 110*a58d3d2aSXin Li ${OPUS_VAR_ARRAYS_HELP_STR} 111*a58d3d2aSXin Li ON 112*a58d3d2aSXin Li "VLA_SUPPORTED; NOT OPUS_USE_ALLOCA; NOT OPUS_NONTHREADSAFE_PSEUDOSTACK" 113*a58d3d2aSXin Li OFF) 114*a58d3d2aSXin Liadd_feature_info(OPUS_VAR_ARRAYS OPUS_VAR_ARRAYS ${OPUS_VAR_ARRAYS_HELP_STR}) 115*a58d3d2aSXin Li 116*a58d3d2aSXin Liset(OPUS_USE_ALLOCA_HELP_STR "use alloca for stack arrays (on non-C99 compilers).") 117*a58d3d2aSXin Licmake_dependent_option(OPUS_USE_ALLOCA 118*a58d3d2aSXin Li ${OPUS_USE_ALLOCA_HELP_STR} 119*a58d3d2aSXin Li ON 120*a58d3d2aSXin Li "USE_ALLOCA_SUPPORTED; NOT OPUS_VAR_ARRAYS; NOT OPUS_NONTHREADSAFE_PSEUDOSTACK" 121*a58d3d2aSXin Li OFF) 122*a58d3d2aSXin Liadd_feature_info(OPUS_USE_ALLOCA OPUS_USE_ALLOCA ${OPUS_USE_ALLOCA_HELP_STR}) 123*a58d3d2aSXin Li 124*a58d3d2aSXin Liset(OPUS_NONTHREADSAFE_PSEUDOSTACK_HELP_STR "use a non threadsafe pseudostack when neither variable length arrays or alloca is supported.") 125*a58d3d2aSXin Licmake_dependent_option(OPUS_NONTHREADSAFE_PSEUDOSTACK 126*a58d3d2aSXin Li ${OPUS_NONTHREADSAFE_PSEUDOSTACK_HELP_STR} 127*a58d3d2aSXin Li ON 128*a58d3d2aSXin Li "NOT OPUS_VAR_ARRAYS; NOT OPUS_USE_ALLOCA" 129*a58d3d2aSXin Li OFF) 130*a58d3d2aSXin Liadd_feature_info(OPUS_NONTHREADSAFE_PSEUDOSTACK OPUS_NONTHREADSAFE_PSEUDOSTACK ${OPUS_NONTHREADSAFE_PSEUDOSTACK_HELP_STR}) 131*a58d3d2aSXin Li 132*a58d3d2aSXin Liset(OPUS_FAST_MATH_HELP_STR "enable fast math (unsupported and discouraged use, as code is not well tested with this build option).") 133*a58d3d2aSXin Licmake_dependent_option(OPUS_FAST_MATH 134*a58d3d2aSXin Li ${OPUS_FAST_MATH_HELP_STR} 135*a58d3d2aSXin Li ON 136*a58d3d2aSXin Li "OPUS_FLOAT_APPROX; OPUS_FAST_MATH; FAST_MATH_SUPPORTED" 137*a58d3d2aSXin Li OFF) 138*a58d3d2aSXin Liadd_feature_info(OPUS_FAST_MATH OPUS_FAST_MATH ${OPUS_FAST_MATH_HELP_STR}) 139*a58d3d2aSXin Li 140*a58d3d2aSXin Liset(OPUS_STACK_PROTECTOR_HELP_STR "use stack protection.") 141*a58d3d2aSXin Licmake_dependent_option(OPUS_STACK_PROTECTOR 142*a58d3d2aSXin Li ${OPUS_STACK_PROTECTOR_HELP_STR} 143*a58d3d2aSXin Li ON 144*a58d3d2aSXin Li "STACK_PROTECTOR_SUPPORTED" 145*a58d3d2aSXin Li OFF) 146*a58d3d2aSXin Liadd_feature_info(OPUS_STACK_PROTECTOR OPUS_STACK_PROTECTOR ${OPUS_STACK_PROTECTOR_HELP_STR}) 147*a58d3d2aSXin Li 148*a58d3d2aSXin Liif(NOT MSVC) 149*a58d3d2aSXin Li set(OPUS_FORTIFY_SOURCE_HELP_STR "add protection against buffer overflows.") 150*a58d3d2aSXin Li cmake_dependent_option(OPUS_FORTIFY_SOURCE 151*a58d3d2aSXin Li ${OPUS_FORTIFY_SOURCE_HELP_STR} 152*a58d3d2aSXin Li ON 153*a58d3d2aSXin Li "FORTIFY_SOURCE_SUPPORTED" 154*a58d3d2aSXin Li OFF) 155*a58d3d2aSXin Li add_feature_info(OPUS_FORTIFY_SOURCE OPUS_FORTIFY_SOURCE ${OPUS_FORTIFY_SOURCE_HELP_STR}) 156*a58d3d2aSXin Liendif() 157*a58d3d2aSXin Li 158*a58d3d2aSXin Liif(MINGW AND (OPUS_FORTIFY_SOURCE OR OPUS_STACK_PROTECTOR)) 159*a58d3d2aSXin Li # ssp lib is needed for security features for MINGW 160*a58d3d2aSXin Li list(APPEND OPUS_REQUIRED_LIBRARIES ssp) 161*a58d3d2aSXin Liendif() 162*a58d3d2aSXin Li 163*a58d3d2aSXin Liif(OPUS_CPU_X86 OR OPUS_CPU_X64) 164*a58d3d2aSXin Li set(OPUS_X86_MAY_HAVE_SSE_HELP_STR "does runtime check for SSE1 support.") 165*a58d3d2aSXin Li cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE 166*a58d3d2aSXin Li ${OPUS_X86_MAY_HAVE_SSE_HELP_STR} 167*a58d3d2aSXin Li ON 168*a58d3d2aSXin Li "SSE1_SUPPORTED; NOT OPUS_DISABLE_INTRINSICS" 169*a58d3d2aSXin Li OFF) 170*a58d3d2aSXin Li add_feature_info(OPUS_X86_MAY_HAVE_SSE OPUS_X86_MAY_HAVE_SSE ${OPUS_X86_MAY_HAVE_SSE_HELP_STR}) 171*a58d3d2aSXin Li 172*a58d3d2aSXin Li set(OPUS_X86_MAY_HAVE_SSE2_HELP_STR "does runtime check for SSE2 support.") 173*a58d3d2aSXin Li cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE2 174*a58d3d2aSXin Li ${OPUS_X86_MAY_HAVE_SSE2_HELP_STR} 175*a58d3d2aSXin Li ON 176*a58d3d2aSXin Li "SSE2_SUPPORTED; NOT OPUS_DISABLE_INTRINSICS" 177*a58d3d2aSXin Li OFF) 178*a58d3d2aSXin Li add_feature_info(OPUS_X86_MAY_HAVE_SSE2 OPUS_X86_MAY_HAVE_SSE2 ${OPUS_X86_MAY_HAVE_SSE2_HELP_STR}) 179*a58d3d2aSXin Li 180*a58d3d2aSXin Li set(OPUS_X86_MAY_HAVE_SSE4_1_HELP_STR "does runtime check for SSE4.1 support.") 181*a58d3d2aSXin Li cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE4_1 182*a58d3d2aSXin Li ${OPUS_X86_MAY_HAVE_SSE4_1_HELP_STR} 183*a58d3d2aSXin Li ON 184*a58d3d2aSXin Li "SSE4_1_SUPPORTED; NOT OPUS_DISABLE_INTRINSICS" 185*a58d3d2aSXin Li OFF) 186*a58d3d2aSXin Li add_feature_info(OPUS_X86_MAY_HAVE_SSE4_1 OPUS_X86_MAY_HAVE_SSE4_1 ${OPUS_X86_MAY_HAVE_SSE4_1_HELP_STR}) 187*a58d3d2aSXin Li 188*a58d3d2aSXin Li set(OPUS_X86_MAY_HAVE_AVX2_HELP_STR "does runtime check for AVX FMA AVX2 support.") 189*a58d3d2aSXin Li cmake_dependent_option(OPUS_X86_MAY_HAVE_AVX2 190*a58d3d2aSXin Li ${OPUS_X86_MAY_HAVE_AVX2_HELP_STR} 191*a58d3d2aSXin Li ON 192*a58d3d2aSXin Li "AVX2_SUPPORTED; NOT OPUS_DISABLE_INTRINSICS" 193*a58d3d2aSXin Li OFF) 194*a58d3d2aSXin Li add_feature_info(OPUS_X86_MAY_HAVE_AVX2 OPUS_X86_MAY_HAVE_AVX2 ${OPUS_X86_MAY_HAVE_AVX2_HELP_STR}) 195*a58d3d2aSXin Li 196*a58d3d2aSXin Li # PRESUME depends on MAY HAVE, but PRESUME will override runtime detection 197*a58d3d2aSXin Li set(OPUS_X86_PRESUME_SSE_HELP_STR "assume target CPU has SSE1 support (override runtime check).") 198*a58d3d2aSXin Li set(OPUS_X86_PRESUME_SSE2_HELP_STR "assume target CPU has SSE2 support (override runtime check).") 199*a58d3d2aSXin Li if(OPUS_CPU_X64) # Assume x86_64 has up to SSE2 support 200*a58d3d2aSXin Li cmake_dependent_option(OPUS_X86_PRESUME_SSE 201*a58d3d2aSXin Li ${OPUS_X86_PRESUME_SSE_HELP_STR} 202*a58d3d2aSXin Li ON 203*a58d3d2aSXin Li "OPUS_X86_MAY_HAVE_SSE; NOT OPUS_DISABLE_INTRINSICS" 204*a58d3d2aSXin Li OFF) 205*a58d3d2aSXin Li 206*a58d3d2aSXin Li cmake_dependent_option(OPUS_X86_PRESUME_SSE2 207*a58d3d2aSXin Li ${OPUS_X86_PRESUME_SSE2_HELP_STR} 208*a58d3d2aSXin Li ON 209*a58d3d2aSXin Li "OPUS_X86_MAY_HAVE_SSE2; NOT OPUS_DISABLE_INTRINSICS" 210*a58d3d2aSXin Li OFF) 211*a58d3d2aSXin Li else() 212*a58d3d2aSXin Li cmake_dependent_option(OPUS_X86_PRESUME_SSE 213*a58d3d2aSXin Li ${OPUS_X86_PRESUME_SSE_HELP_STR} 214*a58d3d2aSXin Li OFF 215*a58d3d2aSXin Li "OPUS_X86_MAY_HAVE_SSE; NOT OPUS_DISABLE_INTRINSICS" 216*a58d3d2aSXin Li OFF) 217*a58d3d2aSXin Li 218*a58d3d2aSXin Li cmake_dependent_option(OPUS_X86_PRESUME_SSE2 219*a58d3d2aSXin Li ${OPUS_X86_PRESUME_SSE2_HELP_STR} 220*a58d3d2aSXin Li OFF 221*a58d3d2aSXin Li "OPUS_X86_MAY_HAVE_SSE2; NOT OPUS_DISABLE_INTRINSICS" 222*a58d3d2aSXin Li OFF) 223*a58d3d2aSXin Li endif() 224*a58d3d2aSXin Li add_feature_info(OPUS_X86_PRESUME_SSE OPUS_X86_PRESUME_SSE ${OPUS_X86_PRESUME_SSE_HELP_STR}) 225*a58d3d2aSXin Li add_feature_info(OPUS_X86_PRESUME_SSE2 OPUS_X86_PRESUME_SSE2 ${OPUS_X86_PRESUME_SSE2_HELP_STR}) 226*a58d3d2aSXin Li 227*a58d3d2aSXin Li set(OPUS_X86_PRESUME_SSE4_1_HELP_STR "assume target CPU has SSE4.1 support (override runtime check).") 228*a58d3d2aSXin Li cmake_dependent_option(OPUS_X86_PRESUME_SSE4_1 229*a58d3d2aSXin Li ${OPUS_X86_PRESUME_SSE4_1_HELP_STR} 230*a58d3d2aSXin Li OFF 231*a58d3d2aSXin Li "OPUS_X86_MAY_HAVE_SSE4_1; NOT OPUS_DISABLE_INTRINSICS" 232*a58d3d2aSXin Li OFF) 233*a58d3d2aSXin Li add_feature_info(OPUS_X86_PRESUME_SSE4_1 OPUS_X86_PRESUME_SSE4_1 ${OPUS_X86_PRESUME_SSE4_1_HELP_STR}) 234*a58d3d2aSXin Li 235*a58d3d2aSXin Li set(OPUS_X86_PRESUME_AVX2_HELP_STR "assume target CPU has AVX FMA AVX2 support (override runtime check).") 236*a58d3d2aSXin Li cmake_dependent_option(OPUS_X86_PRESUME_AVX2 237*a58d3d2aSXin Li ${OPUS_X86_PRESUME_AVX2_HELP_STR} 238*a58d3d2aSXin Li OFF 239*a58d3d2aSXin Li "OPUS_X86_MAY_HAVE_AVX2; NOT OPUS_DISABLE_INTRINSICS" 240*a58d3d2aSXin Li OFF) 241*a58d3d2aSXin Li add_feature_info(OPUS_X86_PRESUME_AVX2 OPUS_X86_PRESUME_AVX2 ${OPUS_X86_PRESUME_AVX2_HELP_STR}) 242*a58d3d2aSXin Liendif() 243*a58d3d2aSXin Li 244*a58d3d2aSXin Lifeature_summary(WHAT ALL) 245*a58d3d2aSXin Li 246*a58d3d2aSXin Liset_package_properties(Git 247*a58d3d2aSXin Li PROPERTIES 248*a58d3d2aSXin Li TYPE 249*a58d3d2aSXin Li REQUIRED 250*a58d3d2aSXin Li DESCRIPTION 251*a58d3d2aSXin Li "fast, scalable, distributed revision control system" 252*a58d3d2aSXin Li URL 253*a58d3d2aSXin Li "https://git-scm.com/" 254*a58d3d2aSXin Li PURPOSE 255*a58d3d2aSXin Li "required to set up package version") 256*a58d3d2aSXin Li 257*a58d3d2aSXin Liset(Opus_PUBLIC_HEADER 258*a58d3d2aSXin Li ${CMAKE_CURRENT_SOURCE_DIR}/include/opus.h 259*a58d3d2aSXin Li ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_defines.h 260*a58d3d2aSXin Li ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_multistream.h 261*a58d3d2aSXin Li ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_projection.h 262*a58d3d2aSXin Li ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_types.h) 263*a58d3d2aSXin Li 264*a58d3d2aSXin Liif(OPUS_CUSTOM_MODES) 265*a58d3d2aSXin Li list(APPEND Opus_PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_custom.h) 266*a58d3d2aSXin Liendif() 267*a58d3d2aSXin Li 268*a58d3d2aSXin Liadd_library(opus ${opus_headers} ${opus_sources} ${opus_sources_float} ${Opus_PUBLIC_HEADER}) 269*a58d3d2aSXin Liadd_library(Opus::opus ALIAS opus) 270*a58d3d2aSXin Li 271*a58d3d2aSXin Liget_library_version(OPUS_LIBRARY_VERSION OPUS_LIBRARY_VERSION_MAJOR) 272*a58d3d2aSXin Limessage(DEBUG "Opus library version: ${OPUS_LIBRARY_VERSION}") 273*a58d3d2aSXin Li 274*a58d3d2aSXin Liset_target_properties(opus 275*a58d3d2aSXin Li PROPERTIES SOVERSION 276*a58d3d2aSXin Li ${OPUS_LIBRARY_VERSION_MAJOR} 277*a58d3d2aSXin Li VERSION 278*a58d3d2aSXin Li ${OPUS_LIBRARY_VERSION} 279*a58d3d2aSXin Li PUBLIC_HEADER 280*a58d3d2aSXin Li "${Opus_PUBLIC_HEADER}") 281*a58d3d2aSXin Li 282*a58d3d2aSXin Litarget_include_directories( 283*a58d3d2aSXin Li opus 284*a58d3d2aSXin Li PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> 285*a58d3d2aSXin Li $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> 286*a58d3d2aSXin Li $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/opus> 287*a58d3d2aSXin Li PRIVATE ${CMAKE_CURRENT_BINARY_DIR} 288*a58d3d2aSXin Li ${CMAKE_CURRENT_SOURCE_DIR} 289*a58d3d2aSXin Li ${CMAKE_CURRENT_SOURCE_DIR}/dnn 290*a58d3d2aSXin Li celt 291*a58d3d2aSXin Li silk) 292*a58d3d2aSXin Li 293*a58d3d2aSXin Litarget_link_libraries(opus PRIVATE ${OPUS_REQUIRED_LIBRARIES}) 294*a58d3d2aSXin Litarget_compile_definitions(opus PRIVATE OPUS_BUILD) 295*a58d3d2aSXin Li 296*a58d3d2aSXin Liif(OPUS_FIXED_POINT_DEBUG) 297*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE FIXED_DEBUG) 298*a58d3d2aSXin Liendif() 299*a58d3d2aSXin Li 300*a58d3d2aSXin Liif(OPUS_FORTIFY_SOURCE AND NOT MSVC) 301*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE 302*a58d3d2aSXin Li $<$<NOT:$<CONFIG:debug>>:_FORTIFY_SOURCE=2>) 303*a58d3d2aSXin Liendif() 304*a58d3d2aSXin Li 305*a58d3d2aSXin Liif(OPUS_FLOAT_APPROX) 306*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE FLOAT_APPROX) 307*a58d3d2aSXin Liendif() 308*a58d3d2aSXin Li 309*a58d3d2aSXin Liif(OPUS_ASSERTIONS) 310*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE ENABLE_ASSERTIONS) 311*a58d3d2aSXin Liendif() 312*a58d3d2aSXin Li 313*a58d3d2aSXin Liif(OPUS_HARDENING) 314*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE ENABLE_HARDENING) 315*a58d3d2aSXin Liendif() 316*a58d3d2aSXin Li 317*a58d3d2aSXin Liif(OPUS_FUZZING) 318*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE FUZZING) 319*a58d3d2aSXin Liendif() 320*a58d3d2aSXin Li 321*a58d3d2aSXin Liif(OPUS_CHECK_ASM) 322*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE OPUS_CHECK_ASM) 323*a58d3d2aSXin Liendif() 324*a58d3d2aSXin Li 325*a58d3d2aSXin Liif(NOT OPUS_DNN_FLOAT_DEBUG) 326*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE DISABLE_DEBUG_FLOAT) 327*a58d3d2aSXin Liendif() 328*a58d3d2aSXin Li 329*a58d3d2aSXin Liif(OPUS_VAR_ARRAYS) 330*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE VAR_ARRAYS) 331*a58d3d2aSXin Lielseif(OPUS_USE_ALLOCA) 332*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE USE_ALLOCA) 333*a58d3d2aSXin Lielseif(OPUS_NONTHREADSAFE_PSEUDOSTACK) 334*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE NONTHREADSAFE_PSEUDOSTACK) 335*a58d3d2aSXin Lielse() 336*a58d3d2aSXin Li message(ERROR "Need to set a define for stack allocation") 337*a58d3d2aSXin Liendif() 338*a58d3d2aSXin Li 339*a58d3d2aSXin Liif(OPUS_CUSTOM_MODES) 340*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE CUSTOM_MODES) 341*a58d3d2aSXin Liendif() 342*a58d3d2aSXin Li 343*a58d3d2aSXin Liif(OPUS_FAST_MATH) 344*a58d3d2aSXin Li if(MSVC) 345*a58d3d2aSXin Li target_compile_options(opus PRIVATE /fp:fast) 346*a58d3d2aSXin Li else() 347*a58d3d2aSXin Li target_compile_options(opus PRIVATE -ffast-math) 348*a58d3d2aSXin Li endif() 349*a58d3d2aSXin Liendif() 350*a58d3d2aSXin Li 351*a58d3d2aSXin Liif(OPUS_STACK_PROTECTOR) 352*a58d3d2aSXin Li if(MSVC) 353*a58d3d2aSXin Li target_compile_options(opus PRIVATE /GS) 354*a58d3d2aSXin Li else() 355*a58d3d2aSXin Li target_compile_options(opus PRIVATE -fstack-protector-strong) 356*a58d3d2aSXin Li endif() 357*a58d3d2aSXin Lielseif(STACK_PROTECTOR_DISABLED_SUPPORTED) 358*a58d3d2aSXin Li target_compile_options(opus PRIVATE /GS-) 359*a58d3d2aSXin Liendif() 360*a58d3d2aSXin Li 361*a58d3d2aSXin Liif(BUILD_SHARED_LIBS) 362*a58d3d2aSXin Li if(WIN32) 363*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE DLL_EXPORT) 364*a58d3d2aSXin Li elseif(HIDDEN_VISIBILITY_SUPPORTED) 365*a58d3d2aSXin Li set_target_properties(opus PROPERTIES C_VISIBILITY_PRESET hidden) 366*a58d3d2aSXin Li endif() 367*a58d3d2aSXin Liendif() 368*a58d3d2aSXin Li 369*a58d3d2aSXin Liadd_sources_group(opus silk ${silk_headers} ${silk_sources}) 370*a58d3d2aSXin Liadd_sources_group(opus celt ${celt_headers} ${celt_sources}) 371*a58d3d2aSXin Li 372*a58d3d2aSXin Liif(OPUS_FIXED_POINT) 373*a58d3d2aSXin Li add_sources_group(opus silk ${silk_sources_fixed}) 374*a58d3d2aSXin Li target_include_directories(opus PRIVATE silk/fixed) 375*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE FIXED_POINT=1) 376*a58d3d2aSXin Lielse() 377*a58d3d2aSXin Li add_sources_group(opus silk ${silk_sources_float}) 378*a58d3d2aSXin Li target_include_directories(opus PRIVATE silk/float) 379*a58d3d2aSXin Liendif() 380*a58d3d2aSXin Li 381*a58d3d2aSXin Liif(NOT OPUS_ENABLE_FLOAT_API) 382*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE DISABLE_FLOAT_API) 383*a58d3d2aSXin Liendif() 384*a58d3d2aSXin Li 385*a58d3d2aSXin Liif (OPUS_DEEP_PLC OR OPUS_DRED OR OPUS_OSCE) 386*a58d3d2aSXin Li add_sources_group(opus lpcnet ${deep_plc_headers} ${deep_plc_sources}) 387*a58d3d2aSXin Li set(OPUS_DNN TRUE) 388*a58d3d2aSXin Lielse() 389*a58d3d2aSXin Li set(OPUS_DNN FALSE) 390*a58d3d2aSXin Liendif() 391*a58d3d2aSXin Li 392*a58d3d2aSXin Liif (OPUS_DNN) 393*a58d3d2aSXin Li add_sources_group(opus lpcnet ${deep_plc_headers} ${deep_plc_sources}) 394*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE ENABLE_DEEP_PLC) 395*a58d3d2aSXin Liendif() 396*a58d3d2aSXin Li 397*a58d3d2aSXin Liif (OPUS_DRED) 398*a58d3d2aSXin Li add_sources_group(opus lpcnet ${dred_headers} ${dred_sources}) 399*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE ENABLE_DRED) 400*a58d3d2aSXin Liendif() 401*a58d3d2aSXin Li 402*a58d3d2aSXin Liif (OPUS_OSCE) 403*a58d3d2aSXin Li add_sources_group(opus lpcnet ${osce_headers} ${osce_sources}) 404*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE ENABLE_OSCE) 405*a58d3d2aSXin Liendif() 406*a58d3d2aSXin Li 407*a58d3d2aSXin Liif(NOT OPUS_DISABLE_INTRINSICS) 408*a58d3d2aSXin Li if(((OPUS_X86_MAY_HAVE_SSE AND NOT OPUS_X86_PRESUME_SSE) OR 409*a58d3d2aSXin Li (OPUS_X86_MAY_HAVE_SSE2 AND NOT OPUS_X86_PRESUME_SSE2) OR 410*a58d3d2aSXin Li (OPUS_X86_MAY_HAVE_SSE4_1 AND NOT OPUS_X86_PRESUME_SSE4_1) OR 411*a58d3d2aSXin Li (OPUS_X86_MAY_HAVE_AVX2 AND NOT OPUS_X86_PRESUME_AVX2)) AND 412*a58d3d2aSXin Li RUNTIME_CPU_CAPABILITY_DETECTION) 413*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE OPUS_HAVE_RTCD) 414*a58d3d2aSXin Li if(NOT MSVC) 415*a58d3d2aSXin Li if(CPU_INFO_BY_ASM_SUPPORTED) 416*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE CPU_INFO_BY_ASM) 417*a58d3d2aSXin Li elseif(CPU_INFO_BY_C_SUPPORTED) 418*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE CPU_INFO_BY_C) 419*a58d3d2aSXin Li else() 420*a58d3d2aSXin Li message(ERROR "Runtime cpu capability detection is enabled while CPU_INFO is not supported") 421*a58d3d2aSXin Li endif() 422*a58d3d2aSXin Li endif() 423*a58d3d2aSXin Li add_sources_group(opus celt ${celt_sources_x86_rtcd}) 424*a58d3d2aSXin Li add_sources_group(opus silk ${silk_sources_x86_rtcd}) 425*a58d3d2aSXin Li if (OPUS_DNN) 426*a58d3d2aSXin Li add_sources_group(opus lpcnet ${dnn_sources_x86_rtcd}) 427*a58d3d2aSXin Li endif() 428*a58d3d2aSXin Li endif() 429*a58d3d2aSXin Li 430*a58d3d2aSXin Li if(SSE1_SUPPORTED) 431*a58d3d2aSXin Li if(OPUS_X86_MAY_HAVE_SSE) 432*a58d3d2aSXin Li add_sources_group(opus celt ${celt_sources_sse}) 433*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE) 434*a58d3d2aSXin Li if(NOT MSVC) 435*a58d3d2aSXin Li set_source_files_properties(${celt_sources_sse} PROPERTIES COMPILE_FLAGS -msse) 436*a58d3d2aSXin Li endif() 437*a58d3d2aSXin Li endif() 438*a58d3d2aSXin Li if(OPUS_X86_PRESUME_SSE) 439*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE) 440*a58d3d2aSXin Li if(NOT MSVC) 441*a58d3d2aSXin Li target_compile_options(opus PRIVATE -msse) 442*a58d3d2aSXin Li endif() 443*a58d3d2aSXin Li endif() 444*a58d3d2aSXin Li endif() 445*a58d3d2aSXin Li 446*a58d3d2aSXin Li if(SSE2_SUPPORTED) 447*a58d3d2aSXin Li if(OPUS_X86_MAY_HAVE_SSE2) 448*a58d3d2aSXin Li add_sources_group(opus celt ${celt_sources_sse2}) 449*a58d3d2aSXin Li if (OPUS_DNN) 450*a58d3d2aSXin Li add_sources_group(opus lpcnet ${dnn_sources_sse2}) 451*a58d3d2aSXin Li endif() 452*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE2) 453*a58d3d2aSXin Li if(NOT MSVC) 454*a58d3d2aSXin Li set_source_files_properties(${celt_sources_sse2} ${dnn_sources_sse2} PROPERTIES COMPILE_FLAGS -msse2) 455*a58d3d2aSXin Li endif() 456*a58d3d2aSXin Li endif() 457*a58d3d2aSXin Li if(OPUS_X86_PRESUME_SSE2) 458*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE2) 459*a58d3d2aSXin Li if(NOT MSVC) 460*a58d3d2aSXin Li target_compile_options(opus PRIVATE -msse2) 461*a58d3d2aSXin Li endif() 462*a58d3d2aSXin Li endif() 463*a58d3d2aSXin Li endif() 464*a58d3d2aSXin Li 465*a58d3d2aSXin Li if(SSE4_1_SUPPORTED) 466*a58d3d2aSXin Li if(OPUS_X86_MAY_HAVE_SSE4_1) 467*a58d3d2aSXin Li add_sources_group(opus celt ${celt_sources_sse4_1}) 468*a58d3d2aSXin Li add_sources_group(opus silk ${silk_sources_sse4_1}) 469*a58d3d2aSXin Li if (OPUS_DNN) 470*a58d3d2aSXin Li add_sources_group(opus lpcnet ${dnn_sources_sse4_1}) 471*a58d3d2aSXin Li endif() 472*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE4_1) 473*a58d3d2aSXin Li if(NOT MSVC) 474*a58d3d2aSXin Li set_source_files_properties(${celt_sources_sse4_1} ${silk_sources_sse4_1} ${dnn_sources_sse4_1} PROPERTIES COMPILE_FLAGS -msse4.1) 475*a58d3d2aSXin Li endif() 476*a58d3d2aSXin Li 477*a58d3d2aSXin Li if(OPUS_FIXED_POINT) 478*a58d3d2aSXin Li add_sources_group(opus silk ${silk_sources_fixed_sse4_1}) 479*a58d3d2aSXin Li if(NOT MSVC) 480*a58d3d2aSXin Li set_source_files_properties(${silk_sources_fixed_sse4_1} PROPERTIES COMPILE_FLAGS -msse4.1) 481*a58d3d2aSXin Li endif() 482*a58d3d2aSXin Li endif() 483*a58d3d2aSXin Li endif() 484*a58d3d2aSXin Li if(OPUS_X86_PRESUME_SSE4_1) 485*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE4_1) 486*a58d3d2aSXin Li if(NOT MSVC) 487*a58d3d2aSXin Li target_compile_options(opus PRIVATE -msse4.1) 488*a58d3d2aSXin Li endif() 489*a58d3d2aSXin Li endif() 490*a58d3d2aSXin Li endif() 491*a58d3d2aSXin Li 492*a58d3d2aSXin Li if(AVX2_SUPPORTED) 493*a58d3d2aSXin Li if(OPUS_X86_MAY_HAVE_AVX2) 494*a58d3d2aSXin Li add_sources_group(opus celt ${celt_sources_avx2}) 495*a58d3d2aSXin Li add_sources_group(opus silk ${silk_sources_avx2}) 496*a58d3d2aSXin Li add_sources_group(opus silk ${silk_sources_float_avx2}) 497*a58d3d2aSXin Li if (OPUS_DNN) 498*a58d3d2aSXin Li add_sources_group(opus lpcnet ${dnn_sources_avx2}) 499*a58d3d2aSXin Li endif() 500*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_AVX2) 501*a58d3d2aSXin Li if(MSVC) 502*a58d3d2aSXin Li set(AVX2_FLAGS "${AVX2_FLAGS} /arch:AVX2") 503*a58d3d2aSXin Li else() 504*a58d3d2aSXin Li set(AVX2_FLAGS "${AVX2_FLAGS} -mavx2 -mfma -mavx") 505*a58d3d2aSXin Li endif() 506*a58d3d2aSXin Li set_source_files_properties(${celt_sources_avx2} PROPERTIES COMPILE_FLAGS ${AVX2_FLAGS}) 507*a58d3d2aSXin Li set_source_files_properties(${silk_sources_avx2} PROPERTIES COMPILE_FLAGS ${AVX2_FLAGS}) 508*a58d3d2aSXin Li set_source_files_properties(${silk_sources_float_avx2} PROPERTIES COMPILE_FLAGS ${AVX2_FLAGS}) 509*a58d3d2aSXin Li set_source_files_properties(${dnn_sources_avx2} PROPERTIES COMPILE_FLAGS ${AVX2_FLAGS}) 510*a58d3d2aSXin Li endif() 511*a58d3d2aSXin Li if(OPUS_X86_PRESUME_AVX2) 512*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_AVX2) 513*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE4_1) 514*a58d3d2aSXin Li if(NOT MSVC) 515*a58d3d2aSXin Li target_compile_options(opus PRIVATE -mavx2 -mfma -mavx) 516*a58d3d2aSXin Li endif() 517*a58d3d2aSXin Li endif() 518*a58d3d2aSXin Li endif() 519*a58d3d2aSXin Li 520*a58d3d2aSXin Li if(MSVC) 521*a58d3d2aSXin Li if(AVX2_SUPPORTED AND OPUS_X86_PRESUME_AVX2) # on 64 bit and 32 bits 522*a58d3d2aSXin Li add_definitions(/arch:AVX2) 523*a58d3d2aSXin Li elseif(OPUS_CPU_X86) # if AVX not supported then set SSE flag 524*a58d3d2aSXin Li if((SSE4_1_SUPPORTED AND OPUS_X86_PRESUME_SSE4_1) 525*a58d3d2aSXin Li OR (SSE2_SUPPORTED AND OPUS_X86_PRESUME_SSE2)) 526*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE /arch:SSE2) 527*a58d3d2aSXin Li elseif(SSE1_SUPPORTED AND OPUS_X86_PRESUME_SSE) 528*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE /arch:SSE) 529*a58d3d2aSXin Li endif() 530*a58d3d2aSXin Li endif() 531*a58d3d2aSXin Li endif() 532*a58d3d2aSXin Li 533*a58d3d2aSXin Li if(COMPILER_SUPPORT_NEON) 534*a58d3d2aSXin Li if(OPUS_MAY_HAVE_NEON) 535*a58d3d2aSXin Li if(RUNTIME_CPU_CAPABILITY_DETECTION) 536*a58d3d2aSXin Li message(STATUS "OPUS_MAY_HAVE_NEON enabling runtime detection") 537*a58d3d2aSXin Li target_compile_definitions(opus PRIVATE OPUS_HAVE_RTCD) 538*a58d3d2aSXin Li add_sources_group(opus celt ${celt_sources_arm_rtcd}) 539*a58d3d2aSXin Li add_sources_group(opus silk ${silk_sources_arm_rtcd}) 540*a58d3d2aSXin Li else() 541*a58d3d2aSXin Li message(ERROR "Runtime cpu capability detection needed for MAY_HAVE_NEON") 542*a58d3d2aSXin Li endif() 543*a58d3d2aSXin Li # Do runtime check for NEON 544*a58d3d2aSXin Li target_compile_definitions(opus 545*a58d3d2aSXin Li PRIVATE 546*a58d3d2aSXin Li OPUS_ARM_MAY_HAVE_NEON 547*a58d3d2aSXin Li OPUS_ARM_MAY_HAVE_NEON_INTR) 548*a58d3d2aSXin Li endif() 549*a58d3d2aSXin Li 550*a58d3d2aSXin Li add_sources_group(opus celt ${celt_sources_arm_neon_intr}) 551*a58d3d2aSXin Li add_sources_group(opus silk ${silk_sources_arm_neon_intr}) 552*a58d3d2aSXin Li if (OPUS_DNN) 553*a58d3d2aSXin Li add_sources_group(opus lpcnet ${dnn_sources_arm_neon}) 554*a58d3d2aSXin Li endif() 555*a58d3d2aSXin Li 556*a58d3d2aSXin Li # silk arm neon depends on main_Fix.h 557*a58d3d2aSXin Li target_include_directories(opus PRIVATE silk/fixed) 558*a58d3d2aSXin Li 559*a58d3d2aSXin Li if(OPUS_FIXED_POINT) 560*a58d3d2aSXin Li add_sources_group(opus silk ${silk_sources_fixed_arm_neon_intr}) 561*a58d3d2aSXin Li endif() 562*a58d3d2aSXin Li 563*a58d3d2aSXin Li if(OPUS_PRESUME_NEON) 564*a58d3d2aSXin Li target_compile_definitions(opus 565*a58d3d2aSXin Li PRIVATE 566*a58d3d2aSXin Li OPUS_ARM_PRESUME_NEON 567*a58d3d2aSXin Li OPUS_ARM_PRESUME_NEON_INTR) 568*a58d3d2aSXin Li endif() 569*a58d3d2aSXin Li endif() 570*a58d3d2aSXin Liendif() 571*a58d3d2aSXin Li 572*a58d3d2aSXin Litarget_compile_definitions(opus 573*a58d3d2aSXin Li PRIVATE 574*a58d3d2aSXin Li $<$<BOOL:${HAVE_LRINT}>:HAVE_LRINT> 575*a58d3d2aSXin Li $<$<BOOL:${HAVE_LRINTF}>:HAVE_LRINTF>) 576*a58d3d2aSXin Li 577*a58d3d2aSXin Liif(OPUS_BUILD_FRAMEWORK) 578*a58d3d2aSXin Li set_target_properties(opus PROPERTIES 579*a58d3d2aSXin Li FRAMEWORK TRUE 580*a58d3d2aSXin Li FRAMEWORK_VERSION ${PROJECT_VERSION} 581*a58d3d2aSXin Li MACOSX_FRAMEWORK_IDENTIFIER org.xiph.opus 582*a58d3d2aSXin Li MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PROJECT_VERSION} 583*a58d3d2aSXin Li MACOSX_FRAMEWORK_BUNDLE_VERSION ${PROJECT_VERSION} 584*a58d3d2aSXin Li XCODE_ATTRIBUTE_INSTALL_PATH "@rpath" 585*a58d3d2aSXin Li OUTPUT_NAME Opus) 586*a58d3d2aSXin Liendif() 587*a58d3d2aSXin Li 588*a58d3d2aSXin Liinstall(TARGETS opus 589*a58d3d2aSXin Li EXPORT OpusTargets 590*a58d3d2aSXin Li ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 591*a58d3d2aSXin Li LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 592*a58d3d2aSXin Li RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 593*a58d3d2aSXin Li FRAMEWORK DESTINATION ${CMAKE_INSTALL_PREFIX} 594*a58d3d2aSXin Li PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opus) 595*a58d3d2aSXin Li 596*a58d3d2aSXin Liif(OPUS_INSTALL_PKG_CONFIG_MODULE) 597*a58d3d2aSXin Li set(prefix ${CMAKE_INSTALL_PREFIX}) 598*a58d3d2aSXin Li set(exec_prefix ${CMAKE_INSTALL_PREFIX}) 599*a58d3d2aSXin Li set(libdir ${CMAKE_INSTALL_FULL_LIBDIR}) 600*a58d3d2aSXin Li set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}) 601*a58d3d2aSXin Li set(VERSION ${PACKAGE_VERSION}) 602*a58d3d2aSXin Li if(HAVE_LIBM) 603*a58d3d2aSXin Li set(LIBM "-lm") 604*a58d3d2aSXin Li endif() 605*a58d3d2aSXin Li configure_file(opus.pc.in opus.pc) 606*a58d3d2aSXin Li install(FILES ${CMAKE_CURRENT_BINARY_DIR}/opus.pc 607*a58d3d2aSXin Li DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) 608*a58d3d2aSXin Liendif() 609*a58d3d2aSXin Li 610*a58d3d2aSXin Liif(OPUS_INSTALL_CMAKE_CONFIG_MODULE) 611*a58d3d2aSXin Li set(CPACK_GENERATOR TGZ) 612*a58d3d2aSXin Li include(CPack) 613*a58d3d2aSXin Li set(CMAKE_INSTALL_PACKAGEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) 614*a58d3d2aSXin Li install(EXPORT OpusTargets 615*a58d3d2aSXin Li NAMESPACE Opus:: 616*a58d3d2aSXin Li DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) 617*a58d3d2aSXin Li 618*a58d3d2aSXin Li include(CMakePackageConfigHelpers) 619*a58d3d2aSXin Li 620*a58d3d2aSXin Li set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}) 621*a58d3d2aSXin Li configure_package_config_file(${PROJECT_SOURCE_DIR}/cmake/OpusConfig.cmake.in 622*a58d3d2aSXin Li OpusConfig.cmake 623*a58d3d2aSXin Li INSTALL_DESTINATION 624*a58d3d2aSXin Li ${CMAKE_INSTALL_PACKAGEDIR} 625*a58d3d2aSXin Li PATH_VARS 626*a58d3d2aSXin Li INCLUDE_INSTALL_DIR 627*a58d3d2aSXin Li INSTALL_PREFIX 628*a58d3d2aSXin Li ${CMAKE_INSTALL_PREFIX}) 629*a58d3d2aSXin Li write_basic_package_version_file(OpusConfigVersion.cmake 630*a58d3d2aSXin Li VERSION ${PROJECT_VERSION} 631*a58d3d2aSXin Li COMPATIBILITY SameMajorVersion) 632*a58d3d2aSXin Li install(FILES ${CMAKE_CURRENT_BINARY_DIR}/OpusConfig.cmake 633*a58d3d2aSXin Li ${CMAKE_CURRENT_BINARY_DIR}/OpusConfigVersion.cmake 634*a58d3d2aSXin Li DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) 635*a58d3d2aSXin Liendif() 636*a58d3d2aSXin Li 637*a58d3d2aSXin Liif(OPUS_BUILD_PROGRAMS) 638*a58d3d2aSXin Li # demo 639*a58d3d2aSXin Li if(OPUS_CUSTOM_MODES) 640*a58d3d2aSXin Li add_executable(opus_custom_demo ${opus_custom_demo_sources}) 641*a58d3d2aSXin Li target_include_directories(opus_custom_demo 642*a58d3d2aSXin Li PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) 643*a58d3d2aSXin Li target_link_libraries(opus_custom_demo PRIVATE opus) 644*a58d3d2aSXin Li target_compile_definitions(opus_custom_demo PRIVATE OPUS_BUILD) 645*a58d3d2aSXin Li endif() 646*a58d3d2aSXin Li 647*a58d3d2aSXin Li add_executable(opus_demo ${opus_demo_sources}) 648*a58d3d2aSXin Li target_include_directories(opus_demo PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) 649*a58d3d2aSXin Li target_include_directories(opus_demo PRIVATE silk) # debug.h 650*a58d3d2aSXin Li target_include_directories(opus_demo PRIVATE celt) # arch.h 651*a58d3d2aSXin Li target_include_directories(opus_demo PRIVATE dnn) 652*a58d3d2aSXin Li target_link_libraries(opus_demo PRIVATE opus ${OPUS_REQUIRED_LIBRARIES}) 653*a58d3d2aSXin Li target_compile_definitions(opus_demo PRIVATE OPUS_BUILD) 654*a58d3d2aSXin Li 655*a58d3d2aSXin Li # compare 656*a58d3d2aSXin Li add_executable(opus_compare ${opus_compare_sources}) 657*a58d3d2aSXin Li target_include_directories(opus_compare PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) 658*a58d3d2aSXin Li target_link_libraries(opus_compare PRIVATE opus ${OPUS_REQUIRED_LIBRARIES}) 659*a58d3d2aSXin Liendif() 660*a58d3d2aSXin Li 661*a58d3d2aSXin Liif(BUILD_TESTING AND NOT BUILD_SHARED_LIBS) 662*a58d3d2aSXin Li enable_testing() 663*a58d3d2aSXin Li 664*a58d3d2aSXin Li # tests 665*a58d3d2aSXin Li add_executable(test_opus_decode ${test_opus_decode_sources}) 666*a58d3d2aSXin Li target_include_directories(test_opus_decode 667*a58d3d2aSXin Li PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) 668*a58d3d2aSXin Li target_link_libraries(test_opus_decode PRIVATE opus) 669*a58d3d2aSXin Li target_compile_definitions(test_opus_decode PRIVATE OPUS_BUILD) 670*a58d3d2aSXin Li if(OPUS_FIXED_POINT) 671*a58d3d2aSXin Li target_compile_definitions(test_opus_decode PRIVATE DISABLE_FLOAT_API) 672*a58d3d2aSXin Li endif() 673*a58d3d2aSXin Li add_test(NAME test_opus_decode COMMAND ${CMAKE_COMMAND} 674*a58d3d2aSXin Li -DTEST_EXECUTABLE=$<TARGET_FILE:test_opus_decode> 675*a58d3d2aSXin Li -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} 676*a58d3d2aSXin Li -P "${PROJECT_SOURCE_DIR}/cmake/RunTest.cmake") 677*a58d3d2aSXin Li 678*a58d3d2aSXin Li add_executable(test_opus_padding ${test_opus_padding_sources}) 679*a58d3d2aSXin Li target_include_directories(test_opus_padding 680*a58d3d2aSXin Li PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) 681*a58d3d2aSXin Li target_link_libraries(test_opus_padding PRIVATE opus) 682*a58d3d2aSXin Li add_test(NAME test_opus_padding COMMAND ${CMAKE_COMMAND} 683*a58d3d2aSXin Li -DTEST_EXECUTABLE=$<TARGET_FILE:test_opus_padding> 684*a58d3d2aSXin Li -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} 685*a58d3d2aSXin Li -P "${PROJECT_SOURCE_DIR}/cmake/RunTest.cmake") 686*a58d3d2aSXin Li 687*a58d3d2aSXin Li add_executable(test_opus_api ${test_opus_api_sources}) 688*a58d3d2aSXin Li target_include_directories(test_opus_api 689*a58d3d2aSXin Li PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt) 690*a58d3d2aSXin Li target_link_libraries(test_opus_api PRIVATE opus) 691*a58d3d2aSXin Li target_compile_definitions(test_opus_api PRIVATE OPUS_BUILD) 692*a58d3d2aSXin Li if(OPUS_FIXED_POINT) 693*a58d3d2aSXin Li target_compile_definitions(test_opus_api PRIVATE DISABLE_FLOAT_API) 694*a58d3d2aSXin Li endif() 695*a58d3d2aSXin Li add_test(NAME test_opus_api COMMAND ${CMAKE_COMMAND} 696*a58d3d2aSXin Li -DTEST_EXECUTABLE=$<TARGET_FILE:test_opus_api> 697*a58d3d2aSXin Li -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} 698*a58d3d2aSXin Li -P "${PROJECT_SOURCE_DIR}/cmake/RunTest.cmake") 699*a58d3d2aSXin Li 700*a58d3d2aSXin Li add_executable(test_opus_encode ${test_opus_encode_sources}) 701*a58d3d2aSXin Li target_include_directories(test_opus_encode 702*a58d3d2aSXin Li PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt dnn) 703*a58d3d2aSXin Li target_link_libraries(test_opus_encode PRIVATE opus) 704*a58d3d2aSXin Li target_compile_definitions(test_opus_encode PRIVATE OPUS_BUILD) 705*a58d3d2aSXin Li add_test(NAME test_opus_encode COMMAND ${CMAKE_COMMAND} 706*a58d3d2aSXin Li -DTEST_EXECUTABLE=$<TARGET_FILE:test_opus_encode> 707*a58d3d2aSXin Li -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} 708*a58d3d2aSXin Li -P "${PROJECT_SOURCE_DIR}/cmake/RunTest.cmake") 709*a58d3d2aSXin Li 710*a58d3d2aSXin Li add_executable(test_opus_extensions ${test_opus_extensions_sources}) 711*a58d3d2aSXin Li target_include_directories(test_opus_extensions 712*a58d3d2aSXin Li PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt dnn) 713*a58d3d2aSXin Li target_link_libraries(test_opus_extensions PRIVATE opus) 714*a58d3d2aSXin Li target_compile_definitions(test_opus_extensions PRIVATE OPUS_BUILD) 715*a58d3d2aSXin Li add_test(NAME test_opus_extensions COMMAND ${CMAKE_COMMAND} 716*a58d3d2aSXin Li -DTEST_EXECUTABLE=$<TARGET_FILE:test_opus_extensions> 717*a58d3d2aSXin Li -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} 718*a58d3d2aSXin Li -P "${PROJECT_SOURCE_DIR}/cmake/RunTest.cmake") 719*a58d3d2aSXin Li if(OPUS_DRED) 720*a58d3d2aSXin Li add_executable(test_opus_dred ${test_opus_dred_sources}) 721*a58d3d2aSXin Li target_include_directories(test_opus_dred 722*a58d3d2aSXin Li PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) 723*a58d3d2aSXin Li target_link_libraries(test_opus_dred PRIVATE opus) 724*a58d3d2aSXin Li target_compile_definitions(test_opus_dred PRIVATE OPUS_BUILD) 725*a58d3d2aSXin Li add_test(NAME test_opus_dred COMMAND ${CMAKE_COMMAND} 726*a58d3d2aSXin Li -DTEST_EXECUTABLE=$<TARGET_FILE:test_opus_dred> 727*a58d3d2aSXin Li -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} 728*a58d3d2aSXin Li -P "${PROJECT_SOURCE_DIR}/cmake/RunTest.cmake") 729*a58d3d2aSXin Li endif() 730*a58d3d2aSXin Liendif() 731