Skip to content

Commit 0c31c63

Browse files
Try to fix BLAS++ and LAPACK++ installation so that the tests pass
1 parent 0b9193a commit 0c31c63

File tree

2 files changed

+117
-83
lines changed

2 files changed

+117
-83
lines changed

.github/workflows/cmake.yml

Lines changed: 14 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ jobs:
250250
fail-fast: false
251251
matrix:
252252
sharedlib: [ ON, OFF ]
253-
lapackpp: [ ON, OFF ]
253+
lapackpp: [ OFF ]
254254

255255
steps:
256256

@@ -266,7 +266,7 @@ jobs:
266266
run: |
267267
sudo apt update
268268
sudo apt install -y cmake gfortran
269-
# sudo apt purge libopenblas-dev liblapack-dev
269+
sudo apt purge libopenblas-dev liblapack-dev
270270
271271
- name: Configure CMake
272272
run: >
@@ -286,42 +286,19 @@ jobs:
286286
- name: Check dependencies of BLAS++
287287
working-directory: ${{github.workspace}}/build
288288
run: |
289-
if [[ ${{ matrix.sharedlib }} == 'ON' ]]; then
290-
blaspp_blas=$(ldd lib/libblaspp.so | grep libblas.so | { grep -v grep || true; })
291-
if [[ -z $blaspp_blas || "$blaspp_blas" != *"${{github.workspace}}/build"* ]]; then
292-
echo "BLAS++ dependency to BLAS is not correct!"
293-
echo "ldd lib/libblaspp.so:"
294-
ldd lib/libblaspp.so
295-
exit 1
296-
fi
297-
else
298-
blaspp_blas=$(cat lib/blaspp/blasppConfig.cmake | grep -lblas | { grep -v grep || true; })
299-
if [[ -z $blaspp_blas ]]; then
300-
echo "BLAS++ dependency to BLAS is not correct!"
301-
echo "We could not find -lblas in lib/blaspp/blasppConfig.cmake"
302-
exit 1
303-
fi
289+
blaspp_blas=$(cat lib/cmake/blaspp/blasppConfig.cmake | grep "${{github.workspace}}/build/lib/libblas" | { grep -v grep || true; })
290+
echo "blaspp_blas: $blaspp_blas"
291+
if [[ -z $blaspp_blas ]]; then
292+
echo "BLAS++ dependency to BLAS is not correct!"
293+
echo "CMake could not find ${{github.workspace}}/build/lib/libblas in lib/cmake/blaspp/blasppConfig.cmake"
294+
exit 1
304295
fi
305-
306-
- name: Check dependencies when LAPACK++ is ON
307-
if: ${{ matrix.lapackpp == 'ON' }}
308-
working-directory: ${{github.workspace}}/build
309-
run: |
310-
if [[ ${{ matrix.sharedlib }} == 'ON' ]]; then
311-
lapackpp_lapack=$(ldd lib/liblapackpp.so | grep liblapack.so | { grep -v grep || true; })
312-
if [[ -z $lapackpp_lapack || $lapackpp_lapack != *"${{github.workspace}}/build"* ]]; then
313-
echo "LAPACK++ dependency to LAPACK is not correct!"
314-
echo "ldd lib/liblapackpp.so:"
315-
ldd lib/liblapackpp.so
316-
exit 1
317-
fi
318-
else
319-
lapackpp_lapack=$(cat lib/lapackpp/lapackppConfig.cmake | grep -llapack | { grep -v grep || true; })
320-
if [[ -z $lapackpp_lapack ]]; then
321-
echo "LAPACK++ dependency to LAPACK is not correct!"
322-
echo "We could not find -llapack in lib/lapackpp/lapackppConfig.cmake"
323-
exit 1
324-
fi
296+
blaspp_lapack=$(cat lib/cmake/blaspp/blasppConfig.cmake | grep "${{github.workspace}}/build/lib/liblapack" | { grep -v grep || true; })
297+
echo "blaspp_lapack: $blaspp_lapack"
298+
if [[ -z $blaspp_lapack ]]; then
299+
echo "BLAS++ dependency to LAPACK is not correct!"
300+
echo "CMake could not find ${{github.workspace}}/build/lib/liblapack in lib/cmake/blaspp/blasppConfig.cmake"
301+
exit 1
325302
fi
326303
327304
- name: Install

