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