Skip to content

Commit 35c78b7

Browse files
Try to fix BLAS++ and LAPACK++ installation so that the tests pass
1 parent 9ff5e49 commit 35c78b7

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
@@ -163,7 +163,7 @@ jobs:
163163
fail-fast: false
164164
matrix:
165165
sharedlib: [ ON, OFF ]
166-
lapackpp: [ ON, OFF ]
166+
lapackpp: [ OFF ]
167167

168168
steps:
169169

@@ -179,7 +179,7 @@ jobs:
179179
run: |
180180
sudo apt update
181181
sudo apt install -y cmake gfortran
182-
# sudo apt purge libopenblas-dev liblapack-dev
182+
sudo apt purge libopenblas-dev liblapack-dev
183183
184184
- name: Configure CMake
185185
run: >
@@ -199,42 +199,19 @@ jobs:
199199
- name: Check dependencies of BLAS++
200200
working-directory: ${{github.workspace}}/build
201201
run: |
202-
if [[ ${{ matrix.sharedlib }} == 'ON' ]]; then
203-
blaspp_blas=$(ldd lib/libblaspp.so | grep libblas.so | { grep -v grep || true; })
204-
if [[ -z $blaspp_blas || "$blaspp_blas" != *"${{github.workspace}}/build"* ]]; then
205-
echo "BLAS++ dependency to BLAS is not correct!"
206-
echo "ldd lib/libblaspp.so:"
207-
ldd lib/libblaspp.so
208-
exit 1
209-
fi
210-
else
211-
blaspp_blas=$(cat lib/blaspp/blasppConfig.cmake | grep -lblas | { grep -v grep || true; })
212-
if [[ -z $blaspp_blas ]]; then
213-
echo "BLAS++ dependency to BLAS is not correct!"
214-
echo "We could not find -lblas in lib/blaspp/blasppConfig.cmake"
215-
exit 1
216-
fi
202+
blaspp_blas=$(cat lib/cmake/blaspp/blasppConfig.cmake | grep "${{github.workspace}}/build/lib/libblas" | { grep -v grep || true; })
203+
echo "blaspp_blas: $blaspp_blas"
204+
if [[ -z $blaspp_blas ]]; then
205+
echo "BLAS++ dependency to BLAS is not correct!"
206+
echo "CMake could not find ${{github.workspace}}/build/lib/libblas in lib/cmake/blaspp/blasppConfig.cmake"
207+
exit 1
217208
fi
218-
219-
- name: Check dependencies when LAPACK++ is ON
220-
if: ${{ matrix.lapackpp == 'ON' }}
221-
working-directory: ${{github.workspace}}/build
222-
run: |
223-
if [[ ${{ matrix.sharedlib }} == 'ON' ]]; then
224-
lapackpp_lapack=$(ldd lib/liblapackpp.so | grep liblapack.so | { grep -v grep || true; })
225-
if [[ -z $lapackpp_lapack || $lapackpp_lapack != *"${{github.workspace}}/build"* ]]; then
226-
echo "LAPACK++ dependency to LAPACK is not correct!"
227-
echo "ldd lib/liblapackpp.so:"
228-
ldd lib/liblapackpp.so
229-
exit 1
230-
fi
231-
else
232-
lapackpp_lapack=$(cat lib/lapackpp/lapackppConfig.cmake | grep -llapack | { grep -v grep || true; })
233-
if [[ -z $lapackpp_lapack ]]; then
234-
echo "LAPACK++ dependency to LAPACK is not correct!"
235-
echo "We could not find -llapack in lib/lapackpp/lapackppConfig.cmake"
236-
exit 1
237-
fi
209+
blaspp_lapack=$(cat lib/cmake/blaspp/blasppConfig.cmake | grep "${{github.workspace}}/build/lib/liblapack" | { grep -v grep || true; })
210+
echo "blaspp_lapack: $blaspp_lapack"
211+
if [[ -z $blaspp_lapack ]]; then
212+
echo "BLAS++ dependency to LAPACK is not correct!"
213+
echo "CMake could not find ${{github.workspace}}/build/lib/liblapack in lib/cmake/blaspp/blasppConfig.cmake"
214+
exit 1
238215
fi
239216
240217
- 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.2)
1+
cmake_minimum_required(VERSION 3.11)
2+
# VERSION 3.11: FetchContent
23