CMakeLists.txt

Lines changed: 103 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
cmake_minimum_required(VERSION 3.6)
1+
cmake_minimum_required(VERSION 3.11)
2+
# VERSION 3.11: FetchContent
23

34
project(LAPACK)
45

@@ -10,6 +11,19 @@ set(
1011
${LAPACK_MAJOR_VERSION}.${LAPACK_MINOR_VERSION}.${LAPACK_PATCH_VERSION}
1112
)
1213

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 f8f983d5b45a8f366aae41fbe9888b14cbae20f8 # v2023.08.25
20+
)
21+
FetchContent_Declare(
22+
lapackpp
23+
GIT_REPOSITORY https://github.com/icl-utk-edu/lapackpp
24+
GIT_TAG 62680a16a9aba2a426e3d089dd13e18bfd140c74 # v2023.08.25
25+
)
26+
1327
# Allow setting a prefix for the library names
1428
set(CMAKE_STATIC_LIBRARY_PREFIX "lib${LIBRARY_PREFIX}")
1529
set(CMAKE_SHARED_LIBRARY_PREFIX "lib${LIBRARY_PREFIX}")
@@ -412,38 +426,86 @@ function(_display_cpp_implementation_msg name)
412426
message(STATUS "For support ${name}++ related question, please email: [email protected]")
413427
message(STATUS "----------------")
414428
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_tests=OFF -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})
429+
430+
if (BLAS++ OR LAPACK++)
431+
432+
if (BLAS++)
433+
_display_cpp_implementation_msg("BLAS")
434+
endif()
435+
436+
# Check if population has already been performed
437+
FetchContent_GetProperties(blaspp)
438+
if(NOT blaspp_POPULATED)
439+
# Fetch the content using previously declared details
440+
FetchContent_Populate(blaspp)
441+
endif()
442+
443+
# For static builds, we may need to link against a Fortran library
444+
set(BLAS_Fortran_LIB "")
445+
if (NOT BLAS_FOUND AND NOT BUILD_SHARED_LIBS)
446+
if (CMAKE_Fortran_COMPILER_ID MATCHES GNU)
447+
set(BLAS_Fortran_LIB ";-lgfortran")
448+
else()
449+
# TODO: This is incomplete. Fill in the other cases.
450+
set(BLAS_Fortran_LIB "")
451+
endif()
452+
endif()
453+
454+
# Adds target blaspp
455+
add_custom_target( blaspp ALL
456+
COMMAND ${CMAKE_COMMAND}
457+
-B "${blaspp_BINARY_DIR}"
458+
-D CMAKE_INSTALL_PREFIX="${PROJECT_BINARY_DIR}"
459+
-D blas_libraries_cached=""
460+
"-DBLAS_LIBRARIES=\"$<IF:$<BOOL:${BLAS_FOUND}>,${BLAS_LIBRARIES},$<TARGET_FILE:${BLASLIB}>>${BLAS_Fortran_LIB}\""
461+
-D lapack_libraries_cached=""
462+
"-DLAPACK_LIBRARIES=\"$<IF:$<BOOL:${LATESTLAPACK_FOUND}>,${LAPACK_LIBRARIES},$<TARGET_FILE:${LAPACKLIB}>>\""
463+
-D build_tests=OFF
464+
-D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS}
465+
COMMAND ${CMAKE_COMMAND}
466+
--build "${blaspp_BINARY_DIR}"
467+
--target install
468+
WORKING_DIRECTORY "${blaspp_SOURCE_DIR}"
469+
COMMENT "Building BLAS++"
470+
)
471+
472+
# Set up dependencies
473+
if(NOT BLAS_FOUND)
474+
add_dependencies(blaspp ${BLASLIB})
475+
endif()
476+
if(NOT LATESTLAPACK_FOUND)
477+
add_dependencies(blaspp ${LAPACKLIB})
478+
endif()
425479
endif()
480+
426481
if (LAPACK++)
427-
message (STATUS "linking lapack++ against ${LAPACK_LIBRARIES}")
428482
_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_tests=OFF -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_tests=OFF -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-
)
483+
484+
# Check if population has already been performed
485+
FetchContent_GetProperties(lapackpp)
486+
if(NOT lapackpp_POPULATED)
487+
# Fetch the content using previously declared details
488+
FetchContent_Populate(lapackpp)
445489
endif()
446-
ExternalProject_Add_StepDependencies(lapackpp build blaspp ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES})
490+
491+
# Adds target lapackpp
492+
add_custom_target( lapackpp ALL
493+
COMMAND ${CMAKE_COMMAND}
494+
-B "${lapackpp_BINARY_DIR}"
495+
-D CMAKE_INSTALL_PREFIX="${PROJECT_BINARY_DIR}"
496+
-D lapack_libraries_cached=""
497+
"-DLAPACK_LIBRARIES=\"$<IF:$<BOOL:${LATESTLAPACK_FOUND}>,${LAPACK_LIBRARIES},$<TARGET_FILE:${LAPACKLIB}>>\""
498+
-D build_tests=OFF
499+
-D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS}
500+
COMMAND ${CMAKE_COMMAND}
501+
--build "${lapackpp_BINARY_DIR}"
502+
--target install
503+
WORKING_DIRECTORY "${lapackpp_SOURCE_DIR}"
504+
COMMENT "Building LAPACK++"
505+
)
506+
507+
# Set up dependencies
508+
add_dependencies(lapackpp blaspp)
447509
endif()
448510

