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 |