diff options
Diffstat (limited to 'mk')
-rw-r--r-- | mk/blas.buildlink3.mk | 126 |
1 files changed, 103 insertions, 23 deletions
diff --git a/mk/blas.buildlink3.mk b/mk/blas.buildlink3.mk index 92ffa0a3c08..55f7621571a 100644 --- a/mk/blas.buildlink3.mk +++ b/mk/blas.buildlink3.mk @@ -1,14 +1,23 @@ -# $NetBSD: blas.buildlink3.mk,v 1.1 2020/10/12 21:51:57 bacon Exp $ +# $NetBSD: blas.buildlink3.mk,v 1.2 2021/06/15 04:41:51 thor Exp $ # -# This Makefile fragment is meant to be included by packages that use any BLAS -# (Basic Linear Algebra System) implementation instead of one particular one. +# This Makefile fragment is meant to be included by packages that use any +# BLAS (Basic Linear Algebra System) implementation instead of one particular +# one. # # Since pkgsrc always ships BLAS and LAPACK together (as upstream # implementations do), this adds both BLAS_LIBS and LAPACK_LIBS to the linker -# flags. Often, they will be identical or at least redundant. It is a matter -# of style to stay consistent in their use. +# flags. Often, they will be identical or at least redundant. LAPACK_LIBS +# does include BLAS_LIBS, in any case. # -# Keywords: blas lapack atlas openblas mkl +# The C interfaces CBLAS and LAPACKE are also selected +# via BLAS_C_INTERFACE in the package and respective CBLAS_LIBS and +# LAPACKE_LIBS are set. Also, BLAS_INCLUDES is set to preprocessor +# flags to locate/use respective headers. +# +# Note that use of the Accelerate framework is experimental and only +# attempted if user and package explicitly want it. +# +# Keywords: blas lapack netlib atlas openblas mkl # # === User-settable variables === # @@ -20,10 +29,12 @@ # Typically set in mk.conf. # # Possible: one or more of netlib, openblas, openblas_pthread, -# openblas_openmp, and Apple's accelerate.framework -# (to come: Intel MKL, other external optimized builds) +# openblas_openmp, accelerate.framework +# (Accelerate has differing API and needs special handling, might +# be supported in a few specific packages ony.) # # Default: All currently supported implementations (${_BLAS_TYPES}) +# except accelerate.framework # # === Package-settable variables === # @@ -32,6 +43,15 @@ # package. If not set, any BLAS implementation is OK. # Typically set in package Makefile. # +# BLAS_C_INTERFACE +# Set to yes if the package requires CBLAS or LAPACKE. This defines +# BLAS_INCLUDES and pulls in additional packages for netlib. Optimized +# implementations include the C interfaces in the main library anyway, +# but you still have the effect on BLAS_INCLUDES. +# +# BLAS_INDEX64 +# Set to yes if the package wants to utilize 64 bit indices. +# # === Variables automatically set here for use in package builds === # # BLAS_TYPE @@ -43,14 +63,24 @@ # Linker flags used for linking to BLAS library # LAPACK_LIBS # Linker flags used for linking to LAPACK library +# (including BLAS) +# CBLAS_LIBS +# Linker flags used for linking to CBLAS library +# (including BLAS) +# LAPACKE_LIBS +# Linker flags used for linking to LAPACKE library +# (including BLAS and LAPACK) +# BLAS_INCLUDES +# Preprocessor flags to locate/use C interfaces +# (both for CBLAS and LAPACKE) .if !defined(MK_BLAS_BUILDLINK3_MK) MK_BLAS_BUILDLINK3_MK= BUILD_DEFS+= PKGSRC_BLAS_TYPES -BUILD_DEFS_EFFECTS+= BLAS_TYPE BLAS_LIBS LAPACK_LIBS +BUILD_DEFS_EFFECTS+= BLAS_TYPE BLAS_LIBS LAPACK_LIBS \ + CBLAS_LIBS LAPACKE_LIBS BLAS_INCLUDES -# TODO: Upon commit change to: .include "bsd.prefs.mk" .include "../../mk/bsd.prefs.mk" # List of all possible BLAS choices, in order of *DEFAULT* preference. @@ -59,17 +89,30 @@ BUILD_DEFS_EFFECTS+= BLAS_TYPE BLAS_LIBS LAPACK_LIBS # slowest and not desirable in many situations. Users can override by setting # PKGSRC_BLAS_TYPES. (See comment above) _BLAS_TYPES= netlib openblas openblas_pthread openblas_openmp -# Darwin -.if exists(/System/Library/Frameworks/Accelerate.framework) -_BLAS_TYPES+= accelerate.framework -.endif +# The Accelerate framework is special, as it does not offer BLAS API compatible +# to the others. See liboctave/util/blaswrap.c in octave sources, or +# the wrapper https://github.com/mcg1969/vecLibFort that one might want to +# package. +# We have it as option only if user explicitly set it in PKGSRC_BLAS_TYPES +# and the package accepts it explicitly. BLAS_ACCEPTED?= ${_BLAS_TYPES} PKGSRC_BLAS_TYPES?= ${_BLAS_TYPES} +.if !empty(BLAS_INDEX64:Myes) +_BLAS_64= 64 +.else +_BLAS_64= +.endif + _BLAS_MATCH= .for b in ${PKGSRC_BLAS_TYPES} +# Seems like Accelerate does not offer a 64 bit interface (yet?). +# Exclude from list in that case, even if present. +. if ${b} != "accelerate.framework" || ( empty(_BLAS_64) \ + && exists(/System/Library/Frameworks/Accelerate.framework) ) _BLAS_MATCH+= ${BLAS_ACCEPTED:M${b}} +. endif .endfor .if !empty(_BLAS_MATCH) BLAS_TYPE= ${_BLAS_MATCH:[1]} @@ -78,24 +121,50 @@ BLAS_TYPE= none .endif .if ${BLAS_TYPE} == "netlib" -_BLAS_PKGPATH= math/lapack -BLAS_LIBS= -lblas -LAPACK_LIBS= -llapack ${BLAS_LIBS} +_BLAS_PKGPATH= math/lapack${_BLAS_64} +_CBLAS_PKGPATH= math/cblas${_BLAS_64} +_LAPACKE_PKGPATH= math/lapacke${_BLAS_64} +BLAS_LIBS= -lblas${_BLAS_64} +LAPACK_LIBS= -llapack${_BLAS_64} ${BLAS_LIBS} +CBLAS_LIBS= -lcblas${_BLAS_64} ${BLAS_LIBS} +LAPACKE_LIBS= -llapacke${_BLAS_64} ${LAPACK_LIBS} +BLAS_INCLUDES= -I${PREFIX}/include/netlib${_BLAS_64} +. if ${_BLAS_64} == "64" +BLAS_INCLUDES+= -DWeirdNEC -DHAVE_LAPACK_CONFIG_H -DLAPACK_ILP64 +. endif .elif ${BLAS_TYPE} == "openblas" -_BLAS_PKGPATH= math/openblas -BLAS_LIBS= -lopenblas +_BLAS_PKGPATH= math/openblas${_BLAS_64} +BLAS_LIBS= -lopenblas${_BLAS_64} LAPACK_LIBS= ${BLAS_LIBS} +CBLAS_LIBS= ${BLAS_LIBS} +LAPACKE_LIBS= ${BLAS_LIBS} +BLAS_INCLUDES= -I${PREFIX}/include/openblas${_BLAS_64} .elif ${BLAS_TYPE} == "openblas_pthread" -_BLAS_PKGPATH= math/openblas_pthread -BLAS_LIBS= -lopenblas_pthread +_BLAS_PKGPATH= math/openblas${_BLAS_64}_pthread +BLAS_LIBS= -lopenblas${_BLAS_64}_pthread LAPACK_LIBS= ${BLAS_LIBS} +CBLAS_LIBS= ${BLAS_LIBS} +LAPACKE_LIBS= ${BLAS_LIBS} +BLAS_INCLUDES= -I${PREFIX}/include/openblas64_pthread .elif ${BLAS_TYPE} == "openblas_openmp" -_BLAS_PKGPATH= math/openblas_openmp -BLAS_LIBS= -lopenblas_openmp +_BLAS_PKGPATH= math/openblas${_BLAS_64}_openmp +BLAS_LIBS= -lopenblas${_BLAS_64}_openmp LAPACK_LIBS= ${BLAS_LIBS} +CBLAS_LIBS= ${BLAS_LIBS} +LAPACKE_LIBS= ${BLAS_LIBS} +BLAS_INCLUDES= -I${PREFIX}/include/openblas${_BLAS_64}_openmp .elif ${BLAS_TYPE} == "accelerate.framework" +# No 64 bit variant yet. Excluded above. +# Actually, only CBLAS_LIBS is safe to use. Others have g77/f2c calling +# conventions, not gfortran. This needs custom handling in packages. BLAS_LIBS= -framework Accelerate +CBLAS_LIBS= ${BLAS_LIBS} LAPACK_LIBS= ${BLAS_LIBS} +LAPACKE_LIBS= # build a wrapper for that? +BLAS_INCLUDES= # not delivered yet +# Idea for cblas.h including Accelerate/Accelerate.h (would work the same +# for Intel MKL with -DBLASWRAP_MKL for mkl_cblas.h). +#BLAS_INCLUDES= -I${PREFIX}/include/blaswrap -DBLASWRAP_ACCELERATE .else # invalid or unimplemented type PKG_FAIL_REASON+= \ "There is no acceptable BLAS for ${PKGNAME} in: ${PKGSRC_BLAS_TYPES}." @@ -105,4 +174,15 @@ PKG_FAIL_REASON+= \ .include "../../${_BLAS_PKGPATH}/buildlink3.mk" .endif +.if !empty(BLAS_C_INTERFACE:Myes) +. if defined(_CBLAS_PKGPATH) +. include "../../${_CBLAS_PKGPATH}/buildlink3.mk" +. endif +. if defined(_LAPACKE_PKGPATH) +. include "../../${_LAPACKE_PKGPATH}/buildlink3.mk" +. endif +.else +. undef BLAS_INCLUDES +.endif + .endif # BLAS_BUILDLINK3_MK |