xref: /aosp_15_r20/external/libopus/CMakeLists.txt (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
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