Mercurial > vec
comparison CMakeLists.txt @ 36:677c03c382b8
Backed out changeset e26874655738
| author | Paper <paper@tflc.us> |
|---|---|
| date | Fri, 25 Apr 2025 17:40:55 -0400 |
| parents | 8b5e0974fd41 |
| children |
comparison
equal
deleted
inserted
replaced
| 35:99e4539f922f | 36:677c03c382b8 |
|---|---|
| 1 cmake_minimum_required(VERSION 3.23) | 1 cmake_minimum_required(VERSION 3.23) |
| 2 | 2 |
| 3 project(vec VERSION 3.0.0 DESCRIPTION "a tiny C99 SIMD vector library") | 3 project(vec VERSION 2.0.0 DESCRIPTION "a tiny C99 SIMD vector library") |
| 4 | 4 |
| 5 add_library(vec SHARED "src/vec.c;src/cpu.c;src/impl/generic.c;src/impl/fallback.c") | 5 add_library(vec SHARED src/vec.c) |
| 6 | |
| 7 target_sources(vec PUBLIC | |
| 8 $<INSTALL_INTERFACE:vec/vec.h> | |
| 9 $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include/vec/vec.h> | |
| 10 $<INSTALL_INTERFACE:vec/impl/integer.h> | |
| 11 $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include/vec/impl/integer.h> | |
| 12 ) | |
| 6 | 13 |
| 7 include(CheckCCompilerFlag) | 14 include(CheckCCompilerFlag) |
| 8 | 15 |
| 9 if(MSVC) | 16 if(MSVC) |
| 10 # Untested! | 17 # TODO ? |
| 11 | 18 else() |
| 12 if(CMAKE_SIZEOF_VOID_P EQUAL 8) | 19 check_c_compiler_flag("-maltivec" COMPILER_HAS_ALTIVEC) |
| 13 set(COMPILER_HAS_MMX OFF) | 20 if(COMPILER_HAS_ALTIVEC) |
| 14 else() | 21 target_compile_options(vec PRIVATE "-maltivec") |
| 15 set(COMPILER_HAS_MMX ON) | |
| 16 set(COMPILER_MMX_FLAGS "") # none? | |
| 17 endif() | 22 endif() |
| 18 check_c_compiler_flag("/arch:SSE2" COMPILER_HAS_SSE2) | |
| 19 if(COMPILER_HAS_SSE2) | |
| 20 set(COMPILER_SSE2_FLAGS "/arch:SSE2") | |
| 21 endif() | |
| 22 check_c_compiler_flag("/arch:SSE4.2" COMPILER_HAS_SSE41) | |
| 23 if(COMPILER_HAS_SSE41) | |
| 24 set(COMPILER_SSE41_FLAGS "/arch:SSE4.2") | |
| 25 endif() | |
| 26 check_c_compiler_flag("/arch:AVX2" COMPILER_HAS_AVX2) | |
| 27 if(COMPILER_HAS_AVX2) | |
| 28 set(COMPILER_AVX2_FLAGS "/arch:AVX2") | |
| 29 endif() | |
| 30 check_c_compiler_flag("/arch:AVX512" COMPILER_HAS_AVX512F) | |
| 31 if(COMPILER_HAS_AVX512F) | |
| 32 set(COMPILER_AVX512F_FLAGS "/arch:AVX512") | |
| 33 endif() | |
| 34 # TODO we have to try_compile to detect NEON | |
| 35 else() | |
| 36 #check_c_compiler_flag("-maltivec" COMPILER_HAS_ALTIVEC) | |
| 37 #if(COMPILER_HAS_ALTIVEC) | |
| 38 # set(COMPILER_ALTIVEC_FLAGS "-maltivec") | |
| 39 #endif() | |
| 40 #check_c_compiler_flag("-mfpu=neon" COMPILER_HAS_NEON) | |
| 41 #if(COMPILER_HAS_NEON) | |
| 42 # set(COMPILER_NEON_FLAGS "-mfpu=neon") | |
| 43 #endif() | |
| 44 check_c_compiler_flag("-mmmx" COMPILER_HAS_MMX) | 23 check_c_compiler_flag("-mmmx" COMPILER_HAS_MMX) |
| 45 if(COMPILER_HAS_MMX) | 24 if(COMPILER_HAS_MMX) |
| 46 set(COMPILER_MMX_FLAGS "-mmmx") | 25 target_compile_options(vec PRIVATE "-mmmx") |
| 47 endif() | 26 endif() |
| 48 check_c_compiler_flag("-msse2" COMPILER_HAS_SSE2) | 27 check_c_compiler_flag("-msse2" COMPILER_HAS_SSE2) |
| 49 if(COMPILER_HAS_SSE2) | 28 if(COMPILER_HAS_SSE2) |
| 50 set(COMPILER_SSE2_FLAGS "-msse2") | 29 target_compile_options(vec PRIVATE "-msse2") |
| 51 endif() | 30 endif() |
| 52 check_c_compiler_flag("-msse4.1" COMPILER_HAS_SSE41) | 31 check_c_compiler_flag("-msse4.1" COMPILER_HAS_SSE41) |
| 53 if(COMPILER_HAS_SSE41) | 32 if(COMPILER_HAS_SSE41) |
| 54 set(COMPILER_SSE41_FLAGS "-msse4.1") | 33 target_compile_options(vec PRIVATE "-msse4.1") |
| 55 endif() | 34 endif() |
| 56 check_c_compiler_flag("-mavx2" COMPILER_HAS_AVX2) | 35 check_c_compiler_flag("-mavx2" COMPILER_HAS_AVX2) |
| 57 if(COMPILER_HAS_AVX2) | 36 if(COMPILER_HAS_AVX2) |
| 58 set(COMPILER_AVX2_FLAGS "-mavx2") | 37 target_compile_options(vec PRIVATE "-mavx2") |
| 59 endif() | 38 endif() |
| 60 check_c_compiler_flag("-mavx512f" COMPILER_HAS_AVX512F) | 39 check_c_compiler_flag("-mavx512f" COMPILER_HAS_AVX512F) |
| 61 if(COMPILER_HAS_AVX512F) | 40 if(COMPILER_HAS_AVX512F) |
| 62 set(COMPILER_AVX512F_FLAGS "-mavx512f") | 41 target_compile_options(vec PRIVATE "-mavx512f") |
| 63 endif() | 42 endif() |
| 64 endif() | 43 endif() |
| 65 | 44 |
| 66 if(COMPILER_HAS_ALTIVEC) | |
| 67 target_sources(vec PRIVATE "src/impl/ppc/altivec.c") | |
| 68 set_source_files_properties("src/impl/ppc/altivec.c" PROPERTIES COMPILE_FLAGS "${COMPILER_ALTIVEC_FLAGS}") | |
| 69 target_compile_definitions(vec PRIVATE "-DVEC_COMPILER_HAS_ALTIVEC") | |
| 70 endif() | |
| 71 | |
| 72 if(COMPILER_HAS_NEON) | |
| 73 target_sources(vec PRIVATE "src/impl/arm/neon.c") | |
| 74 set_source_files_properties("src/impl/arm/neon.c" PROPERTIES COMPILE_FLAGS "${COMPILER_NEON_FLAGS}") | |
| 75 target_compile_definitions(vec PRIVATE "-DVEC_COMPILER_HAS_NEON") | |
| 76 endif() | |
| 77 | |
| 78 if(COMPILER_HAS_MMX) | |
| 79 target_sources(vec PRIVATE "src/impl/x86/mmx.c") | |
| 80 set_source_files_properties("src/impl/x86/mmx.c" PROPERTIES COMPILE_FLAGS "${COMPILER_MMX_FLAGS}") | |
| 81 target_compile_definitions(vec PRIVATE "-DVEC_COMPILER_HAS_MMX") | |
| 82 endif() | |
| 83 | |
| 84 if(COMPILER_HAS_SSE2) | |
| 85 target_sources(vec PRIVATE "src/impl/x86/sse2.c") | |
| 86 set_source_files_properties("src/impl/x86/sse2.c" PROPERTIES COMPILE_FLAGS "${COMPILER_SSE2_FLAGS}") | |
| 87 target_compile_definitions(vec PRIVATE "-DVEC_COMPILER_HAS_SSE2") | |
| 88 endif() | |
| 89 | |
| 90 if(COMPILER_HAS_SSE41) | |
| 91 target_sources(vec PRIVATE "src/impl/x86/sse41.c") | |
| 92 set_source_files_properties("src/impl/x86/sse41.c" PROPERTIES COMPILE_FLAGS "${COMPILER_SSE41_FLAGS}") | |
| 93 target_compile_definitions(vec PRIVATE "-DVEC_COMPILER_HAS_SSE41") | |
| 94 endif() | |
| 95 | |
| 96 if(COMPILER_HAS_AVX2) | |
| 97 target_sources(vec PRIVATE "src/impl/x86/avx2.c") | |
| 98 set_source_files_properties("src/impl/x86/avx2.c" PROPERTIES COMPILE_FLAGS "${COMPILER_AVX2_FLAGS}") | |
| 99 target_compile_definitions(vec PRIVATE "-DVEC_COMPILER_HAS_AVX2") | |
| 100 endif() | |
| 101 | |
| 102 if(COMPILER_HAS_AVX512F) | |
| 103 target_sources(vec PRIVATE "src/impl/x86/avx512f.c") | |
| 104 set_source_files_properties("src/impl/x86/avx512f.c" PROPERTIES COMPILE_FLAGS "${COMPILER_AVX512F_FLAGS}") | |
| 105 target_compile_definitions(vec PRIVATE "-DVEC_COMPILER_HAS_AVX512F") | |
| 106 endif() | |
| 107 | |
| 108 | |
| 109 ######################################################################### | 45 ######################################################################### |
| 110 # integer types; it's nice to accommodate for older broken systems that | 46 # integer types |
| 111 # may not have stdint.h. | |
| 112 | 47 |
| 113 include(CheckTypeSize) | 48 include(CheckTypeSize) |
| 114 | 49 |
| 115 check_type_size("int16_t" INT16_T_SIZE LANGUAGE C) | 50 check_type_size("int16_t" INT16_T_SIZE LANGUAGE C) |
| 116 check_type_size("uint16_t" UINT16_T_SIZE LANGUAGE C) | 51 check_type_size("uint16_t" UINT16_T_SIZE LANGUAGE C) |
| 124 check_type_size("short" SHORT_SIZE LANGUAGE C) | 59 check_type_size("short" SHORT_SIZE LANGUAGE C) |
| 125 check_type_size("int" INT_SIZE LANGUAGE C) | 60 check_type_size("int" INT_SIZE LANGUAGE C) |
| 126 check_type_size("long" LONG_SIZE LANGUAGE C) | 61 check_type_size("long" LONG_SIZE LANGUAGE C) |
| 127 check_type_size("long long" LONG_LONG_SIZE LANGUAGE C) | 62 check_type_size("long long" LONG_LONG_SIZE LANGUAGE C) |
| 128 check_type_size("uintptr_t" UINTPTR_T_SIZE LANGUAGE C) | 63 check_type_size("uintptr_t" UINTPTR_T_SIZE LANGUAGE C) |
| 129 check_type_size("size_t" SIZE_T_SIZE LANGUAGE C) | |
| 130 | 64 |
| 131 if(INT16_T_SIZE EQUAL 2) | 65 if(INT16_T_SIZE EQUAL 2) |
| 132 set(SIZE16 "int16_t") | 66 set(SIZE16 "int16_t") |
| 133 elseif(SHORT_SIZE EQUAL 2) | 67 elseif(SHORT_SIZE EQUAL 2) |
| 134 set(SIZE16 "short") | 68 set(SIZE16 "short") |
| 135 elseif(INT_SIZE EQUAL 2) | 69 elseif(INT_SIZE EQUAL 2) |
| 136 set(SIZE16 "int") | 70 set(SIZE16 "int") |
| 137 else() | |
| 138 message(FATAL_ERROR "Failed to find a signed 16-bit integer type.") | |
| 139 endif() | 71 endif() |
| 140 | 72 |
| 141 if(UINT16_T_SIZE EQUAL 2) | 73 if(UINT16_T_SIZE EQUAL 2) |
| 142 set(USIZE16 "uint16_t") | 74 set(USIZE16 "uint16_t") |
| 143 elseif(U_INT16_T_SIZE EQUAL 2) | 75 elseif(U_INT16_T_SIZE EQUAL 2) |
| 144 set(USIZE16 "u_int16_t") | 76 set(USIZE16 "u_int16_t") |
| 145 elseif(SHORT_SIZE EQUAL 2) | 77 elseif(SHORT_SIZE EQUAL 2) |
| 146 set(USIZE16 "unsigned short") | 78 set(USIZE16 "unsigned short") |
| 147 elseif(INT_SIZE EQUAL 2) | 79 elseif(INT_SIZE EQUAL 2) |
| 148 set(USIZE16 "unsigned int") | 80 set(USIZE16 "unsigned int") |
| 149 else() | |
| 150 message(FATAL_ERROR "Failed to find an unsigned 16-bit integer type.") | |
| 151 endif() | 81 endif() |
| 152 | 82 |
| 153 if(INT32_T_SIZE EQUAL 4) | 83 if(INT32_T_SIZE EQUAL 4) |
| 154 set(SIZE32 "int32_t") | 84 set(SIZE32 "int32_t") |
| 155 elseif(SHORT_SIZE EQUAL 4) | 85 elseif(SHORT_SIZE EQUAL 4) |
| 156 set(SIZE32 "short") | 86 set(SIZE32 "short") |
| 157 elseif(INT_SIZE EQUAL 4) | 87 elseif(INT_SIZE EQUAL 4) |
| 158 set(SIZE32 "int") | 88 set(SIZE32 "int") |
| 159 elseif(LONG_SIZE EQUAL 4) | 89 elseif(LONG_SIZE EQUAL 4) |
| 160 set(SIZE32 "long") | 90 set(SIZE32 "long") |
| 161 else() | |
| 162 message(FATAL_ERROR "Failed to find a signed 32-bit integer type.") | |
| 163 endif() | 91 endif() |
| 164 | 92 |
| 165 if(UINT32_T_SIZE EQUAL 4) | 93 if(UINT32_T_SIZE EQUAL 4) |
| 166 set(USIZE32 "uint32_t") | 94 set(USIZE32 "uint32_t") |
| 167 elseif(U_INT32_T_SIZE EQUAL 4) | 95 elseif(U_INT32_T_SIZE EQUAL 4) |
| 170 set(USIZE32 "unsigned short") | 98 set(USIZE32 "unsigned short") |
| 171 elseif(INT_SIZE EQUAL 4) | 99 elseif(INT_SIZE EQUAL 4) |
| 172 set(USIZE32 "unsigned int") | 100 set(USIZE32 "unsigned int") |
| 173 elseif(LONG_SIZE EQUAL 4) | 101 elseif(LONG_SIZE EQUAL 4) |
| 174 set(USIZE32 "unsigned long") | 102 set(USIZE32 "unsigned long") |
| 175 else() | |
| 176 message(FATAL_ERROR "Failed to find an unsigned 32-bit integer type.") | |
| 177 endif() | 103 endif() |
| 178 | 104 |
| 179 if(INT64_T_SIZE EQUAL 8) | 105 if(INT64_T_SIZE EQUAL 8) |
| 180 set(SIZE64 "int64_t") | 106 set(SIZE64 "int64_t") |
| 181 elseif(SHORT_SIZE EQUAL 8) | 107 elseif(SHORT_SIZE EQUAL 8) |
| 184 set(SIZE64 "int") | 110 set(SIZE64 "int") |
| 185 elseif(LONG_SIZE EQUAL 8) | 111 elseif(LONG_SIZE EQUAL 8) |
| 186 set(SIZE64 "long") | 112 set(SIZE64 "long") |
| 187 elseif(LONG_LONG_SIZE EQUAL 8) | 113 elseif(LONG_LONG_SIZE EQUAL 8) |
| 188 set(SIZE64 "long long") | 114 set(SIZE64 "long long") |
| 189 else() | |
| 190 message(FATAL_ERROR "Failed to find a signed 64-bit integer type.") | |
| 191 endif() | 115 endif() |
| 192 | 116 |
| 193 if(UINT64_T_SIZE EQUAL 8) | 117 if(UINT64_T_SIZE EQUAL 8) |
| 194 set(USIZE64 "uint64_t") | 118 set(USIZE64 "uint64_t") |
| 195 elseif(U_INT64_T_SIZE EQUAL 8) | 119 elseif(U_INT64_T_SIZE EQUAL 8) |
| 200 set(USIZE64 "unsigned int") | 124 set(USIZE64 "unsigned int") |
| 201 elseif(LONG_SIZE EQUAL 8) | 125 elseif(LONG_SIZE EQUAL 8) |
| 202 set(USIZE64 "unsigned long") | 126 set(USIZE64 "unsigned long") |
| 203 elseif(LONG_LONG_SIZE EQUAL 8) | 127 elseif(LONG_LONG_SIZE EQUAL 8) |
| 204 set(USIZE64 "unsigned long long") | 128 set(USIZE64 "unsigned long long") |
| 205 else() | |
| 206 message(FATAL_ERROR "Failed to find an unsigned 64-bit integer type.") | |
| 207 endif() | 129 endif() |
| 208 | 130 |
| 209 if(CMAKE_SIZEOF_VOID_P EQUAL UINTPTR_T_SIZE) | 131 if(CMAKE_SIZEOF_VOID_P EQUAL UINTPTR_T_SIZE) |
| 210 set(USIZEPTR "uintptr_t") | 132 set(USIZEPTR "uintptr_t") |
| 211 elseif(CMAKE_SIZEOF_VOID_P LESS_EQUAL 1) | 133 elseif(CMAKE_SIZEOF_VOID_P EQUAL 1) |
| 212 set(USIZEPTR "unsigned char") | 134 set(USIZEPTR "unsigned char") |
| 213 elseif(CMAKE_SIZEOF_VOID_P LESS_EQUAL 2) | 135 elseif(CMAKE_SIZEOF_VOID_P EQUAL 2) |
| 214 set(USIZEPTR "${USIZE16}") | 136 set(USIZEPTR "${USIZE16}") |
| 215 elseif(CMAKE_SIZEOF_VOID_P LESS_EQUAL 4) | 137 elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) |
| 216 set(USIZEPTR "${USIZE32}") | 138 set(USIZEPTR "${USIZE32}") |
| 217 elseif(CMAKE_SIZEOF_VOID_P LESS_EQUAL 8) | 139 elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) |
| 218 set(USIZEPTR "${USIZE64}") | 140 set(USIZEPTR "${USIZE64}") |
| 219 else() | |
| 220 message(FATAL_ERROR "Failed to find an integer type that can fit a pointer.") | |
| 221 endif() | 141 endif() |
| 222 | 142 |
| 223 if(NOT SIZE_T_SIZE EQUAL 0 AND NOT SIZE_T_SIZE EQUAL "") | 143 configure_file(include/vec/impl/integer.h.in include/vec/impl/integer.h @ONLY) |
| 224 set(USIZESIZE "size_t") | |
| 225 else() | |
| 226 # should be close enough I guess | |
| 227 set(USIZESIZE "${USIZEPTR}") | |
| 228 endif() | |
| 229 | 144 |
| 230 configure_file(include/vec/types.h.in include/vec/types.h @ONLY) | 145 target_compile_definitions(vec PRIVATE "VEC_HAVE_IMPL_INTEGER_H") |
| 231 | 146 |
| 232 ######################################################################### | 147 ######################################################################### |
| 233 | 148 |
| 234 target_sources(vec PUBLIC | |
| 235 $<INSTALL_INTERFACE:vec/vec.h> | |
| 236 $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include/vec/vec.h> | |
| 237 $<INSTALL_INTERFACE:vec/types.h> | |
| 238 $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include/vec/types.h> | |
| 239 $<INSTALL_INTERFACE:vec/cpu.h> | |
| 240 $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include/vec/cpu.h> | |
| 241 ) | |
| 242 | |
| 243 target_compile_features(vec PRIVATE $<IF:$<COMPILE_FEATURES:c_std_11>,c_std_11,c_std_99>) | 149 target_compile_features(vec PRIVATE $<IF:$<COMPILE_FEATURES:c_std_11>,c_std_11,c_std_99>) |
| 244 target_include_directories(vec PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_BINARY_DIR}/include") | 150 target_include_directories(vec PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_BINARY_DIR}/include/vec") |
| 245 | 151 |
| 246 # Installing | 152 # Installing |
| 247 | 153 |
| 248 include(GNUInstallDirs) | 154 include(GNUInstallDirs) |
| 249 | 155 |