449511
# --------------------------------------------------
@@ -557,41 +619,36 @@ if (LAPACK++)
557619
DESTINATION ${CMAKE_INSTALL_LIBDIR}
558620
FILES_MATCHING REGEX "liblapackpp.(a|so)$"
559621
)
560-
install(
561-
DIRECTORY "${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp/include/"
562-
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
563-
FILES_MATCHING REGEX "\\.(h|hh)$"
564-
)
565622
write_basic_package_version_file(
566623
"lapackppConfigVersion.cmake"
567-
VERSION 2020.10.02
624+
VERSION 2023.08.25
568625
COMPATIBILITY AnyNewerVersion
569626
)
570627
install(
571-
FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/lapackpp/lapackppConfig.cmake"
572-
"${CMAKE_CURRENT_BINARY_DIR}/lib/lapackpp/lapackppConfigVersion.cmake"
628+
FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/lapackpp/lapackppConfig.cmake"
629+
"${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/lapackpp/lapackppConfigVersion.cmake"
573630
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/"
574631
)
575632

576633
endif()
577634
if (BLAS++)
635+
install(
636+
DIRECTORY "${LAPACK_BINARY_DIR}/lib/"
637+
DESTINATION ${CMAKE_INSTALL_LIBDIR}
638+
FILES_MATCHING REGEX "libblaspp.(a|so)$"
639+
)
578640
write_basic_package_version_file(
579641
"blasppConfigVersion.cmake"
580-
VERSION 2020.10.02
642+
VERSION 2023.08.25
581643
COMPATIBILITY AnyNewerVersion
582644
)
583645
install(
584-
FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/blaspp/blasppConfig.cmake"
585-
"${CMAKE_CURRENT_BINARY_DIR}/lib/blaspp/blasppConfigVersion.cmake"
646+
FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/blaspp/blasppConfig.cmake"
647+
"${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/blaspp/blasppConfigVersion.cmake"
586648
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/"
587649
)
588650
install(
589-
DIRECTORY "${LAPACK_BINARY_DIR}/lib/"
590-
DESTINATION ${CMAKE_INSTALL_LIBDIR}
591-
FILES_MATCHING REGEX "libblaspp.(a|so)$"
592-
)
593-
install(
594-
DIRECTORY "${PROJECT_BINARY_DIR}/blaspp-prefix/src/blaspp/include/"
651+
DIRECTORY "${PROJECT_BINARY_DIR}/include/"
595652
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
596653
FILES_MATCHING REGEX "\\.(h|hh)$"
597654
)

0 commit comments

Comments
 (0)