Skip to content

Commit ef44890

Browse files
Merge 7f2c622 into ae9c818
2 parents ae9c818 + 7f2c622 commit ef44890

File tree

2 files changed

+210
-74
lines changed

2 files changed

+210
-74
lines changed

.github/workflows/cmake.yml

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,4 +237,84 @@ jobs:
237237
fi
238238
done
239239
exit 0
240-
fi
240+
fi
241+
242+
test-blaspp-flag:
243+
runs-on: ubuntu-latest
244+
245+
env:
246+
BUILD_TYPE: Release
247+
FFLAGS: "-Wall -Wno-unused-dummy-argument -Wno-unused-variable -Wno-unused-label -Werror=conversion -fimplicit-none -frecursive -fcheck=all"
248+
249+
strategy:
250+
fail-fast: false
251+
matrix:
252+
sharedlib: [ OFF, ON ]
253+
lapackpp: [ OFF ]
254+
optblas: [ OFF, ON ]
255+
optlapack: [ OFF, ON ]
256+
exclude:
257+
- optblas: ON
258+
optlapack: ON
259+
260+
steps:
261+
262+
- name: Checkout LAPACK
263+
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
264+
265+
- name: Install ninja-build tool
266+
uses: seanmiddleditch/gha-setup-ninja@16b940825621068d98711680b6c3ff92201f8fc0 # v3
267+
268+
- name: Install the Basics
269+
run: |
270+
sudo apt update
271+
sudo apt install -y cmake gfortran libopenblas-dev
272+
273+
- name: Configure CMake
274+
run: >
275+
cmake -B build -G Ninja
276+
-D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
277+
-D CMAKE_INSTALL_PREFIX=${{github.workspace}}/lapack_install
278+
-D CBLAS:BOOL=OFF
279+
-D LAPACKE:BOOL=OFF
280+
-D BUILD_TESTING:BOOL=OFF
281+
-D BUILD_SHARED_LIBS:BOOL=${{ matrix.sharedlib }}
282+
-D BLAS++:BOOL=ON
283+
-D LAPACK++:BOOL=${{ matrix.lapackpp }}
284+
-D USE_OPTIMIZED_BLAS:BOOL=${{ matrix.optblas }}
285+
-D USE_OPTIMIZED_LAPACK:BOOL=${{ matrix.optlapack }}
286+
287+
- name: Build
288+
run: cmake --build build --config ${{env.BUILD_TYPE}}
289+
290+
- name: Check dependencies of BLAS++ on BLAS and LAPACK
291+
working-directory: ${{github.workspace}}/build
292+
run: |
293+
configFile="lib/cmake/blaspp/blasppConfig.cmake"
294+
if [[ ${{ matrix.optblas }} == 'ON' || ${{ matrix.optlapack }} == 'ON' ]]; then
295+
if grep -q "openblas" $configFile; then
296+
echo "BLAS++ dependency to openblas is correct."
297+
else
298+
echo "CMake could not find openblas in $configFile:"
299+
cat $configFile
300+
exit 1
301+
fi
302+
else
303+
if grep -q "${{github.workspace}}/build/lib/libblas" $configFile; then
304+
echo "BLAS++ dependency to BLAS is correct."
305+
else
306+
echo "CMake could not find ${{github.workspace}}/build/lib/libblas in $configFile:"
307+
cat $configFile
308+
exit 1
309+
fi
310+
if grep -q "${{github.workspace}}/build/lib/liblapack" $configFile; then
311+
echo "BLAS++ dependency to LAPACK is correct."
312+
else
313+
echo "CMake could not find ${{github.workspace}}/build/lib/liblapack in $configFile:"
314+
cat $configFile
315+
exit 1
316+
fi
317+
fi
318+
319+
- name: Install
320+
run: cmake --build build --target install -j2

CMakeLists.txt

Lines changed: 129 additions & 73 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 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+
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}")
@@ -402,48 +416,113 @@ endif()
402416
option(BLAS++ "Build BLAS++" OFF)
403417
option(LAPACK++ "Build LAPACK++" OFF)
404418

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}'" )
405440

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()
425489
endif()
490+
426491
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)
445499
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)
447526
endif()
448527

449528
# --------------------------------------------------
@@ -551,47 +630,24 @@ install(FILES
551630
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${LAPACKLIB}-${LAPACK_VERSION}
552631
COMPONENT Development
553632
)
633+
554634
if (LAPACK++)
555635
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"
564639
)
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-
576640
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++)
588643
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"
592647
)
648+
593649
install(
594-
DIRECTORY "${PROJECT_BINARY_DIR}/blaspp-prefix/src/blaspp/include/"
650+
DIRECTORY "${LAPACK_BINARY_DIR}/include/"
595651
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
596652
FILES_MATCHING REGEX "\\.(h|hh)$"
597653
)

0 commit comments

Comments
 (0)