|
1 | | -cmake_minimum_required(VERSION 3.6) |
| 1 | +cmake_minimum_required(VERSION 3.11) |
| 2 | +# VERSION 3.11: FetchContent |
2 | 3 |
|
3 | 4 | project(LAPACK) |
4 | 5 |
|
|
10 | 11 | ${LAPACK_MAJOR_VERSION}.${LAPACK_MINOR_VERSION}.${LAPACK_PATCH_VERSION} |
11 | 12 | ) |
12 | 13 |
|
| 14 | +# Dependencies on other projects |
| 15 | +include(FetchContent) |
| 16 | +FetchContent_Declare( |
| 17 | + blaspp |
| 18 | + GIT_REPOSITORY https://github.com/icl-utk-edu/blaspp |
| 19 | + GIT_TAG 3c47832f5162b5215b2164c21c4132544c65563d # v2023.11.05 |
| 20 | +) |
| 21 | +FetchContent_Declare( |
| 22 | + lapackpp |
| 23 | + GIT_REPOSITORY https://github.com/icl-utk-edu/lapackpp |
| 24 | + GIT_TAG e3aa0156b873d1e1349d083d7e5b66cfbdf9fb08 # v2023.11.05 |
| 25 | +) |
| 26 | + |
13 | 27 | # Allow setting a prefix for the library names |
14 | 28 | set(CMAKE_STATIC_LIBRARY_PREFIX "lib${LIBRARY_PREFIX}") |
15 | 29 | set(CMAKE_SHARED_LIBRARY_PREFIX "lib${LIBRARY_PREFIX}") |
@@ -402,48 +416,113 @@ endif() |
402 | 416 | option(BLAS++ "Build BLAS++" OFF) |
403 | 417 | option(LAPACK++ "Build LAPACK++" OFF) |
404 | 418 |
|
| 419 | +if (BLAS++ OR LAPACK++) |
| 420 | + message( STATUS "BLAS++ enabled; for support, email [email protected]" ) |
| 421 | + |
| 422 | + # Check if population has already been performed |
| 423 | + FetchContent_GetProperties(blaspp) |
| 424 | + if(NOT blaspp_POPULATED) |
| 425 | + # Fetch the content using previously declared details |
| 426 | + FetchContent_Populate(blaspp) |
| 427 | + endif() |
| 428 | + |
| 429 | + # Determine Fortran runtime library. |
| 430 | + # todo: CMake ought to know this already -- how to access? |
| 431 | + set( Fortran_LIB "" ) |
| 432 | + if (NOT BUILD_SHARED_LIBS) |
| 433 | + if (CMAKE_Fortran_COMPILER_ID MATCHES GNU) |
| 434 | + set( Fortran_LIB ";-lgfortran" ) |
| 435 | + else() |
| 436 | + # TODO: This is incomplete. Fill in the other cases. |
| 437 | + endif() |
| 438 | + endif() |
| 439 | + message( DEBUG "Fortran_LIB '${Fortran_LIB}'" ) |
405 | 440 |
|
406 | | -function(_display_cpp_implementation_msg name) |
407 | | - string(TOLOWER ${name} name_lc) |
408 | | - message(STATUS "${name}++ enable") |
409 | | - message(STATUS "----------------") |
410 | | - message(STATUS "Thank you for your interest in ${name}++, a newly developed C++ API for ${name} library") |
411 | | - message(STATUS "The objective of ${name}++ is to provide a convenient, performance oriented API for development in the C++ language, that, for the most part, preserves established conventions, while, at the same time, takes advantages of modern C++ features, such as: namespaces, templates, exceptions, etc.") |
412 | | - message( STATUS "For support ${name}++ related question, please email: [email protected]") |
413 | | - message(STATUS "----------------") |
414 | | -endfunction() |
415 | | -if (BLAS++) |
416 | | - _display_cpp_implementation_msg("BLAS") |
417 | | - include(ExternalProject) |
418 | | - ExternalProject_Add(blaspp |
419 | | - URL https://bitbucket.org/icl/blaspp/downloads/blaspp-2020.10.02.tar.gz |
420 | | - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/blaspp-prefix/src/blaspp |
421 | | - BUILD_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build . |
422 | | - INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install . |
423 | | - ) |
424 | | - ExternalProject_Add_StepDependencies(blaspp build ${BLAS_LIBRARIES}) |
| 441 | + if (NOT BLAS_FOUND) |
| 442 | + # Link with Reference BLAS. |
| 443 | + set( BLAS_LIBS "$<TARGET_FILE:${BLASLIB}>${Fortran_LIB}" ) |
| 444 | + else() |
| 445 | + # Link with optimized BLAS. |
| 446 | + set( BLAS_LIBS "${BLAS_LIBRARIES}" ) |
| 447 | + endif() |
| 448 | + message( DEBUG "BLAS_LIBS '${BLAS_LIBS}'" ) |
| 449 | + |
| 450 | + if (NOT LATESTLAPACK_FOUND) |
| 451 | + # Link with Reference LAPACK. |
| 452 | + set( LAPACK_LIBS "$<TARGET_FILE:${LAPACKLIB}>${Fortran_LIB}" ) |
| 453 | + else() |
| 454 | + # Link with optimized BLAS. |
| 455 | + set( LAPACK_LIBS "${LAPACK_LIBRARIES}" ) |
| 456 | + endif() |
| 457 | + message( DEBUG "LAPACK_LIBS '${LAPACK_LIBS}'" ) |
| 458 | + |
| 459 | + # Adds target blaspp |
| 460 | + add_custom_target( blaspp ALL DEPENDS blaspp-cmd ) |
| 461 | + add_custom_command( OUTPUT blaspp-cmd |
| 462 | + WORKING_DIRECTORY "${blaspp_SOURCE_DIR}" |
| 463 | + COMMENT "Building BLAS++" ) |
| 464 | + |
| 465 | + # Set up information about the BLAS and LAPACK libraries |
| 466 | + add_custom_command( OUTPUT blaspp-cmd APPEND |
| 467 | + COMMAND ${CMAKE_COMMAND} |
| 468 | + -B "${blaspp_BINARY_DIR}" |
| 469 | + -D CMAKE_INSTALL_PREFIX="${LAPACK_BINARY_DIR}" |
| 470 | + -D BLAS_LIBRARIES="${BLAS_LIBS}" |
| 471 | + -D LAPACK_LIBRARIES="${LAPACK_LIBS}" |
| 472 | + -D build_tests=OFF |
| 473 | + -D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} |
| 474 | + -D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} |
| 475 | + |
| 476 | + COMMAND ${CMAKE_COMMAND} |
| 477 | + --build "${blaspp_BINARY_DIR}" |
| 478 | + --config ${CMAKE_BUILD_TYPE} |
| 479 | + --target install |
| 480 | + ) |
| 481 | + |
| 482 | + # Set up dependencies |
| 483 | + if(NOT BLAS_FOUND) |
| 484 | + add_dependencies(blaspp ${BLASLIB}) |
| 485 | + endif() |
| 486 | + if(NOT LATESTLAPACK_FOUND) |
| 487 | + add_dependencies(blaspp ${LAPACKLIB}) |
| 488 | + endif() |
425 | 489 | endif() |
| 490 | + |
426 | 491 | if (LAPACK++) |
427 | | - message (STATUS "linking lapack++ against ${LAPACK_LIBRARIES}") |
428 | | - _display_cpp_implementation_msg("LAPACK") |
429 | | - include(ExternalProject) |
430 | | - if (BUILD_SHARED_LIBS) |
431 | | - ExternalProject_Add(lapackpp |
432 | | - URL https://bitbucket.org/icl/lapackpp/downloads/lapackpp-2020.10.02.tar.gz |
433 | | - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DLAPACK_LIBRARIES=${LAPACK_LIBRARIES} -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp |
434 | | - BUILD_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build . |
435 | | - INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install . |
436 | | - ) |
437 | | - else () |
438 | | -# FIXME this does not really work as the libraries list gets converted to a semicolon-separated list somewhere in the lapack++ build files |
439 | | - ExternalProject_Add(lapackpp |
440 | | - URL https://bitbucket.org/icl/lapackpp/downloads/lapackpp-2020.10.02.tar.gz |
441 | | - CONFIGURE_COMMAND env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${CMAKE_BINARY_DIR}/lib LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR} -DCMAKE_INSTALL_LIBDIR=lib -DLAPACK_LIBRARIES="${PROJECT_BINARY_DIR}/lib/liblapack.a -lgfortran" -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp |
442 | | - BUILD_COMMAND env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build . |
443 | | - INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install . |
444 | | - ) |
| 492 | + message( STATUS "LAPACK++ enabled; for support, email [email protected]" ) |
| 493 | + |
| 494 | + # Check if population has already been performed |
| 495 | + FetchContent_GetProperties(lapackpp) |
| 496 | + if(NOT lapackpp_POPULATED) |
| 497 | + # Fetch the content using previously declared details |
| 498 | + FetchContent_Populate(lapackpp) |
445 | 499 | endif() |
446 | | - ExternalProject_Add_StepDependencies(lapackpp build blaspp ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) |
| 500 | + |
| 501 | + # Adds target lapackpp |
| 502 | + add_custom_target( lapackpp ALL DEPENDS lapackpp-cmd ) |
| 503 | + add_custom_command( OUTPUT lapackpp-cmd |
| 504 | + WORKING_DIRECTORY "${lapackpp_SOURCE_DIR}" |
| 505 | + COMMENT "Building LAPACK++" ) |
| 506 | + |
| 507 | + # Setup remaining configuration options and installation |
| 508 | + add_custom_command( OUTPUT lapackpp-cmd APPEND |
| 509 | + COMMAND ${CMAKE_COMMAND} |
| 510 | + -B "${lapackpp_BINARY_DIR}" |
| 511 | + -D CMAKE_INSTALL_PREFIX="${LAPACK_BINARY_DIR}" |
| 512 | + -D blaspp_DIR="${PROJECT_BINARY_DIR}/lib/cmake/blaspp" |
| 513 | + -D LAPACK_LIBRARIES="${LAPACK_LIBS}" |
| 514 | + -D build_tests=OFF |
| 515 | + -D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} |
| 516 | + -D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} |
| 517 | + |
| 518 | + COMMAND ${CMAKE_COMMAND} |
| 519 | + --build "${lapackpp_BINARY_DIR}" |
| 520 | + --config ${CMAKE_BUILD_TYPE} |
| 521 | + --target install |
| 522 | + ) |
| 523 | + |
| 524 | + # Set up dependencies |
| 525 | + add_dependencies(lapackpp blaspp) |
447 | 526 | endif() |
448 | 527 |
|
449 | 528 | # -------------------------------------------------- |
@@ -551,47 +630,24 @@ install(FILES |
551 | 630 | DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${LAPACKLIB}-${LAPACK_VERSION} |
552 | 631 | COMPONENT Development |
553 | 632 | ) |
| 633 | + |
554 | 634 | if (LAPACK++) |
555 | 635 | install( |
556 | | - DIRECTORY "${LAPACK_BINARY_DIR}/lib/" |
557 | | - DESTINATION ${CMAKE_INSTALL_LIBDIR} |
558 | | - FILES_MATCHING REGEX "liblapackpp.(a|so)$" |
559 | | - ) |
560 | | - install( |
561 | | - DIRECTORY "${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp/include/" |
562 | | - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" |
563 | | - FILES_MATCHING REGEX "\\.(h|hh)$" |
| 636 | + DIRECTORY "${LAPACK_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/" |
| 637 | + DESTINATION ${CMAKE_INSTALL_LIBDIR} |
| 638 | + FILES_MATCHING REGEX "lapackpp" |
564 | 639 | ) |
565 | | - write_basic_package_version_file( |
566 | | - "lapackppConfigVersion.cmake" |
567 | | - VERSION 2020.10.02 |
568 | | - COMPATIBILITY AnyNewerVersion |
569 | | - ) |
570 | | - install( |
571 | | - FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/lapackpp/lapackppConfig.cmake" |
572 | | - "${CMAKE_CURRENT_BINARY_DIR}/lib/lapackpp/lapackppConfigVersion.cmake" |
573 | | - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/" |
574 | | - ) |
575 | | - |
576 | 640 | endif() |
577 | | -if (BLAS++) |
578 | | - write_basic_package_version_file( |
579 | | - "blasppConfigVersion.cmake" |
580 | | - VERSION 2020.10.02 |
581 | | - COMPATIBILITY AnyNewerVersion |
582 | | - ) |
583 | | - install( |
584 | | - FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/blaspp/blasppConfig.cmake" |
585 | | - "${CMAKE_CURRENT_BINARY_DIR}/lib/blaspp/blasppConfigVersion.cmake" |
586 | | - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/" |
587 | | - ) |
| 641 | + |
| 642 | +if (BLAS++ OR LAPACK++) |
588 | 643 | install( |
589 | | - DIRECTORY "${LAPACK_BINARY_DIR}/lib/" |
590 | | - DESTINATION ${CMAKE_INSTALL_LIBDIR} |
591 | | - FILES_MATCHING REGEX "libblaspp.(a|so)$" |
| 644 | + DIRECTORY "${LAPACK_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/" |
| 645 | + DESTINATION ${CMAKE_INSTALL_LIBDIR} |
| 646 | + FILES_MATCHING REGEX "blaspp" |
592 | 647 | ) |
| 648 | + |
593 | 649 | install( |
594 | | - DIRECTORY "${PROJECT_BINARY_DIR}/blaspp-prefix/src/blaspp/include/" |
| 650 | + DIRECTORY "${LAPACK_BINARY_DIR}/include/" |
595 | 651 | DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" |
596 | 652 | FILES_MATCHING REGEX "\\.(h|hh)$" |
597 | 653 | ) |
|
0 commit comments