From bd1fba15d0d6f54891cb822f4ab2e8afd0a3ea4b Mon Sep 17 00:00:00 2001 From: Christoph Conrads Date: Thu, 11 Nov 2021 13:43:37 +0000 Subject: [PATCH 1/3] CMake: have LAPACKE check available LAPACK arithmetic If the user requests LAPACKE to be built for a certain arithmetic (e.g., real double-precision), check if the LAPACK library contains code for the requested arithmetic. --- LAPACKE/CMakeLists.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/LAPACKE/CMakeLists.txt b/LAPACKE/CMakeLists.txt index facc2172b6..30735f7700 100644 --- a/LAPACKE/CMakeLists.txt +++ b/LAPACKE/CMakeLists.txt @@ -26,6 +26,15 @@ option(LAPACKE_BUILD_DOUBLE "Build LAPACKE double precision real" ON) option(LAPACKE_BUILD_COMPLEX "Build LAPACKE single precision complex" ON) option(LAPACKE_BUILD_COMPLEX16 "Build LAPACKE double precision complex" ON) +foreach(precision SINGLE DOUBLE COMPLEX COMPLEX16) + if(LAPACKE_BUILD_${precision} AND NOT BUILD_${precision}) + message( + SEND_ERROR + "LAPACKE_BUILD_${precision} requires BUILD_${precision} to be ON" + ) + endif() +endforeach() + macro(append_subdir_files variable dirname) get_directory_property(holder DIRECTORY ${dirname} DEFINITION ${variable}) foreach(depfile ${holder}) From 09af64a8ef305d9bceb1ad69c178f89451ee6df6 Mon Sep 17 00:00:00 2001 From: Christoph Conrads Date: Thu, 11 Nov 2021 17:27:45 +0000 Subject: [PATCH 2/3] CMake: fix selective arithmetic linking Fix linking when only a subset of the available arithmetic (e.g., only complex double-precision arithmetic) is built. --- BLAS/SRC/CMakeLists.txt | 17 ++++++++++++++--- CMakeLists.txt | 1 + SRC/CMakeLists.txt | 42 ++++++++++++++++++++++++----------------- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/BLAS/SRC/CMakeLists.txt b/BLAS/SRC/CMakeLists.txt index d585729e6b..6ad8188a79 100644 --- a/BLAS/SRC/CMakeLists.txt +++ b/BLAS/SRC/CMakeLists.txt @@ -38,12 +38,22 @@ set(CBLAS1 scabs1.f scasum.f scnrm2.f90 icamax.f caxpy.f ccopy.f set(DBLAS1 idamax.f dasum.f daxpy.f dcopy.f ddot.f dnrm2.f90 drot.f drotg.f90 dscal.f dsdot.f dswap.f drotmg.f drotm.f) +set(DB1AUX sscal.f isamax.f) + set(ZBLAS1 dcabs1.f dzasum.f dznrm2.f90 izamax.f zaxpy.f zcopy.f zdotc.f zdotu.f zdscal.f zrotg.f90 zscal.f zswap.f zdrot.f) -set(CB1AUX isamax.f sasum.f saxpy.f scopy.f snrm2.f90 sscal.f) +set(CB1AUX + isamax.f idamax.f + sasum.f saxpy.f scopy.f sdot.f sgemm.f sgemv.f snrm2.f90 srot.f sscal.f + sswap.f) -set(ZB1AUX idamax.f dasum.f daxpy.f dcopy.f dnrm2.f90 dscal.f) +set(ZB1AUX + icamax.f idamax.f + cgemm.f cherk.f cscal.f ctrsm.f + dasum.f daxpy.f dcopy.f ddot.f dgemm.f dgemv.f dnrm2.f90 drot.f dscal.f + dswap.f + scabs1.f) #--------------------------------------------------------------------- # Auxiliary routines needed by both the Level 2 and Level 3 BLAS @@ -88,7 +98,8 @@ if(BUILD_SINGLE) list(APPEND SOURCES ${SBLAS1} ${ALLBLAS} ${SBLAS2} ${SBLAS3}) endif() if(BUILD_DOUBLE) - list(APPEND SOURCES ${DBLAS1} ${ALLBLAS} ${DBLAS2} ${DBLAS3}) + list(APPEND SOURCES + ${DBLAS1} ${DB1AUX} ${ALLBLAS} ${DBLAS2} ${DBLAS3} ${SBLAS3}) endif() if(BUILD_COMPLEX) list(APPEND SOURCES ${CBLAS1} ${CB1AUX} ${ALLBLAS} ${CBLAS2} ${CBLAS3}) diff --git a/CMakeLists.txt b/CMakeLists.txt index 379e2347fd..0ddeafc618 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -254,6 +254,7 @@ if(NOT (BUILD_SINGLE OR BUILD_DOUBLE OR BUILD_COMPLEX OR BUILD_COMPLEX16)) BUILD_SINGLE, BUILD_DOUBLE, BUILD_COMPLEX, BUILD_COMPLEX16.") endif() + # -------------------------------------------------- # Subdirectories that need to be processed option(USE_OPTIMIZED_BLAS "Whether or not to use an optimized BLAS library instead of included netlib BLAS" OFF) diff --git a/SRC/CMakeLists.txt b/SRC/CMakeLists.txt index ada0325f93..66865ea428 100644 --- a/SRC/CMakeLists.txt +++ b/SRC/CMakeLists.txt @@ -42,7 +42,7 @@ set(ALLAUX ilaenv.f ilaenv2stage.f ieeeck.f lsamen.f iparmq.f iparam2stage.F set(SCLAUX la_constants.f90 - sbdsdc.f + sbdsvdx.f sbdsdc.f sbdsqr.f sdisna.f slabad.f slacpy.f sladiv.f slae2.f slaebz.f slaed0.f slaed1.f slaed2.f slaed3.f slaed4.f slaed5.f slaed6.f slaed7.f slaed8.f slaed9.f slaeda.f slaev2.f slagtf.f @@ -55,14 +55,16 @@ set(SCLAUX slasd7.f slasd8.f slasda.f slasdq.f slasdt.f slaset.f slasq1.f slasq2.f slasq3.f slasq4.f slasq5.f slasq6.f slasr.f slasrt.f slassq.f90 slasv2.f spttrf.f sstebz.f sstedc.f - ssteqr.f ssterf.f slaisnan.f sisnan.f + sstein.f ssteqr.f ssterf.f sstevx.f slartgp.f slartgs.f ../INSTALL/sroundup_lwork.f ${SECOND_SRC}) set(DZLAUX la_constants.f90 - dbdsdc.f - dbdsqr.f ddisna.f dlabad.f dlacpy.f dladiv.f dlae2.f dlaebz.f + dbdsdc.f dbdsvdx.f + dbdsqr.f ddisna.f + disnan.f + dlabad.f dlacpy.f dladiv.f dlae2.f dlaebz.f dlaed0.f dlaed1.f dlaed2.f dlaed3.f dlaed4.f dlaed5.f dlaed6.f dlaed7.f dlaed8.f dlaed9.f dlaeda.f dlaev2.f dlagtf.f dlagts.f dlamrg.f dlanst.f @@ -73,20 +75,21 @@ set(DZLAUX dlasd0.f dlasd1.f dlasd2.f dlasd3.f dlasd4.f dlasd5.f dlasd6.f dlasd7.f dlasd8.f dlasda.f dlasdq.f dlasdt.f dlaset.f dlasq1.f dlasq2.f dlasq3.f dlasq4.f dlasq5.f dlasq6.f - dlasr.f dlasrt.f dlassq.f90 dlasv2.f dpttrf.f dstebz.f dstedc.f - dsteqr.f dsterf.f dlaisnan.f disnan.f + dlasr.f dlasrt.f dlassq.f90 dlasv2.f dlaisnan.f + dpttrf.f + dstebz.f dstedc.f dstein.f dsteqr.f dsterf.f dstevx.f dlartgp.f dlartgs.f ../INSTALL/droundup_lwork.f ../INSTALL/dlamch.f ${DSECOND_SRC}) set(SLASRC - sbdsvdx.f sgbbrd.f sgbcon.f sgbequ.f sgbrfs.f sgbsv.f + sgbbrd.f sgbcon.f sgbequ.f sgbrfs.f sgbsv.f sgbsvx.f sgbtf2.f sgbtrf.f sgbtrs.f sgebak.f sgebal.f sgebd2.f sgebrd.f sgecon.f sgeequ.f sgees.f sgeesx.f sgeev.f sgeevx.f sgehd2.f sgehrd.f sgelq2.f sgelqf.f sgels.f sgelsd.f sgelss.f sgelsy.f sgeql2.f sgeqlf.f sgeqp3.f sgeqr2.f sgeqr2p.f sgeqrf.f sgeqrfp.f sgerfs.f sgerq2.f sgerqf.f sgesc2.f sgesdd.f sgesv.f sgesvd.f sgesvdx.f sgesvx.f sgetc2.f sgetf2.f - sgetrf2.f sgetri.f + sgetri.f sggbak.f sggbal.f sgges.f sgges3.f sggesx.f sggev.f sggev3.f sggevx.f sggglm.f sgghrd.f sgghd3.f sgglse.f sggqrf.f @@ -104,7 +107,7 @@ set(SLASRC slaqtr.f slar1v.f slar2v.f ilaslr.f ilaslc.f slarf.f slarfb.f slarfb_gett.f slarfg.f slarfgp.f slarft.f slarfx.f slarfy.f slargv.f slarrv.f slartv.f - slarz.f slarzb.f slarzt.f slaswp.f slasy2.f + slarz.f slarzb.f slarzt.f slasy2.f slasyf.f slasyf_rook.f slasyf_rk.f slasyf_aa.f slatbs.f slatdf.f slatps.f slatrd.f slatrs.f slatrz.f slauu2.f slauum.f sopgtr.f sopmtr.f sorg2l.f sorg2r.f @@ -114,15 +117,15 @@ set(SLASRC sormr3.f sormrq.f sormrz.f sormtr.f spbcon.f spbequ.f spbrfs.f spbstf.f spbsv.f spbsvx.f spbtf2.f spbtrf.f spbtrs.f spocon.f spoequ.f sporfs.f sposv.f - sposvx.f spotf2.f spotrf2.f spotri.f spstrf.f spstf2.f + sposvx.f spotf2.f spotri.f spstrf.f spstf2.f sppcon.f sppequ.f spprfs.f sppsv.f sppsvx.f spptrf.f spptri.f spptrs.f sptcon.f spteqr.f sptrfs.f sptsv.f sptsvx.f spttrs.f sptts2.f srscl.f ssbev.f ssbevd.f ssbevx.f ssbgst.f ssbgv.f ssbgvd.f ssbgvx.f ssbtrd.f sspcon.f sspev.f sspevd.f sspevx.f sspgst.f sspgv.f sspgvd.f sspgvx.f ssprfs.f sspsv.f sspsvx.f ssptrd.f - ssptrf.f ssptri.f ssptrs.f sstegr.f sstein.f sstev.f sstevd.f sstevr.f - sstevx.f ssycon.f ssyev.f ssyevd.f ssyevr.f ssyevx.f ssygs2.f + ssptrf.f ssptri.f ssptrs.f sstegr.f sstev.f sstevd.f sstevr.f + ssycon.f ssyev.f ssyevd.f ssyevr.f ssyevx.f ssygs2.f ssygst.f ssygv.f ssygvd.f ssygvx.f ssyrfs.f ssysv.f ssysvx.f ssytd2.f ssytf2.f ssytrd.f ssytrf.f ssytri.f ssytri2.f ssytri2x.f ssyswapr.f ssytrs.f ssytrs2.f @@ -157,7 +160,9 @@ set(SLASRC ssbev_2stage.f ssbevx_2stage.f ssbevd_2stage.f ssygv_2stage.f sgesvdq.f) -set(DSLASRC spotrs.f sgetrs.f spotrf.f sgetrf.f) +set(DSLASRC + sgetrf.f sgetrf2.f sgetrs.f sisnan.f slaisnan.f slaswp.f spotrf.f spotrf2.f + spotrs.f) set(SXLASRC sgesvxx.f sgerfsx.f sla_gerfsx_extended.f sla_geamv.f sla_gercond.f sla_gerpvgrw.f ssysvxx.f ssyrfsx.f @@ -271,7 +276,10 @@ set(CXLASRC cgesvxx.f cgerfsx.f cla_gerfsx_extended.f cla_geamv.f cla_hercond_c.f cla_hercond_x.f cla_herpvgrw.f cla_lin_berr.f clarscl2.f clascl2.f cla_wwaddw.f) -set(ZCLASRC cpotrs.f cgetrs.f cpotrf.f cgetrf.f) +set(ZCLASRC + cgetrf.f cgetrf2.f cgetrs.f claswp.f cpotrf.f cpotrf2.f cpotrs.f cgetrs.f + cpotrf.f cgetrf.f + sisnan.f slaisnan.f) set(DLASRC dbdsvdx.f dgbbrd.f dgbcon.f dgbequ.f dgbrfs.f dgbsv.f @@ -299,7 +307,7 @@ set(DLASRC dlaqtr.f dlar1v.f dlar2v.f iladlr.f iladlc.f dlarf.f dlarfb.f dlarfb_gett.f dlarfg.f dlarfgp.f dlarft.f dlarfx.f dlarfy.f dlargv.f dlarrv.f dlartv.f - dlarz.f dlarzb.f dlarzt.f dlaswp.f dlasy2.f + dlarz.f dlarzb.f dlarzt.f dlaswp.f dlasy2.f dlasyf.f dlasyf_rook.f dlasyf_rk.f dlasyf_aa.f dlatbs.f dlatdf.f dlatps.f dlatrd.f dlatrs.f dlatrz.f dlauu2.f dlauum.f dopgtr.f dopmtr.f dorg2l.f dorg2r.f @@ -316,8 +324,8 @@ set(DLASRC dsbev.f dsbevd.f dsbevx.f dsbgst.f dsbgv.f dsbgvd.f dsbgvx.f dsbtrd.f dspcon.f dspev.f dspevd.f dspevx.f dspgst.f dspgv.f dspgvd.f dspgvx.f dsprfs.f dspsv.f dspsvx.f dsptrd.f - dsptrf.f dsptri.f dsptrs.f dstegr.f dstein.f dstev.f dstevd.f dstevr.f - dstevx.f dsycon.f dsyev.f dsyevd.f dsyevr.f + dsptrf.f dsptri.f dsptrs.f dstegr.f dstev.f dstevd.f dstevr.f + dsycon.f dsyev.f dsyevd.f dsyevr.f dsyevx.f dsygs2.f dsygst.f dsygv.f dsygvd.f dsygvx.f dsyrfs.f dsysv.f dsysvx.f dsytd2.f dsytf2.f dsytrd.f dsytrf.f dsytri.f dsytrs.f dsytrs2.f From ca0b206d88c05bd2bd1823765bb0d900f651ab6a Mon Sep 17 00:00:00 2001 From: Christoph Conrads Date: Thu, 11 Nov 2021 18:09:41 +0000 Subject: [PATCH 3/3] CMake: always install lapack.h header fixes #632 --- CMakeLists.txt | 5 ++--- LAPACKE/CMakeLists.txt | 19 +++++++++++++------ LAPACKE/include/CMakeLists.txt | 6 +++++- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ddeafc618..0dc392eac3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -392,9 +392,8 @@ endif() set(LAPACK_INSTALL_EXPORT_NAME ${LAPACK_INSTALL_EXPORT_NAME_CACHE}) unset(LAPACK_INSTALL_EXPORT_NAME_CACHE) -if(LAPACKE) - add_subdirectory(LAPACKE) -endif() +add_subdirectory(LAPACKE) + #------------------------------------- # BLAS++ / LAPACK++ diff --git a/LAPACKE/CMakeLists.txt b/LAPACKE/CMakeLists.txt index 30735f7700..e78079c0eb 100644 --- a/LAPACKE/CMakeLists.txt +++ b/LAPACKE/CMakeLists.txt @@ -1,8 +1,3 @@ -message(STATUS "LAPACKE enable") -enable_language(C) - -set(LAPACK_INSTALL_EXPORT_NAME ${LAPACKELIB}-targets) - # Create a header file lapacke_mangling.h for the routines called in my C programs include(FortranCInterface) ## Ensure that the fortran compiler and c compiler specified are compatible @@ -16,8 +11,20 @@ if(NOT FortranCInterface_GLOBAL_FOUND OR NOT FortranCInterface_MODULE_FOUND) ${LAPACK_BINARY_DIR}/include/lapacke_mangling.h) endif() -include_directories(include ${LAPACK_BINARY_DIR}/include) add_subdirectory(include) + + +if(NOT LAPACKE) + return() +endif() + + +message(STATUS "LAPACKE enabled") +enable_language(C) + +set(LAPACK_INSTALL_EXPORT_NAME ${LAPACKELIB}-targets) + +include_directories(include ${LAPACK_BINARY_DIR}/include) add_subdirectory(src) add_subdirectory(utils) diff --git a/LAPACKE/include/CMakeLists.txt b/LAPACKE/include/CMakeLists.txt index b690dc5548..7b266fc99c 100644 --- a/LAPACKE/include/CMakeLists.txt +++ b/LAPACKE/include/CMakeLists.txt @@ -1,3 +1,7 @@ -set(LAPACKE_INCLUDE lapacke.h lapack.h lapacke_config.h lapacke_utils.h) +set(LAPACKE_INCLUDE lapack.h) + +IF(LAPACKE) + list(APPEND LAPACKE_INCLUDE lapacke.h lapacke_config.h lapacke_utils.h) +endif() file(COPY ${LAPACKE_INCLUDE} DESTINATION ${LAPACK_BINARY_DIR}/include)