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