blob: fcf3351fb361237a7e87f214fed90fd946f5754f [file] [log] [blame]
Marcus Asteborgd00d8662020-04-22 22:42:18 -07001if(__opus_functions)
2 return()
3endif()
4set(__opus_functions INCLUDED)
Marcus Asteborgf9d3d432018-11-15 19:48:38 -08005
6function(get_library_version OPUS_LIBRARY_VERSION OPUS_LIBRARY_VERSION_MAJOR)
7 file(STRINGS configure.ac opus_lt_current_string
8 LIMIT_COUNT 1
9 REGEX "OPUS_LT_CURRENT=")
10 string(REGEX MATCH
11 "OPUS_LT_CURRENT=([0-9]*)"
12 _
13 ${opus_lt_current_string})
14 set(OPUS_LT_CURRENT ${CMAKE_MATCH_1})
15
16 file(STRINGS configure.ac opus_lt_revision_string
17 LIMIT_COUNT 1
18 REGEX "OPUS_LT_REVISION=")
19 string(REGEX MATCH
20 "OPUS_LT_REVISION=([0-9]*)"
21 _
22 ${opus_lt_revision_string})
23 set(OPUS_LT_REVISION ${CMAKE_MATCH_1})
24
25 file(STRINGS configure.ac opus_lt_age_string
26 LIMIT_COUNT 1
27 REGEX "OPUS_LT_AGE=")
28 string(REGEX MATCH
29 "OPUS_LT_AGE=([0-9]*)"
30 _
31 ${opus_lt_age_string})
32 set(OPUS_LT_AGE ${CMAKE_MATCH_1})
33
34 math(EXPR OPUS_LIBRARY_VERSION_MAJOR "${OPUS_LT_CURRENT} - ${OPUS_LT_AGE}")
35 set(OPUS_LIBRARY_VERSION_MINOR ${OPUS_LT_AGE})
36 set(OPUS_LIBRARY_VERSION_PATCH ${OPUS_LT_REVISION})
37 set(
38 OPUS_LIBRARY_VERSION
39 "${OPUS_LIBRARY_VERSION_MAJOR}.${OPUS_LIBRARY_VERSION_MINOR}.${OPUS_LIBRARY_VERSION_PATCH}"
40 PARENT_SCOPE)
41 set(OPUS_LIBRARY_VERSION_MAJOR ${OPUS_LIBRARY_VERSION_MAJOR} PARENT_SCOPE)
42endfunction()
43
Marcus Asteborgf9d3d432018-11-15 19:48:38 -080044function(check_flag NAME FLAG)
45 include(CheckCCompilerFlag)
46 check_c_compiler_flag(${FLAG} ${NAME}_SUPPORTED)
47endfunction()
48
49include(CheckIncludeFile)
50# function to check if compiler supports SSE, SSE2, SSE4.1 and AVX if target
51# systems may not have SSE support then use OPUS_MAY_HAVE_SSE option if target
52# system is guaranteed to have SSE support then OPUS_PRESUME_SSE can be used to
53# skip SSE runtime check
54function(opus_detect_sse COMPILER_SUPPORT_SIMD)
55 message(STATUS "Check SIMD support by compiler")
56 check_include_file(xmmintrin.h HAVE_XMMINTRIN_H) # SSE1
57 if(HAVE_XMMINTRIN_H)
58 if(MSVC)
59 # different arch options for 32 and 64 bit target for MSVC
60 if(CMAKE_SIZEOF_VOID_P EQUAL 4)
61 check_flag(SSE1 /arch:SSE)
62 else()
Marcus Asteborg927de842020-03-13 13:31:29 -070063 set(SSE1_SUPPORTED
64 1
65 PARENT_SCOPE)
Marcus Asteborgf9d3d432018-11-15 19:48:38 -080066 endif()
67 else()
Marcus Asteborg927de842020-03-13 13:31:29 -070068 check_flag(SSE1 -msse)
Marcus Asteborgf9d3d432018-11-15 19:48:38 -080069 endif()
70 else()
Marcus Asteborg927de842020-03-13 13:31:29 -070071 set(SSE1_SUPPORTED
72 0
73 PARENT_SCOPE)
Marcus Asteborgf9d3d432018-11-15 19:48:38 -080074 endif()
75
76 check_include_file(emmintrin.h HAVE_EMMINTRIN_H) # SSE2
77 if(HAVE_EMMINTRIN_H)
78 if(MSVC)
79 if(CMAKE_SIZEOF_VOID_P EQUAL 4)
80 check_flag(SSE2 /arch:SSE2)
81 else()
Marcus Asteborg927de842020-03-13 13:31:29 -070082 set(SSE2_SUPPORTED
83 1
84 PARENT_SCOPE)
Marcus Asteborgf9d3d432018-11-15 19:48:38 -080085 endif()
86 else()
Marcus Asteborg927de842020-03-13 13:31:29 -070087 check_flag(SSE2 -msse2)
Marcus Asteborgf9d3d432018-11-15 19:48:38 -080088 endif()
89 else()
Marcus Asteborg927de842020-03-13 13:31:29 -070090 set(SSE2_SUPPORTED
91 0
92 PARENT_SCOPE)
Marcus Asteborgf9d3d432018-11-15 19:48:38 -080093 endif()
94
95 check_include_file(smmintrin.h HAVE_SMMINTRIN_H) # SSE4.1
96 if(HAVE_SMMINTRIN_H)
97 if(MSVC)
98 if(CMAKE_SIZEOF_VOID_P EQUAL 4)
99 check_flag(SSE4_1 /arch:SSE2) # SSE2 and above
100 else()
Marcus Asteborg927de842020-03-13 13:31:29 -0700101 set(SSE4_1_SUPPORTED
102 1
103 PARENT_SCOPE)
Marcus Asteborgf9d3d432018-11-15 19:48:38 -0800104 endif()
105 else()
Marcus Asteborg927de842020-03-13 13:31:29 -0700106 check_flag(SSE4_1 -msse4.1)
Marcus Asteborgf9d3d432018-11-15 19:48:38 -0800107 endif()
108 else()
Marcus Asteborg927de842020-03-13 13:31:29 -0700109 set(SSE4_1_SUPPORTED
110 0
111 PARENT_SCOPE)
Marcus Asteborgf9d3d432018-11-15 19:48:38 -0800112 endif()
113
114 check_include_file(immintrin.h HAVE_IMMINTRIN_H) # AVX
115 if(HAVE_IMMINTRIN_H)
116 if(MSVC)
117 check_flag(AVX /arch:AVX)
118 else()
Marcus Asteborg927de842020-03-13 13:31:29 -0700119 check_flag(AVX -mavx)
Marcus Asteborgf9d3d432018-11-15 19:48:38 -0800120 endif()
121 else()
Marcus Asteborg927de842020-03-13 13:31:29 -0700122 set(AVX_SUPPORTED
123 0
124 PARENT_SCOPE)
Marcus Asteborgf9d3d432018-11-15 19:48:38 -0800125 endif()
126
127 if(SSE1_SUPPORTED OR SSE2_SUPPORTED OR SSE4_1_SUPPORTED OR AVX_SUPPORTED)
128 set(COMPILER_SUPPORT_SIMD 1 PARENT_SCOPE)
129 else()
130 message(STATUS "No SIMD support in compiler")
131 endif()
132endfunction()
133
134function(opus_detect_neon COMPILER_SUPPORT_NEON)
Nathaniel R. Lewis7628d842020-04-09 11:43:09 -0700135 if(CMAKE_SYSTEM_PROCESSOR MATCHES "(arm|aarch64)")
Marcus Asteborgf9d3d432018-11-15 19:48:38 -0800136 message(STATUS "Check NEON support by compiler")
137 check_include_file(arm_neon.h HAVE_ARM_NEON_H)
138 if(HAVE_ARM_NEON_H)
139 set(COMPILER_SUPPORT_NEON ${HAVE_ARM_NEON_H} PARENT_SCOPE)
140 endif()
141 endif()
142endfunction()
143
144function(opus_supports_cpu_detection RUNTIME_CPU_CAPABILITY_DETECTION)
145 if(MSVC)
146 check_include_file(intrin.h HAVE_INTRIN_H)
147 else()
148 check_include_file(cpuid.h HAVE_CPUID_H)
149 endif()
150 if(HAVE_INTRIN_H OR HAVE_CPUID_H)
151 set(RUNTIME_CPU_CAPABILITY_DETECTION 1 PARENT_SCOPE)
Nathaniel R. Lewis7628d842020-04-09 11:43:09 -0700152 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(arm|aarch64)")
153 # ARM cpu detection is implemented for Windows and anything
154 # using a Linux kernel (such as Android).
155 if (CMAKE_SYSTEM_NAME MATCHES "(Windows|Linux|Android)")
156 set(RUNTIME_CPU_CAPABILITY_DETECTION 1 PARENT_SCOPE)
157 endif ()
Marcus Asteborgf9d3d432018-11-15 19:48:38 -0800158 else()
159 set(RUNTIME_CPU_CAPABILITY_DETECTION 0 PARENT_SCOPE)
160 endif()
161endfunction()
162
163function(add_sources_group target group)
164 target_sources(${target} PRIVATE ${ARGN})
165 source_group(${group} FILES ${ARGN})
166endfunction()
167
168function(get_opus_sources SOURCE_GROUP MAKE_FILE SOURCES)
169 # read file, each item in list is one group
170 file(STRINGS ${MAKE_FILE} opus_sources)
171
172 # add wildcard for regex match
173 string(CONCAT SOURCE_GROUP ${SOURCE_GROUP} ".*$")
174
175 # find group
176 foreach(val IN LISTS opus_sources)
177 if(val MATCHES ${SOURCE_GROUP})
178 list(LENGTH val list_length)
179 if(${list_length} EQUAL 1)
180 # for tests split by '=' and clean up the rest into a list
181 string(FIND ${val} "=" index)
182 math(EXPR index "${index} + 1")
183 string(SUBSTRING ${val}
184 ${index}
185 -1
186 sources)
187 string(REPLACE " "
188 ";"
189 sources
190 ${sources})
191 else()
192 # discard the group
193 list(REMOVE_AT val 0)
194 set(sources ${val})
195 endif()
196 break()
197 endif()
198 endforeach()
199
200 list(LENGTH sources list_length)
201 if(${list_length} LESS 1)
202 message(
203 FATAL_ERROR
204 "No files parsed succesfully from ${SOURCE_GROUP} in ${MAKE_FILE}")
205 endif()
206
207 # remove trailing whitespaces
208 set(list_var "")
209 foreach(source ${sources})
210 string(STRIP "${source}" source)
211 list(APPEND list_var "${source}")
212 endforeach()
213
214 set(${SOURCES} ${list_var} PARENT_SCOPE)
215endfunction()