xref: /aosp_15_r20/external/eigen/lapack/CMakeLists.txt (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1
2project(EigenLapack CXX)
3
4include(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)
11endif()
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
22set(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
34)
35
36option(EIGEN_ENABLE_LAPACK_TESTS OFF "Enable the Lapack unit tests")
37
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
50                  EXPECTED_MD5 ab5742640617e3221a873aba44bbdc93
51                  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()
60      message(STATUS "Download of lapack_addons_3.4.1.tgz failed, LAPACK unit tests won't be enabled")
61      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
75    file(GLOB ReferenceLapack_SRCS0 RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "reference/*.f")
76    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
87endif()
88
89endif()
90
91set(EIGEN_LAPACK_TARGETS "")
92
93add_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
114get_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()
138  file(MAKE_DIRECTORY "${LAPACK_BINARY_DIR}/TESTING")
139  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}")
144    set(TEST_OUTPUT "${LAPACK_BINARY_DIR}/TESTING/${output}")
145    string(REPLACE "." "_" input_name ${input})
146    set(testName "${target}_${input_name}")
147    if(EXISTS "${TEST_INPUT}")
148      add_test(NAME LAPACK-${testName}
149        COMMAND "${CMAKE_COMMAND}"
150        -DTEST=$<TARGET_FILE:${target}>
151        -DINPUT=${TEST_INPUT}
152        -DOUTPUT=${TEST_OUTPUT}
153        -DINTDIR=${CMAKE_CFG_INTDIR}
154        -P "${LAPACK_SOURCE_DIR}/testing/runtest.cmake")
155    endif()
156  endmacro()
157
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()
452
453