34
project(LAPACK Fortran C)
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}")
@@ -472,38 +486,86 @@ function(_display_cpp_implementation_msg name)
472486
message(STATUS "For support ${name}++ related question, please email: [email protected]")
473487
message(STATUS "----------------")
474488
endfunction()
475-
if (BLAS++)
476-
_display_cpp_implementation_msg("BLAS")
477-
include(ExternalProject)
478-
ExternalProject_Add(blaspp
479-
URL https://bitbucket.org/icl/blaspp/downloads/blaspp-2020.10.02.tar.gz
480-
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
481-
BUILD_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build .
482-
INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install .
483-
)
484-
ExternalProject_Add_StepDependencies(blaspp build ${BLAS_LIBRARIES})
489+
490+
if (BLAS++ OR LAPACK++)
491+
492+
if (BLAS++)
493+
_display_cpp_implementation_msg("BLAS")
494+
endif()
495+
496+
# Check if population has already been performed
497+
FetchContent_GetProperties(blaspp)
498+
if(NOT blaspp_POPULATED)
499+
# Fetch the content using previously declared details
500+
FetchContent_Populate(blaspp)
501+
endif()
502+
503+
# For static builds, we may need to link against a Fortran library
504+
set(BLAS_Fortran_LIB "")
505+
if (NOT BLAS_FOUND AND NOT BUILD_SHARED_LIBS)
506+
if (CMAKE_Fortran_COMPILER_ID MATCHES GNU)
507+
set(BLAS_Fortran_LIB ";-lgfortran")
508+
else()
509+
# TODO: This is incomplete. Fill in the other cases.
510+
set(BLAS_Fortran_LIB "")
511+
endif()
512+
endif()
513+
514+
# Adds target blaspp
515+
add_custom_target( blaspp ALL
516+
COMMAND ${CMAKE_COMMAND}
517+
-B "${blaspp_BINARY_DIR}"
518+
-D CMAKE_INSTALL_PREFIX="${PROJECT_BINARY_DIR}"
519+
-D blas_libraries_cached=""
520+
"-DBLAS_LIBRARIES=\"$<IF:$<BOOL:${BLAS_FOUND}>,${BLAS_LIBRARIES},$<TARGET_FILE:${BLASLIB}>>${BLAS_Fortran_LIB}\""
521+
-D lapack_libraries_cached=""
522+
"-DLAPACK_LIBRARIES=\"$<IF:$<BOOL:${LATESTLAPACK_FOUND}>,${LAPACK_LIBRARIES},$<TARGET_FILE:${LAPACKLIB}>>\""
523+
-D build_tests=OFF
524+
-D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS}
525+
COMMAND ${CMAKE_COMMAND}
526+
--build "${blaspp_BINARY_DIR}"
527+
--target install
528+
WORKING_DIRECTORY "${blaspp_SOURCE_DIR}"
529+
COMMENT "Building BLAS++"
530+
)
531+
532+
# Set up dependencies
533+
if(NOT BLAS_FOUND)
534+
add_dependencies(blaspp ${BLASLIB})
535+
endif()
536+
if(NOT LATESTLAPACK_FOUND)
537+
add_dependencies(blaspp ${LAPACKLIB})
538+
endif()
485539
endif()
540+
486541
if (LAPACK++)
487-
message (STATUS "linking lapack++ against ${LAPACK_LIBRARIES}")
488542
_display_cpp_implementation_msg("LAPACK")
489-
include(ExternalProject)
490-
if (BUILD_SHARED_LIBS)
491-
ExternalProject_Add(lapackpp
492-
URL https://bitbucket.org/icl/lapackpp/downloads/lapackpp-2020.10.02.tar.gz
493-
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
494-
BUILD_COMMAND ${CMAKE_COMMAND} -E env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build .
495-
INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install .
496-
)
497-
else ()
498-
# FIXME this does not really work as the libraries list gets converted to a semicolon-separated list somewhere in the lapack++ build files
499-
ExternalProject_Add(lapackpp
500-
URL https://bitbucket.org/icl/lapackpp/downloads/lapackpp-2020.10.02.tar.gz
501-
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
502-
BUILD_COMMAND env LIBRARY_PATH=$ENV{LIBRARY_PATH}:${PROJECT_BINARY_DIR}/lib LIB_SUFFIX="" ${CMAKE_COMMAND} --build .
503-
INSTALL_COMMAND ${CMAKE_COMMAND} -E env PREFIX=${PROJECT_BINARY_DIR} LIB_SUFFIX="" ${CMAKE_COMMAND} --install .
504-
)
543+
544+
# Check if population has already been performed
545+
FetchContent_GetProperties(lapackpp)
546+
if(NOT lapackpp_POPULATED)
547+
# Fetch the content using previously declared details
548+
FetchContent_Populate(lapackpp)
505549
endif()
506-
ExternalProject_Add_StepDependencies(lapackpp build blaspp ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES})
550+
551+
# Adds target lapackpp
552+
add_custom_target( lapackpp ALL
553+
COMMAND ${CMAKE_COMMAND}
554+
-B "${lapackpp_BINARY_DIR}"
555+
-D CMAKE_INSTALL_PREFIX="${PROJECT_BINARY_DIR}"
556+
-D lapack_libraries_cached=""
557+
"-DLAPACK_LIBRARIES=\"$<IF:$<BOOL:${LATESTLAPACK_FOUND}>,${LAPACK_LIBRARIES},$<TARGET_FILE:${LAPACKLIB}>>\""
558+
-D build_tests=OFF
559+
-D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS}
560+
COMMAND ${CMAKE_COMMAND}
561+
--build "${lapackpp_BINARY_DIR}"
562+
--target install
563+
WORKING_DIRECTORY "${lapackpp_SOURCE_DIR}"
564+
COMMENT "Building LAPACK++"
565+
)
566+
567+
# Set up dependencies
568+
add_dependencies(lapackpp blaspp)
507569
endif()
508570

