Marcus Asteborg | d00d866 | 2020-04-22 22:42:18 -0700 | [diff] [blame] | 1 | if(__opus_functions) |
| 2 | return() |
| 3 | endif() |
| 4 | set(__opus_functions INCLUDED) |
Marcus Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 5 | |
| 6 | function(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) |
| 42 | endfunction() |
| 43 | |
Marcus Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 44 | function(check_flag NAME FLAG) |
| 45 | include(CheckCCompilerFlag) |
| 46 | check_c_compiler_flag(${FLAG} ${NAME}_SUPPORTED) |
| 47 | endfunction() |
| 48 | |
| 49 | include(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 |
| 54 | function(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 Asteborg | 927de84 | 2020-03-13 13:31:29 -0700 | [diff] [blame] | 63 | set(SSE1_SUPPORTED |
| 64 | 1 |
| 65 | PARENT_SCOPE) |
Marcus Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 66 | endif() |
| 67 | else() |
Marcus Asteborg | 927de84 | 2020-03-13 13:31:29 -0700 | [diff] [blame] | 68 | check_flag(SSE1 -msse) |
Marcus Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 69 | endif() |
| 70 | else() |
Marcus Asteborg | 927de84 | 2020-03-13 13:31:29 -0700 | [diff] [blame] | 71 | set(SSE1_SUPPORTED |
| 72 | 0 |
| 73 | PARENT_SCOPE) |
Marcus Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 74 | 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 Asteborg | 927de84 | 2020-03-13 13:31:29 -0700 | [diff] [blame] | 82 | set(SSE2_SUPPORTED |
| 83 | 1 |
| 84 | PARENT_SCOPE) |
Marcus Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 85 | endif() |
| 86 | else() |
Marcus Asteborg | 927de84 | 2020-03-13 13:31:29 -0700 | [diff] [blame] | 87 | check_flag(SSE2 -msse2) |
Marcus Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 88 | endif() |
| 89 | else() |
Marcus Asteborg | 927de84 | 2020-03-13 13:31:29 -0700 | [diff] [blame] | 90 | set(SSE2_SUPPORTED |
| 91 | 0 |
| 92 | PARENT_SCOPE) |
Marcus Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 93 | 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 Asteborg | 927de84 | 2020-03-13 13:31:29 -0700 | [diff] [blame] | 101 | set(SSE4_1_SUPPORTED |
| 102 | 1 |
| 103 | PARENT_SCOPE) |
Marcus Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 104 | endif() |
| 105 | else() |
Marcus Asteborg | 927de84 | 2020-03-13 13:31:29 -0700 | [diff] [blame] | 106 | check_flag(SSE4_1 -msse4.1) |
Marcus Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 107 | endif() |
| 108 | else() |
Marcus Asteborg | 927de84 | 2020-03-13 13:31:29 -0700 | [diff] [blame] | 109 | set(SSE4_1_SUPPORTED |
| 110 | 0 |
| 111 | PARENT_SCOPE) |
Marcus Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 112 | 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 Asteborg | 927de84 | 2020-03-13 13:31:29 -0700 | [diff] [blame] | 119 | check_flag(AVX -mavx) |
Marcus Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 120 | endif() |
| 121 | else() |
Marcus Asteborg | 927de84 | 2020-03-13 13:31:29 -0700 | [diff] [blame] | 122 | set(AVX_SUPPORTED |
| 123 | 0 |
| 124 | PARENT_SCOPE) |
Marcus Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 125 | 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() |
| 132 | endfunction() |
| 133 | |
| 134 | function(opus_detect_neon COMPILER_SUPPORT_NEON) |
Nathaniel R. Lewis | 7628d84 | 2020-04-09 11:43:09 -0700 | [diff] [blame] | 135 | if(CMAKE_SYSTEM_PROCESSOR MATCHES "(arm|aarch64)") |
Marcus Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 136 | 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() |
| 142 | endfunction() |
| 143 | |
| 144 | function(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. Lewis | 7628d84 | 2020-04-09 11:43:09 -0700 | [diff] [blame] | 152 | 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 Asteborg | f9d3d43 | 2018-11-15 19:48:38 -0800 | [diff] [blame] | 158 | else() |
| 159 | set(RUNTIME_CPU_CAPABILITY_DETECTION 0 PARENT_SCOPE) |
| 160 | endif() |
| 161 | endfunction() |
| 162 | |
| 163 | function(add_sources_group target group) |
| 164 | target_sources(${target} PRIVATE ${ARGN}) |
| 165 | source_group(${group} FILES ${ARGN}) |
| 166 | endfunction() |
| 167 | |
| 168 | function(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) |
| 215 | endfunction() |