cannam@167
|
1 cmake_minimum_required (VERSION 3.0)
|
cannam@167
|
2
|
cannam@167
|
3 if (NOT DEFINED CMAKE_BUILD_TYPE)
|
cannam@167
|
4 set (CMAKE_BUILD_TYPE Release CACHE STRING "Build type")
|
cannam@167
|
5 endif ()
|
cannam@167
|
6
|
cannam@167
|
7 project (fftw)
|
cannam@167
|
8
|
cannam@167
|
9 if (POLICY CMP0042)
|
cannam@167
|
10 cmake_policy (SET CMP0042 NEW)
|
cannam@167
|
11 endif ()
|
cannam@167
|
12
|
cannam@167
|
13 option (BUILD_SHARED_LIBS "Build shared libraries" ON)
|
cannam@167
|
14 option (BUILD_TESTS "Build tests" ON)
|
cannam@167
|
15
|
cannam@167
|
16 option (ENABLE_OPENMP "Use OpenMP for multithreading" OFF)
|
cannam@167
|
17 option (ENABLE_THREADS "Use pthread for multithreading" OFF)
|
cannam@167
|
18 option (WITH_COMBINED_THREADS "Merge thread library" OFF)
|
cannam@167
|
19
|
cannam@167
|
20 option (ENABLE_FLOAT "single-precision" OFF)
|
cannam@167
|
21 option (ENABLE_LONG_DOUBLE "long-double precision" OFF)
|
cannam@167
|
22 option (ENABLE_QUAD_PRECISION "quadruple-precision" OFF)
|
cannam@167
|
23
|
cannam@167
|
24 option (ENABLE_SSE "Compile with SSE instruction set support" OFF)
|
cannam@167
|
25 option (ENABLE_SSE2 "Compile with SSE2 instruction set support" OFF)
|
cannam@167
|
26 option (ENABLE_AVX "Compile with AVX instruction set support" OFF)
|
cannam@167
|
27 option (ENABLE_AVX2 "Compile with AVX2 instruction set support" OFF)
|
cannam@167
|
28
|
cannam@167
|
29 option (DISABLE_FORTRAN "Disable Fortran wrapper routines" OFF)
|
cannam@167
|
30
|
cannam@167
|
31 include(GNUInstallDirs)
|
cannam@167
|
32
|
cannam@167
|
33
|
cannam@167
|
34 include (CheckIncludeFile)
|
cannam@167
|
35 check_include_file (alloca.h HAVE_ALLOCA_H)
|
cannam@167
|
36 check_include_file (altivec.h HAVE_ALTIVEC_H)
|
cannam@167
|
37 check_include_file (c_asm.h HAVE_C_ASM_H)
|
cannam@167
|
38 check_include_file (dlfcn.h HAVE_DLFCN_H)
|
cannam@167
|
39 check_include_file (intrinsics.h HAVE_INTRINSICS_H)
|
cannam@167
|
40 check_include_file (inttypes.h HAVE_INTTYPES_H)
|
cannam@167
|
41 check_include_file (libintl.h HAVE_LIBINTL_H)
|
cannam@167
|
42 check_include_file (limits.h HAVE_LIMITS_H)
|
cannam@167
|
43 check_include_file (mach/mach_time.h HAVE_MACH_MACH_TIME_H)
|
cannam@167
|
44 check_include_file (malloc.h HAVE_MALLOC_H)
|
cannam@167
|
45 check_include_file (memory.h HAVE_MEMORY_H)
|
cannam@167
|
46 check_include_file (stddef.h HAVE_STDDEF_H)
|
cannam@167
|
47 check_include_file (stdint.h HAVE_STDINT_H)
|
cannam@167
|
48 check_include_file (stdlib.h HAVE_STDLIB_H)
|
cannam@167
|
49 check_include_file (string.h HAVE_STRING_H)
|
cannam@167
|
50 check_include_file (strings.h HAVE_STRINGS_H)
|
cannam@167
|
51 check_include_file (sys/types.h HAVE_SYS_TYPES_H)
|
cannam@167
|
52 check_include_file (sys/time.h HAVE_SYS_TIME_H)
|
cannam@167
|
53 check_include_file (sys/stat.h HAVE_SYS_STAT_H)
|
cannam@167
|
54 check_include_file (sys/sysctl.h HAVE_SYS_SYSCTL_H)
|
cannam@167
|
55 check_include_file (time.h HAVE_TIME_H)
|
cannam@167
|
56 check_include_file (uintptr.h HAVE_UINTPTR_H)
|
cannam@167
|
57 check_include_file (unistd.h HAVE_UNISTD_H)
|
cannam@167
|
58 if (HAVE_TIME_H AND HAVE_SYS_TIME_H)
|
cannam@167
|
59 set (TIME_WITH_SYS_TIME TRUE)
|
cannam@167
|
60 endif ()
|
cannam@167
|
61
|
cannam@167
|
62 include (CheckPrototypeDefinition)
|
cannam@167
|
63 check_prototype_definition (drand48 "double drand48 (void)" "0" stdlib.h HAVE_DECL_DRAND48)
|
cannam@167
|
64 check_prototype_definition (srand48 "void srand48(long int seedval)" "0" stdlib.h HAVE_DECL_SRAND48)
|
cannam@167
|
65 check_prototype_definition (cosl "long double cosl( long double arg )" "0" math.h HAVE_DECL_COSL)
|
cannam@167
|
66 check_prototype_definition (sinl "long double sinl( long double arg )" "0" math.h HAVE_DECL_SINL)
|
cannam@167
|
67 check_prototype_definition (memalign "void *memalign(size_t alignment, size_t size)" "0" malloc.h HAVE_DECL_MEMALIGN)
|
cannam@167
|
68 check_prototype_definition (posix_memalign "int posix_memalign(void **memptr, size_t alignment, size_t size)" "0" stdlib.h HAVE_DECL_POSIX_MEMALIGN)
|
cannam@167
|
69
|
cannam@167
|
70 include (CheckSymbolExists)
|
cannam@167
|
71 check_symbol_exists (clock_gettime time.h HAVE_CLOCK_GETTIME)
|
cannam@167
|
72 check_symbol_exists (gettimeofday sys/time.h HAVE_GETTIMEOFDAY)
|
cannam@167
|
73 check_symbol_exists (getpagesize unistd.h HAVE_GETPAGESIZE)
|
cannam@167
|
74 check_symbol_exists (drand48 stdlib.h HAVE_DRAND48)
|
cannam@167
|
75 check_symbol_exists (srand48 stdlib.h HAVE_SRAND48)
|
cannam@167
|
76 check_symbol_exists (memalign malloc.h HAVE_MEMALIGN)
|
cannam@167
|
77 check_symbol_exists (posix_memalign stdlib.h HAVE_POSIX_MEMALIGN)
|
cannam@167
|
78 check_symbol_exists (mach_absolute_time mach/mach_time.h HAVE_MACH_ABSOLUTE_TIME)
|
cannam@167
|
79 check_symbol_exists (alloca alloca.h HAVE_ALLOCA)
|
cannam@167
|
80 if (NOT HAVE_ALLOCA)
|
cannam@167
|
81 unset (HAVE_ALLOCA CACHE)
|
cannam@167
|
82 check_symbol_exists (alloca malloc.h HAVE_ALLOCA)
|
cannam@167
|
83 endif ()
|
cannam@167
|
84 check_symbol_exists (isnan math.h HAVE_ISNAN)
|
cannam@167
|
85 check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF)
|
cannam@167
|
86 check_symbol_exists (strchr string.h HAVE_STRCHR)
|
cannam@167
|
87 check_symbol_exists (sysctl unistd.h HAVE_SYSCTL)
|
cannam@167
|
88
|
cannam@167
|
89 if (UNIX)
|
cannam@167
|
90 set (CMAKE_REQUIRED_LIBRARIES m)
|
cannam@167
|
91 endif ()
|
cannam@167
|
92 check_symbol_exists (cosl math.h HAVE_COSL)
|
cannam@167
|
93 check_symbol_exists (sinl math.h HAVE_SINL)
|
cannam@167
|
94
|
cannam@167
|
95 include (CheckTypeSize)
|
cannam@167
|
96 check_type_size ("float" SIZEOF_FLOAT)
|
cannam@167
|
97 check_type_size ("double" SIZEOF_DOUBLE)
|
cannam@167
|
98 check_type_size ("int" SIZEOF_INT)
|
cannam@167
|
99 check_type_size ("long" SIZEOF_LONG)
|
cannam@167
|
100 check_type_size ("long long" SIZEOF_LONG_LONG)
|
cannam@167
|
101 check_type_size ("unsigned int" SIZEOF_UNSIGNED_INT)
|
cannam@167
|
102 check_type_size ("unsigned long" SIZEOF_UNSIGNED_LONG)
|
cannam@167
|
103 check_type_size ("unsigned long long" SIZEOF_UNSIGNED_LONG_LONG)
|
cannam@167
|
104 check_type_size ("size_t" SIZEOF_SIZE_T)
|
cannam@167
|
105 check_type_size ("ptrdiff_t" SIZEOF_PTRDIFF_T)
|
cannam@167
|
106 math (EXPR SIZEOF_INT_BITS "8 * ${SIZEOF_INT}")
|
cannam@167
|
107 set (C_FFTW_R2R_KIND "C_INT${SIZEOF_INT_BITS}_T")
|
cannam@167
|
108
|
cannam@167
|
109 find_library (LIBM_LIBRARY NAMES m)
|
cannam@167
|
110 if (LIBM_LIBRARY)
|
cannam@167
|
111 set (HAVE_LIBM TRUE)
|
cannam@167
|
112 endif ()
|
cannam@167
|
113
|
cannam@167
|
114
|
cannam@167
|
115 if (ENABLE_THREADS)
|
cannam@167
|
116 find_package (Threads)
|
cannam@167
|
117 endif ()
|
cannam@167
|
118 if (Threads_FOUND)
|
cannam@167
|
119 if(CMAKE_USE_PTHREADS_INIT)
|
cannam@167
|
120 set (USING_POSIX_THREADS 1)
|
cannam@167
|
121 endif ()
|
cannam@167
|
122 set (HAVE_THREADS TRUE)
|
cannam@167
|
123 endif ()
|
cannam@167
|
124
|
cannam@167
|
125 if (ENABLE_OPENMP)
|
cannam@167
|
126 find_package (OpenMP)
|
cannam@167
|
127 endif ()
|
cannam@167
|
128 if (OPENMP_FOUND)
|
cannam@167
|
129 set (HAVE_OPENMP TRUE)
|
cannam@167
|
130 endif ()
|
cannam@167
|
131
|
cannam@167
|
132 include (CheckCCompilerFlag)
|
cannam@167
|
133
|
cannam@167
|
134 if (ENABLE_SSE)
|
cannam@167
|
135 foreach (FLAG "-msse" "/arch:SSE")
|
cannam@167
|
136 unset (HAVE_SSE CACHE)
|
cannam@167
|
137 check_c_compiler_flag (${FLAG} HAVE_SSE)
|
cannam@167
|
138 if (HAVE_SSE)
|
cannam@167
|
139 set (SSE_FLAG ${FLAG})
|
cannam@167
|
140 break()
|
cannam@167
|
141 endif ()
|
cannam@167
|
142 endforeach ()
|
cannam@167
|
143 endif ()
|
cannam@167
|
144
|
cannam@167
|
145 if (ENABLE_SSE2)
|
cannam@167
|
146 foreach (FLAG "-msse2" "/arch:SSE2")
|
cannam@167
|
147 unset (HAVE_SSE2 CACHE)
|
cannam@167
|
148 check_c_compiler_flag (${FLAG} HAVE_SSE2)
|
cannam@167
|
149 if (HAVE_SSE2)
|
cannam@167
|
150 set (SSE2_FLAG ${FLAG})
|
cannam@167
|
151 break()
|
cannam@167
|
152 endif ()
|
cannam@167
|
153 endforeach ()
|
cannam@167
|
154 endif ()
|
cannam@167
|
155
|
cannam@167
|
156 if (ENABLE_AVX)
|
cannam@167
|
157 foreach (FLAG "-mavx" "/arch:AVX")
|
cannam@167
|
158 unset (HAVE_AVX CACHE)
|
cannam@167
|
159 check_c_compiler_flag (${FLAG} HAVE_AVX)
|
cannam@167
|
160 if (HAVE_AVX)
|
cannam@167
|
161 set (AVX_FLAG ${FLAG})
|
cannam@167
|
162 break()
|
cannam@167
|
163 endif ()
|
cannam@167
|
164 endforeach ()
|
cannam@167
|
165 endif ()
|
cannam@167
|
166
|
cannam@167
|
167 if (ENABLE_AVX2)
|
cannam@167
|
168 foreach (FLAG "-mavx2" "/arch:AVX2")
|
cannam@167
|
169 unset (HAVE_AVX2 CACHE)
|
cannam@167
|
170 check_c_compiler_flag (${FLAG} HAVE_AVX2)
|
cannam@167
|
171 if (HAVE_AVX2)
|
cannam@167
|
172 set (AVX2_FLAG ${FLAG})
|
cannam@167
|
173 break()
|
cannam@167
|
174 endif ()
|
cannam@167
|
175 endforeach ()
|
cannam@167
|
176 endif ()
|
cannam@167
|
177
|
cannam@167
|
178 # AVX2 codelets require FMA support as well
|
cannam@167
|
179 if (ENABLE_AVX2)
|
cannam@167
|
180 foreach (FLAG "-mfma" "/arch:FMA")
|
cannam@167
|
181 unset (HAVE_FMA CACHE)
|
cannam@167
|
182 check_c_compiler_flag (${FLAG} HAVE_FMA)
|
cannam@167
|
183 if (HAVE_FMA)
|
cannam@167
|
184 set (FMA_FLAG ${FLAG})
|
cannam@167
|
185 break()
|
cannam@167
|
186 endif ()
|
cannam@167
|
187 endforeach ()
|
cannam@167
|
188 endif ()
|
cannam@167
|
189
|
cannam@167
|
190 if (HAVE_SSE2 OR HAVE_AVX)
|
cannam@167
|
191 set (HAVE_SIMD TRUE)
|
cannam@167
|
192 endif ()
|
cannam@167
|
193 file(GLOB fftw_api_SOURCE api/*.c api/*.h)
|
cannam@167
|
194 file(GLOB fftw_dft_SOURCE dft/*.c dft/*.h)
|
cannam@167
|
195 file(GLOB fftw_dft_scalar_SOURCE dft/scalar/*.c dft/scalar/*.h)
|
cannam@167
|
196 file(GLOB fftw_dft_scalar_codelets_SOURCE dft/scalar/codelets/*.c dft/scalar/codelets/*.h)
|
cannam@167
|
197 file(GLOB fftw_dft_simd_SOURCE dft/simd/*.c dft/simd/*.h)
|
cannam@167
|
198
|
cannam@167
|
199 file(GLOB fftw_dft_simd_sse2_SOURCE dft/simd/sse2/*.c dft/simd/sse2/*.h)
|
cannam@167
|
200 file(GLOB fftw_dft_simd_avx_SOURCE dft/simd/avx/*.c dft/simd/avx/*.h)
|
cannam@167
|
201 file(GLOB fftw_dft_simd_avx2_SOURCE dft/simd/avx2/*.c dft/simd/avx2/*.h dft/simd/avx2-128/*.c dft/simd/avx2-128/*.h)
|
cannam@167
|
202 file(GLOB fftw_kernel_SOURCE kernel/*.c kernel/*.h)
|
cannam@167
|
203 file(GLOB fftw_rdft_SOURCE rdft/*.c rdft/*.h)
|
cannam@167
|
204 file(GLOB fftw_rdft_scalar_SOURCE rdft/scalar/*.c rdft/scalar/*.h)
|
cannam@167
|
205
|
cannam@167
|
206 file(GLOB fftw_rdft_scalar_r2cb_SOURCE rdft/scalar/r2cb/*.c
|
cannam@167
|
207 rdft/scalar/r2cb/*.h)
|
cannam@167
|
208 file(GLOB fftw_rdft_scalar_r2cf_SOURCE rdft/scalar/r2cf/*.c
|
cannam@167
|
209 rdft/scalar/r2cf/*.h)
|
cannam@167
|
210 file(GLOB fftw_rdft_scalar_r2r_SOURCE rdft/scalar/r2r/*.c
|
cannam@167
|
211 rdft/scalar/r2r/*.h)
|
cannam@167
|
212
|
cannam@167
|
213 file(GLOB fftw_rdft_simd_SOURCE rdft/simd/*.c rdft/simd/*.h)
|
cannam@167
|
214 file(GLOB fftw_rdft_simd_sse2_SOURCE rdft/simd/sse2/*.c rdft/simd/sse2/*.h)
|
cannam@167
|
215 file(GLOB fftw_rdft_simd_avx_SOURCE rdft/simd/avx/*.c rdft/simd/avx/*.h)
|
cannam@167
|
216 file(GLOB fftw_rdft_simd_avx2_SOURCE rdft/simd/avx2/*.c rdft/simd/avx2/*.h rdft/simd/avx2-128/*.c rdft/simd/avx2-128/*.h)
|
cannam@167
|
217
|
cannam@167
|
218 file(GLOB fftw_reodft_SOURCE reodft/*.c reodft/*.h)
|
cannam@167
|
219 file(GLOB fftw_simd_support_SOURCE simd-support/*.c simd-support/*.h)
|
cannam@167
|
220 file(GLOB fftw_libbench2_SOURCE libbench2/*.c libbench2/*.h)
|
cannam@167
|
221 list (REMOVE_ITEM fftw_libbench2_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/libbench2/useropt.c)
|
cannam@167
|
222
|
cannam@167
|
223 set(SOURCEFILES
|
cannam@167
|
224 ${fftw_api_SOURCE}
|
cannam@167
|
225 ${fftw_dft_SOURCE}
|
cannam@167
|
226 ${fftw_dft_scalar_SOURCE}
|
cannam@167
|
227 ${fftw_dft_scalar_codelets_SOURCE}
|
cannam@167
|
228 ${fftw_dft_simd_SOURCE}
|
cannam@167
|
229 ${fftw_kernel_SOURCE}
|
cannam@167
|
230 ${fftw_rdft_SOURCE}
|
cannam@167
|
231 ${fftw_rdft_scalar_SOURCE}
|
cannam@167
|
232
|
cannam@167
|
233 ${fftw_rdft_scalar_r2cb_SOURCE}
|
cannam@167
|
234 ${fftw_rdft_scalar_r2cf_SOURCE}
|
cannam@167
|
235 ${fftw_rdft_scalar_r2r_SOURCE}
|
cannam@167
|
236
|
cannam@167
|
237 ${fftw_rdft_simd_SOURCE}
|
cannam@167
|
238 ${fftw_reodft_SOURCE}
|
cannam@167
|
239 ${fftw_simd_support_SOURCE}
|
cannam@167
|
240 ${fftw_threads_SOURCE}
|
cannam@167
|
241 )
|
cannam@167
|
242
|
cannam@167
|
243 set(fftw_par_SOURCE
|
cannam@167
|
244 threads/api.c
|
cannam@167
|
245 threads/conf.c
|
cannam@167
|
246 threads/ct.c
|
cannam@167
|
247 threads/dft-vrank-geq1.c
|
cannam@167
|
248 threads/f77api.c
|
cannam@167
|
249 threads/hc2hc.c
|
cannam@167
|
250 threads/rdft-vrank-geq1.c
|
cannam@167
|
251 threads/vrank-geq1-rdft2.c)
|
cannam@167
|
252
|
cannam@167
|
253 set (fftw_threads_SOURCE ${fftw_par_SOURCE} threads/threads.c)
|
cannam@167
|
254 set (fftw_omp_SOURCE ${fftw_par_SOURCE} threads/openmp.c)
|
cannam@167
|
255
|
cannam@167
|
256
|
cannam@167
|
257 include_directories (.)
|
cannam@167
|
258
|
cannam@167
|
259
|
cannam@167
|
260 if (WITH_COMBINED_THREADS)
|
cannam@167
|
261 list (APPEND SOURCEFILES ${fftw_threads_SOURCE})
|
cannam@167
|
262 endif ()
|
cannam@167
|
263
|
cannam@167
|
264
|
cannam@167
|
265 if (HAVE_SSE2)
|
cannam@167
|
266 list (APPEND SOURCEFILES ${fftw_dft_simd_sse2_SOURCE} ${fftw_rdft_simd_sse2_SOURCE})
|
cannam@167
|
267 endif ()
|
cannam@167
|
268
|
cannam@167
|
269 if (HAVE_AVX)
|
cannam@167
|
270 list (APPEND SOURCEFILES ${fftw_dft_simd_avx_SOURCE} ${fftw_rdft_simd_avx_SOURCE})
|
cannam@167
|
271 endif ()
|
cannam@167
|
272
|
cannam@167
|
273 if (HAVE_AVX2)
|
cannam@167
|
274 list (APPEND SOURCEFILES ${fftw_dft_simd_avx2_SOURCE} ${fftw_rdft_simd_avx2_SOURCE})
|
cannam@167
|
275 endif ()
|
cannam@167
|
276
|
cannam@167
|
277 set (FFTW_VERSION 3.3.7)
|
cannam@167
|
278
|
cannam@167
|
279 set (PREC_SUFFIX)
|
cannam@167
|
280 if (ENABLE_FLOAT)
|
cannam@167
|
281 set (FFTW_SINGLE TRUE)
|
cannam@167
|
282 set (BENCHFFT_SINGLE TRUE)
|
cannam@167
|
283 set (PREC_SUFFIX f)
|
cannam@167
|
284 endif ()
|
cannam@167
|
285
|
cannam@167
|
286 if (ENABLE_LONG_DOUBLE)
|
cannam@167
|
287 set (FFTW_LDOUBLE TRUE)
|
cannam@167
|
288 set (BENCHFFT_LDOUBLE TRUE)
|
cannam@167
|
289 set (PREC_SUFFIX l)
|
cannam@167
|
290 endif ()
|
cannam@167
|
291
|
cannam@167
|
292 if (ENABLE_QUAD_PRECISION)
|
cannam@167
|
293 set (FFTW_QUAD TRUE)
|
cannam@167
|
294 set (BENCHFFT_QUAD TRUE)
|
cannam@167
|
295 set (PREC_SUFFIX q)
|
cannam@167
|
296 endif ()
|
cannam@167
|
297 set (fftw3_lib fftw3${PREC_SUFFIX})
|
cannam@167
|
298
|
cannam@167
|
299 configure_file (cmake.config.h.in config.h @ONLY)
|
cannam@167
|
300 include_directories (${CMAKE_CURRENT_BINARY_DIR})
|
cannam@167
|
301
|
cannam@167
|
302 if (BUILD_SHARED_LIBS)
|
cannam@167
|
303 add_definitions (-DFFTW_DLL)
|
cannam@167
|
304 endif ()
|
cannam@167
|
305
|
cannam@167
|
306 add_library (${fftw3_lib} ${SOURCEFILES})
|
cannam@167
|
307 target_include_directories (${fftw3_lib} INTERFACE $<INSTALL_INTERFACE:include>)
|
cannam@167
|
308 if (MSVC)
|
cannam@167
|
309 target_compile_definitions (${fftw3_lib} PRIVATE /bigobj)
|
cannam@167
|
310 endif ()
|
cannam@167
|
311 if (HAVE_SSE)
|
cannam@167
|
312 target_compile_options (${fftw3_lib} PRIVATE ${SSE_FLAG})
|
cannam@167
|
313 endif ()
|
cannam@167
|
314 if (HAVE_SSE2)
|
cannam@167
|
315 target_compile_options (${fftw3_lib} PRIVATE ${SSE2_FLAG})
|
cannam@167
|
316 endif ()
|
cannam@167
|
317 if (HAVE_AVX)
|
cannam@167
|
318 target_compile_options (${fftw3_lib} PRIVATE ${AVX_FLAG})
|
cannam@167
|
319 endif ()
|
cannam@167
|
320 if (HAVE_AVX2)
|
cannam@167
|
321 target_compile_options (${fftw3_lib} PRIVATE ${AVX2_FLAG})
|
cannam@167
|
322 endif ()
|
cannam@167
|
323 if (HAVE_FMA)
|
cannam@167
|
324 target_compile_options (${fftw3_lib} PRIVATE ${FMA_FLAG})
|
cannam@167
|
325 endif ()
|
cannam@167
|
326 if (HAVE_LIBM)
|
cannam@167
|
327 target_link_libraries (${fftw3_lib} m)
|
cannam@167
|
328 endif ()
|
cannam@167
|
329
|
cannam@167
|
330 set (subtargets ${fftw3_lib})
|
cannam@167
|
331
|
cannam@167
|
332 if (Threads_FOUND)
|
cannam@167
|
333 if (WITH_COMBINED_THREADS)
|
cannam@167
|
334 target_link_libraries (${fftw3_lib} ${CMAKE_THREAD_LIBS_INIT})
|
cannam@167
|
335 else ()
|
cannam@167
|
336 add_library (${fftw3_lib}_threads ${fftw_threads_SOURCE})
|
cannam@167
|
337 target_include_directories (${fftw3_lib}_threads INTERFACE $<INSTALL_INTERFACE:include>)
|
cannam@167
|
338 target_link_libraries (${fftw3_lib}_threads ${fftw3_lib})
|
cannam@167
|
339 target_link_libraries (${fftw3_lib}_threads ${CMAKE_THREAD_LIBS_INIT})
|
cannam@167
|
340 list (APPEND subtargets ${fftw3_lib}_threads)
|
cannam@167
|
341 endif ()
|
cannam@167
|
342 endif ()
|
cannam@167
|
343
|
cannam@167
|
344 if (OPENMP_FOUND)
|
cannam@167
|
345 add_library (${fftw3_lib}_omp ${fftw_omp_SOURCE})
|
cannam@167
|
346 target_include_directories (${fftw3_lib}_omp INTERFACE $<INSTALL_INTERFACE:include>)
|
cannam@167
|
347 target_link_libraries (${fftw3_lib}_omp ${fftw3_lib})
|
cannam@167
|
348 target_link_libraries (${fftw3_lib}_omp ${CMAKE_THREAD_LIBS_INIT})
|
cannam@167
|
349 list (APPEND subtargets ${fftw3_lib}_omp)
|
cannam@167
|
350 target_compile_options (${fftw3_lib}_omp PRIVATE ${OpenMP_C_FLAGS})
|
cannam@167
|
351 endif ()
|
cannam@167
|
352
|
cannam@167
|
353 foreach(subtarget ${subtargets})
|
cannam@167
|
354 set_target_properties (${subtarget} PROPERTIES SOVERSION 3.5.7 VERSION 3)
|
cannam@167
|
355 install (TARGETS ${subtarget}
|
cannam@167
|
356 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
cannam@167
|
357 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
cannam@167
|
358 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
cannam@167
|
359 endforeach ()
|
cannam@167
|
360 install(TARGETS ${fftw3_lib}
|
cannam@167
|
361 EXPORT FFTW3LibraryDepends
|
cannam@167
|
362 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
cannam@167
|
363 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
cannam@167
|
364 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
cannam@167
|
365
|
cannam@167
|
366 install (FILES api/fftw3.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
cannam@167
|
367 if (EXISTS ${CMAKE_SOURCE_DIR}/api/fftw3.f)
|
cannam@167
|
368 install (FILES api/fftw3.f api/fftw3l.f03 api/fftw3q.f03 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
cannam@167
|
369 endif ()
|
cannam@167
|
370 if (EXISTS ${CMAKE_SOURCE_DIR}/api/fftw3.f03.in)
|
cannam@167
|
371 file (READ api/fftw3.f03.in FFTW3_F03_IN OFFSET 42)
|
cannam@167
|
372 file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/fftw3.f03 "! Generated automatically. DO NOT EDIT!\n\n")
|
cannam@167
|
373 file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/fftw3.f03 " integer, parameter :: C_FFTW_R2R_KIND = ${C_FFTW_R2R_KIND}\n\n")
|
cannam@167
|
374 file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/fftw3.f03 "${FFTW3_F03_IN}")
|
cannam@167
|
375 install (FILES ${CMAKE_CURRENT_BINARY_DIR}/fftw3.f03 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
cannam@167
|
376 endif ()
|
cannam@167
|
377
|
cannam@167
|
378 if (BUILD_TESTS)
|
cannam@167
|
379
|
cannam@167
|
380 add_executable (bench ${fftw_libbench2_SOURCE} tests/bench.c tests/hook.c tests/fftw-bench.c)
|
cannam@167
|
381
|
cannam@167
|
382 if (ENABLE_THREADS AND NOT WITH_COMBINED_THREADS)
|
cannam@167
|
383 target_link_libraries (bench ${fftw3_lib}_threads)
|
cannam@167
|
384 else ()
|
cannam@167
|
385 target_link_libraries (bench ${fftw3_lib})
|
cannam@167
|
386 endif ()
|
cannam@167
|
387
|
cannam@167
|
388
|
cannam@167
|
389 enable_testing ()
|
cannam@167
|
390
|
cannam@167
|
391 if (Threads_FOUND)
|
cannam@167
|
392
|
cannam@167
|
393 macro (fftw_add_test problem)
|
cannam@167
|
394 add_test (NAME ${problem} COMMAND bench -s ${problem})
|
cannam@167
|
395 endmacro ()
|
cannam@167
|
396
|
cannam@167
|
397 fftw_add_test (32x64)
|
cannam@167
|
398 fftw_add_test (ib256)
|
cannam@167
|
399
|
cannam@167
|
400 endif ()
|
cannam@167
|
401 endif ()
|
cannam@167
|
402
|
cannam@167
|
403 # pkgconfig file
|
cannam@167
|
404 set (prefix ${CMAKE_INSTALL_PREFIX})
|
cannam@167
|
405 set (exec_prefix ${CMAKE_INSTALL_PREFIX})
|
cannam@167
|
406 set (libdir ${CMAKE_INSTALL_FULL_LIBDIR})
|
cannam@167
|
407 set (includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR})
|
cannam@167
|
408 set (VERSION ${FFTW_VERSION})
|
cannam@167
|
409 configure_file (fftw.pc.in fftw${PREC_SUFFIX}.pc @ONLY)
|
cannam@167
|
410 install (FILES
|
cannam@167
|
411 ${CMAKE_CURRENT_BINARY_DIR}/fftw${PREC_SUFFIX}.pc
|
cannam@167
|
412 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
|
cannam@167
|
413 COMPONENT Development)
|
cannam@167
|
414
|
cannam@167
|
415 # cmake file
|
cannam@167
|
416 set (FFTW3_LIBRARIES "FFTW3::${fftw3_lib}")
|
cannam@167
|
417 configure_file (FFTW3Config.cmake.in FFTW3${PREC_SUFFIX}Config.cmake @ONLY)
|
cannam@167
|
418 configure_file (FFTW3ConfigVersion.cmake.in FFTW3${PREC_SUFFIX}ConfigVersion.cmake @ONLY)
|
cannam@167
|
419 install (FILES
|
cannam@167
|
420 ${CMAKE_CURRENT_BINARY_DIR}/FFTW3${PREC_SUFFIX}Config.cmake
|
cannam@167
|
421 ${CMAKE_CURRENT_BINARY_DIR}/FFTW3${PREC_SUFFIX}ConfigVersion.cmake
|
cannam@167
|
422 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/fftw3${PREC_SUFFIX}
|
cannam@167
|
423 COMPONENT Development)
|
cannam@167
|
424
|
cannam@167
|
425 export (TARGETS ${fftw3_lib} NAMESPACE FFTW3:: FILE ${PROJECT_BINARY_DIR}/FFTW3LibraryDepends.cmake)
|
cannam@167
|
426 install(EXPORT FFTW3LibraryDepends
|
cannam@167
|
427 NAMESPACE FFTW3::
|
cannam@167
|
428 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/fftw3${PREC_SUFFIX}
|
cannam@167
|
429 COMPONENT Development)
|