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