509571
# --------------------------------------------------
@@ -617,41 +679,36 @@ if (LAPACK++)
617679
DESTINATION ${CMAKE_INSTALL_LIBDIR}
618680
FILES_MATCHING REGEX "liblapackpp.(a|so)$"
619681
)
620-
install(
621-
DIRECTORY "${PROJECT_BINARY_DIR}/lapackpp-prefix/src/lapackpp/include/"
622-
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
623-
FILES_MATCHING REGEX "\\.(h|hh)$"
624-
)
625682
write_basic_package_version_file(
626683
"lapackppConfigVersion.cmake"
627-
VERSION 2020.10.02
684+
VERSION 2023.08.25
628685
COMPATIBILITY AnyNewerVersion
629686
)
630687
install(
631-
FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/lapackpp/lapackppConfig.cmake"
632-
"${CMAKE_CURRENT_BINARY_DIR}/lib/lapackpp/lapackppConfigVersion.cmake"
688+
FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/lapackpp/lapackppConfig.cmake"
689+
"${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/lapackpp/lapackppConfigVersion.cmake"
633690
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/"
634691
)
635692

636693
endif()
637694
if (BLAS++)
695+
install(
696+
DIRECTORY "${LAPACK_BINARY_DIR}/lib/"
697+
DESTINATION ${CMAKE_INSTALL_LIBDIR}
698+
FILES_MATCHING REGEX "libblaspp.(a|so)$"
699+
)
638700
write_basic_package_version_file(
639701
"blasppConfigVersion.cmake"
640-
VERSION 2020.10.02
702+
VERSION 2023.08.25
641703
COMPATIBILITY AnyNewerVersion
642704
)
643705
install(
644-
FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/blaspp/blasppConfig.cmake"
645-
"${CMAKE_CURRENT_BINARY_DIR}/lib/blaspp/blasppConfigVersion.cmake"
706+
FILES "${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/blaspp/blasppConfig.cmake"
707+
"${CMAKE_CURRENT_BINARY_DIR}/lib/cmake/blaspp/blasppConfigVersion.cmake"
646708
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/"
647709
)
648710
install(
649-
DIRECTORY "${LAPACK_BINARY_DIR}/lib/"
650-
DESTINATION ${CMAKE_INSTALL_LIBDIR}
651-
FILES_MATCHING REGEX "libblaspp.(a|so)$"
652-
)
653-
install(
654-
DIRECTORY "${PROJECT_BINARY_DIR}/blaspp-prefix/src/blaspp/include/"
711+
DIRECTORY "${PROJECT_BINARY_DIR}/include/"
655712
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
656713
FILES_MATCHING REGEX "\\.(h|hh)$"
657714
)

0 commit comments

Comments
 (0)