blob: e48497fda0b7bb23e52c72424ba74629ea40bd56 [file] [log] [blame]
Narayan Kamathc981c482012-11-02 10:59:05 +00001
2project(EigenLapack CXX)
3
Yi Kong2aab7942022-02-25 16:32:14 +08004include(CheckLanguage)
5check_language(Fortran)
6if(CMAKE_Fortran_COMPILER)
7 enable_language(Fortran)
8 set(EIGEN_Fortran_COMPILER_WORKS ON)
9else()
10 set(EIGEN_Fortran_COMPILER_WORKS OFF)
Narayan Kamathc981c482012-11-02 10:59:05 +000011endif()
12
13add_custom_target(lapack)
14include_directories(../blas)
15
16set(EigenLapack_SRCS
17single.cpp double.cpp complex_single.cpp complex_double.cpp ../blas/xerbla.cpp
18)
19
20if(EIGEN_Fortran_COMPILER_WORKS)
21
Carlos Hernandez7faaa9f2014-08-05 17:53:32 -070022set(EigenLapack_SRCS ${EigenLapack_SRCS}
23 slarft.f dlarft.f clarft.f zlarft.f
24 slarfb.f dlarfb.f clarfb.f zlarfb.f
25 slarfg.f dlarfg.f clarfg.f zlarfg.f
26 slarf.f dlarf.f clarf.f zlarf.f
27 sladiv.f dladiv.f cladiv.f zladiv.f
28 ilaslr.f iladlr.f ilaclr.f ilazlr.f
29 ilaslc.f iladlc.f ilaclc.f ilazlc.f
30 dlapy2.f dlapy3.f slapy2.f slapy3.f
31 clacgv.f zlacgv.f
32 slamch.f dlamch.f
33 second_NONE.f dsecnd_NONE.f
Narayan Kamathc981c482012-11-02 10:59:05 +000034)
Carlos Hernandez7faaa9f2014-08-05 17:53:32 -070035
Yi Kong2aab7942022-02-25 16:32:14 +080036option(EIGEN_ENABLE_LAPACK_TESTS OFF "Enable the Lapack unit tests")
Carlos Hernandez7faaa9f2014-08-05 17:53:32 -070037
38if(EIGEN_ENABLE_LAPACK_TESTS)
39
40 get_filename_component(eigen_full_path_to_reference_lapack "./reference/" ABSOLUTE)
41 if(NOT EXISTS ${eigen_full_path_to_reference_lapack})
42 # Download lapack and install sources and testing at the right place
43 message(STATUS "Download lapack_addons_3.4.1.tgz...")
44
45 file(DOWNLOAD "http://downloads.tuxfamily.org/eigen/lapack_addons_3.4.1.tgz"
46 "${CMAKE_CURRENT_SOURCE_DIR}/lapack_addons_3.4.1.tgz"
47 INACTIVITY_TIMEOUT 15
48 TIMEOUT 240
49 STATUS download_status
Yi Kong2aab7942022-02-25 16:32:14 +080050 EXPECTED_MD5 ab5742640617e3221a873aba44bbdc93
Carlos Hernandez7faaa9f2014-08-05 17:53:32 -070051 SHOW_PROGRESS)
52
53 message(STATUS ${download_status})
54 list(GET download_status 0 download_status_num)
55 set(download_status_num 0)
56 if(download_status_num EQUAL 0)
57 message(STATUS "Setup lapack reference and lapack unit tests")
58 execute_process(COMMAND tar xzf "lapack_addons_3.4.1.tgz" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
59 else()
Yi Kong2aab7942022-02-25 16:32:14 +080060 message(STATUS "Download of lapack_addons_3.4.1.tgz failed, LAPACK unit tests won't be enabled")
Carlos Hernandez7faaa9f2014-08-05 17:53:32 -070061 set(EIGEN_ENABLE_LAPACK_TESTS false)
62 endif()
63
64 endif()
65
66 get_filename_component(eigen_full_path_to_reference_lapack "./reference/" ABSOLUTE)
67 if(EXISTS ${eigen_full_path_to_reference_lapack})
68 set(EigenLapack_funcfilenames
69 ssyev.f dsyev.f csyev.f zsyev.f
70 spotrf.f dpotrf.f cpotrf.f zpotrf.f
71 spotrs.f dpotrs.f cpotrs.f zpotrs.f
72 sgetrf.f dgetrf.f cgetrf.f zgetrf.f
73 sgetrs.f dgetrs.f cgetrs.f zgetrs.f)
74
Yi Kong2aab7942022-02-25 16:32:14 +080075 file(GLOB ReferenceLapack_SRCS0 RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "reference/*.f")
Carlos Hernandez7faaa9f2014-08-05 17:53:32 -070076 foreach(filename1 IN LISTS ReferenceLapack_SRCS0)
77 string(REPLACE "reference/" "" filename ${filename1})
78 list(FIND EigenLapack_SRCS ${filename} id1)
79 list(FIND EigenLapack_funcfilenames ${filename} id2)
80 if((id1 EQUAL -1) AND (id2 EQUAL -1))
81 set(ReferenceLapack_SRCS ${ReferenceLapack_SRCS} reference/${filename})
82 endif()
83 endforeach()
84 endif()
85
86
Narayan Kamathc981c482012-11-02 10:59:05 +000087endif()
88
Yi Kong2aab7942022-02-25 16:32:14 +080089endif()
Narayan Kamathc981c482012-11-02 10:59:05 +000090
Yi Kong2aab7942022-02-25 16:32:14 +080091set(EIGEN_LAPACK_TARGETS "")
Narayan Kamathc981c482012-11-02 10:59:05 +000092
Yi Kong2aab7942022-02-25 16:32:14 +080093add_library(eigen_lapack_static ${EigenLapack_SRCS} ${ReferenceLapack_SRCS})
94list(APPEND EIGEN_LAPACK_TARGETS eigen_lapack_static)
95
96if (EIGEN_BUILD_SHARED_LIBS)
97 add_library(eigen_lapack SHARED ${EigenLapack_SRCS})
98 list(APPEND EIGEN_LAPACK_TARGETS eigen_lapack)
99 target_link_libraries(eigen_lapack eigen_blas)
100endif()
101
102foreach(target IN LISTS EIGEN_LAPACK_TARGETS)
103 if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO)
104 target_link_libraries(${target} ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO})
105 endif()
106 add_dependencies(lapack ${target})
107 install(TARGETS ${target}
108 RUNTIME DESTINATION bin
109 LIBRARY DESTINATION lib
110 ARCHIVE DESTINATION lib)
111endforeach()
112
113
Carlos Hernandez7faaa9f2014-08-05 17:53:32 -0700114get_filename_component(eigen_full_path_to_testing_lapack "./testing/" ABSOLUTE)
115if(EXISTS ${eigen_full_path_to_testing_lapack})
116
117 # The following comes from lapack/TESTING/CMakeLists.txt
118 # Get Python
119 find_package(PythonInterp)
120 message(STATUS "Looking for Python found - ${PYTHONINTERP_FOUND}")
121 if (PYTHONINTERP_FOUND)
122 message(STATUS "Using Python version ${PYTHON_VERSION_STRING}")
123 endif()
124
125 set(LAPACK_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
126 set(LAPACK_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
127 set(BUILD_SINGLE true)
128 set(BUILD_DOUBLE true)
129 set(BUILD_COMPLEX true)
130 set(BUILD_COMPLEX16E true)
131
132 if(MSVC_VERSION)
133# string(REPLACE "/STACK:10000000" "/STACK:900000000000000000"
134# CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
135 string(REGEX REPLACE "(.*)/STACK:(.*) (.*)" "\\1/STACK:900000000000000000 \\3"
136 CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
137 endif()
Yi Kong2aab7942022-02-25 16:32:14 +0800138 file(MAKE_DIRECTORY "${LAPACK_BINARY_DIR}/TESTING")
Carlos Hernandez7faaa9f2014-08-05 17:53:32 -0700139 add_subdirectory(testing/MATGEN)
140 add_subdirectory(testing/LIN)
141 add_subdirectory(testing/EIG)
142 macro(add_lapack_test output input target)
143 set(TEST_INPUT "${LAPACK_SOURCE_DIR}/testing/${input}")
Yi Kong2aab7942022-02-25 16:32:14 +0800144 set(TEST_OUTPUT "${LAPACK_BINARY_DIR}/TESTING/${output}")
Carlos Hernandez7faaa9f2014-08-05 17:53:32 -0700145 string(REPLACE "." "_" input_name ${input})
146 set(testName "${target}_${input_name}")
147 if(EXISTS "${TEST_INPUT}")
Yi Kong2aab7942022-02-25 16:32:14 +0800148 add_test(NAME LAPACK-${testName}
149 COMMAND "${CMAKE_COMMAND}"
150 -DTEST=$<TARGET_FILE:${target}>
Carlos Hernandez7faaa9f2014-08-05 17:53:32 -0700151 -DINPUT=${TEST_INPUT}
152 -DOUTPUT=${TEST_OUTPUT}
153 -DINTDIR=${CMAKE_CFG_INTDIR}
154 -P "${LAPACK_SOURCE_DIR}/testing/runtest.cmake")
155 endif()
Yi Kong2aab7942022-02-25 16:32:14 +0800156 endmacro()
Carlos Hernandez7faaa9f2014-08-05 17:53:32 -0700157
158 if (BUILD_SINGLE)
159 add_lapack_test(stest.out stest.in xlintsts)
160 #
161 # ======== SINGLE RFP LIN TESTS ========================
162 add_lapack_test(stest_rfp.out stest_rfp.in xlintstrfs)
163 #
164 #
165 # ======== SINGLE EIG TESTS ===========================
166 #
167
168 add_lapack_test(snep.out nep.in xeigtsts)
169
170
171 add_lapack_test(ssep.out sep.in xeigtsts)
172
173
174 add_lapack_test(ssvd.out svd.in xeigtsts)
175
176
177 add_lapack_test(sec.out sec.in xeigtsts)
178
179
180 add_lapack_test(sed.out sed.in xeigtsts)
181
182
183 add_lapack_test(sgg.out sgg.in xeigtsts)
184
185
186 add_lapack_test(sgd.out sgd.in xeigtsts)
187
188
189 add_lapack_test(ssb.out ssb.in xeigtsts)
190
191
192 add_lapack_test(ssg.out ssg.in xeigtsts)
193
194
195 add_lapack_test(sbal.out sbal.in xeigtsts)
196
197
198 add_lapack_test(sbak.out sbak.in xeigtsts)
199
200
201 add_lapack_test(sgbal.out sgbal.in xeigtsts)
202
203
204 add_lapack_test(sgbak.out sgbak.in xeigtsts)
205
206
207 add_lapack_test(sbb.out sbb.in xeigtsts)
208
209
210 add_lapack_test(sglm.out glm.in xeigtsts)
211
212
213 add_lapack_test(sgqr.out gqr.in xeigtsts)
214
215
216 add_lapack_test(sgsv.out gsv.in xeigtsts)
217
218
219 add_lapack_test(scsd.out csd.in xeigtsts)
220
221
222 add_lapack_test(slse.out lse.in xeigtsts)
223 endif()
224
225 if (BUILD_DOUBLE)
226 #
227 # ======== DOUBLE LIN TESTS ===========================
228 add_lapack_test(dtest.out dtest.in xlintstd)
229 #
230 # ======== DOUBLE RFP LIN TESTS ========================
231 add_lapack_test(dtest_rfp.out dtest_rfp.in xlintstrfd)
232 #
233 # ======== DOUBLE EIG TESTS ===========================
234
235 add_lapack_test(dnep.out nep.in xeigtstd)
236
237
238 add_lapack_test(dsep.out sep.in xeigtstd)
239
240
241 add_lapack_test(dsvd.out svd.in xeigtstd)
242
243
244 add_lapack_test(dec.out dec.in xeigtstd)
245
246
247 add_lapack_test(ded.out ded.in xeigtstd)
248
249
250 add_lapack_test(dgg.out dgg.in xeigtstd)
251
252
253 add_lapack_test(dgd.out dgd.in xeigtstd)
254
255
256 add_lapack_test(dsb.out dsb.in xeigtstd)
257
258
259 add_lapack_test(dsg.out dsg.in xeigtstd)
260
261
262 add_lapack_test(dbal.out dbal.in xeigtstd)
263
264
265 add_lapack_test(dbak.out dbak.in xeigtstd)
266
267
268 add_lapack_test(dgbal.out dgbal.in xeigtstd)
269
270
271 add_lapack_test(dgbak.out dgbak.in xeigtstd)
272
273
274 add_lapack_test(dbb.out dbb.in xeigtstd)
275
276
277 add_lapack_test(dglm.out glm.in xeigtstd)
278
279
280 add_lapack_test(dgqr.out gqr.in xeigtstd)
281
282
283 add_lapack_test(dgsv.out gsv.in xeigtstd)
284
285
286 add_lapack_test(dcsd.out csd.in xeigtstd)
287
288
289 add_lapack_test(dlse.out lse.in xeigtstd)
290 endif()
291
292 if (BUILD_COMPLEX)
293 add_lapack_test(ctest.out ctest.in xlintstc)
294 #
295 # ======== COMPLEX RFP LIN TESTS ========================
296 add_lapack_test(ctest_rfp.out ctest_rfp.in xlintstrfc)
297 #
298 # ======== COMPLEX EIG TESTS ===========================
299
300 add_lapack_test(cnep.out nep.in xeigtstc)
301
302
303 add_lapack_test(csep.out sep.in xeigtstc)
304
305
306 add_lapack_test(csvd.out svd.in xeigtstc)
307
308
309 add_lapack_test(cec.out cec.in xeigtstc)
310
311
312 add_lapack_test(ced.out ced.in xeigtstc)
313
314
315 add_lapack_test(cgg.out cgg.in xeigtstc)
316
317
318 add_lapack_test(cgd.out cgd.in xeigtstc)
319
320
321 add_lapack_test(csb.out csb.in xeigtstc)
322
323
324 add_lapack_test(csg.out csg.in xeigtstc)
325
326
327 add_lapack_test(cbal.out cbal.in xeigtstc)
328
329
330 add_lapack_test(cbak.out cbak.in xeigtstc)
331
332
333 add_lapack_test(cgbal.out cgbal.in xeigtstc)
334
335
336 add_lapack_test(cgbak.out cgbak.in xeigtstc)
337
338
339 add_lapack_test(cbb.out cbb.in xeigtstc)
340
341
342 add_lapack_test(cglm.out glm.in xeigtstc)
343
344
345 add_lapack_test(cgqr.out gqr.in xeigtstc)
346
347
348 add_lapack_test(cgsv.out gsv.in xeigtstc)
349
350
351 add_lapack_test(ccsd.out csd.in xeigtstc)
352
353
354 add_lapack_test(clse.out lse.in xeigtstc)
355 endif()
356
357 if (BUILD_COMPLEX16)
358 #
359 # ======== COMPLEX16 LIN TESTS ========================
360 add_lapack_test(ztest.out ztest.in xlintstz)
361 #
362 # ======== COMPLEX16 RFP LIN TESTS ========================
363 add_lapack_test(ztest_rfp.out ztest_rfp.in xlintstrfz)
364 #
365 # ======== COMPLEX16 EIG TESTS ===========================
366
367 add_lapack_test(znep.out nep.in xeigtstz)
368
369
370 add_lapack_test(zsep.out sep.in xeigtstz)
371
372
373 add_lapack_test(zsvd.out svd.in xeigtstz)
374
375
376 add_lapack_test(zec.out zec.in xeigtstz)
377
378
379 add_lapack_test(zed.out zed.in xeigtstz)
380
381
382 add_lapack_test(zgg.out zgg.in xeigtstz)
383
384
385 add_lapack_test(zgd.out zgd.in xeigtstz)
386
387
388 add_lapack_test(zsb.out zsb.in xeigtstz)
389
390
391 add_lapack_test(zsg.out zsg.in xeigtstz)
392
393
394 add_lapack_test(zbal.out zbal.in xeigtstz)
395
396
397 add_lapack_test(zbak.out zbak.in xeigtstz)
398
399
400 add_lapack_test(zgbal.out zgbal.in xeigtstz)
401
402
403 add_lapack_test(zgbak.out zgbak.in xeigtstz)
404
405
406 add_lapack_test(zbb.out zbb.in xeigtstz)
407
408
409 add_lapack_test(zglm.out glm.in xeigtstz)
410
411
412 add_lapack_test(zgqr.out gqr.in xeigtstz)
413
414
415 add_lapack_test(zgsv.out gsv.in xeigtstz)
416
417
418 add_lapack_test(zcsd.out csd.in xeigtstz)
419
420
421 add_lapack_test(zlse.out lse.in xeigtstz)
422 endif()
423
424
425 if (BUILD_SIMPLE)
426 if (BUILD_DOUBLE)
427 #
428 # ======== SINGLE-DOUBLE PROTO LIN TESTS ==============
429 add_lapack_test(dstest.out dstest.in xlintstds)
430 endif()
431 endif()
432
433
434 if (BUILD_COMPLEX)
435 if (BUILD_COMPLEX16)
436 #
437 # ======== COMPLEX-COMPLEX16 LIN TESTS ========================
438 add_lapack_test(zctest.out zctest.in xlintstzc)
439 endif()
440 endif()
441
442 # ==============================================================================
443
444 execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${LAPACK_SOURCE_DIR}/testing/lapack_testing.py ${LAPACK_BINARY_DIR})
445 add_test(
446 NAME LAPACK_Test_Summary
447 WORKING_DIRECTORY ${LAPACK_BINARY_DIR}
448 COMMAND ${PYTHON_EXECUTABLE} "lapack_testing.py"
449 )
450
451endif()
Narayan Kamathc981c482012-11-02 10:59:05 +0000452