1PORTNAME?=	lapack
2PORTVERSION=	3.12.0
3.if !(defined(BLAS_SLAVEPORT) || defined(CBLAS_SLAVEPORT) || defined(XLAPACK_SLAVEPORT) || defined(LAPACKE_SLAVEPORT))
4PORTREVISION=	2
5.else
6PORTREVISION?=	0	# Never remove this line, keep PORTREVISION?=0 in case.
7.endif
8CATEGORIES=	math
9MASTER_SITES=	https://github.com/Reference-LAPACK/lapack/archive/refs/tags/:src	\
10		http://www.netlib.org/lapack/:man	\
11		FREEBSD_LOCAL/thierry/lapack-${PORTVERSION}/:man
12DISTFILES=	v${PORTVERSION}${EXTRACT_SUFX}:src
13.if make(makesum) || !(defined(BLAS_SLAVEPORT) || defined(XLAPACK_SLAVEPORT))
14DISTFILES+=	manpages.tgz:man
15.endif
16DIST_SUBDIR=	lapack-${PORTVERSION}
17
18MAINTAINER?=	ports@MidnightBSD.org
19COMMENT?=	Linear Algebra PACKage
20WWW?=		https://www.netlib.org/lapack/
21
22LICENSE?=	bsd3
23
24USES=		cmake:testing cpe fortran
25WRKSRC=		${WRKDIR}/lapack-${PORTVERSION}
26# The actual math/scilab needs deprecated functions - to be removed later
27CMAKE_ON=	BUILD_SHARED_LIBS BUILD_DEPRECATED
28USE_LDCONFIG=	yes
29CPE_VENDOR=	lapack_project
30CPE_PRODUCT=	lapack
31
32SVERSION=	${PORTVERSION:R:R}
33PLIST_SUB=	SVERSION="${SVERSION}" VER=${PORTVERSION}
34
35.include <bsd.mport.options.mk>
36
37.if defined(BLAS_SLAVEPORT)
38BUILD_WRKSRC=		${CONFIGURE_WRKSRC}/BLAS/SRC
39INSTALL_WRKSRC=		${BUILD_WRKSRC}
40BLASLIB=		libblas.a
41LIBS=			blas
42PLIST_SUB+=		BLAS="" CBLAS="@comment " LAPACK="@comment " XLAPACK="@comment " LAPACKE="@comment "
43.elif defined(CBLAS_SLAVEPORT)
44BUILD_DEPENDS+=		lapack>0:math/lapack
45LIB_DEPENDS+=		libblas.so:math/blas
46CMAKE_ON+=		CBLAS
47BUILD_WRKSRC=		${CONFIGURE_WRKSRC}/CBLAS
48INSTALL_WRKSRC=		${BUILD_WRKSRC}
49CBLASLIB=		libcblas.a
50LIBS=			cblas
51PLIST_SUB+=		BLAS="@comment " CBLAS="" LAPACK="@comment " XLAPACK="@comment " LAPACKE="@comment "
52.elif defined(LAPACKE_SLAVEPORT)
53USES+=			blaslapack
54CMAKE_ON+=		USE_OPTIMIZED_LAPACK LAPACKE
55CMAKE_ARGS+=		-DBLAS_LIBRARIES="${LOCALBASE}/lib/libblas.so"		\
56			-DLAPACK_LIBRARIES="${LOCALBASE}/lib/liblapack.so"
57BUILD_WRKSRC=		${CONFIGURE_WRKSRC}/LAPACKE
58INSTALL_WRKSRC=		${BUILD_WRKSRC}
59LAPACKELIB=		liblapacke.a
60PLIST_SUB+=		BLAS="@comment " CBLAS="@comment " LAPACK="@comment " XLAPACK="@comment " LAPACKE=""
61.elif defined(XLAPACK_SLAVEPORT)
62LIB_DEPENDS+=		libblas.so:math/blas		\
63			liblapack.so:math/lapack	\
64			libxblas.so:math/xblas
65FFLAGS+=		-fallow-argument-mismatch
66CMAKE_ON+=		USE_XBLAS  BUILD_TESTING
67CMAKE_ARGS+=		-DBLAS_LIBRARIES="${LOCALBASE}/lib/libblas.so"
68PLIST_SUB+=		BLAS="@comment " CBLAS="@comment " LAPACK="@comment " XLAPACK="" LAPACKE="@comment "
69.else
70# Upstream recommand to use an optimized BLAS, but it would cause conflicts
71# among the dependencies: for an optimized lapack switch to OpenBLAS.
72# BUILD_TESTING to get tmglib.
73LIB_DEPENDS+=		libblas.so:math/blas
74. if defined(MAINTAINER_MODE)
75USES+=			python:build,test
76BINARY_ALIAS+=		python3=${PYTHON_CMD}
77. endif
78CMAKE_ON+=		USE_OPTIMIZED_BLAS BUILD_TESTING
79CMAKE_ARGS+=		-DBLAS_LIBRARIES="${LOCALBASE}/lib/libblas.so"
80LIBS=			lapack
81PLIST_SUB+=		BLAS="@comment " CBLAS="@comment " LAPACK="" XLAPACK="@comment " LAPACKE="@comment "
82.endif
83
84.include <bsd.port.pre.mk>
85
86post-patch:
87	${SED} -Ee '\
88		s@^(FORTRAN|LOADER)([[:blank:]]*=)(.*)@\1\2 $${FC}@; \
89		s@^(OPTS[[:blank:]]*=)(.*)@\1 $${FFLAGS} $${EXTRAFLAGS}@; \
90		s@^NOOPT[[:blank:]]*=.*@& $${EXTRAFLAGS}@; \
91		s@^(LOADOPTS[[:blank:]]*=)(.*)@\1 $${LDFLAGS} $${EXTRAFLAGS}@; \
92		s@^(CC[[:blank:]]*=)(.*)@@; \
93		s@^(FC[[:blank:]]*=)(.*)@@; \
94		s@^(CFLAGS[[:blank:]]*)(=)(.*)@\1 += $${EXTRAFLAGS}@; \
95		s@^(FFLAGS[[:blank:]]*=)(.*)@@; \
96		s@^(LDFLAGS[[:blank:]]*=)(.*)@@; \
97		\@(BLAS|LAPACKE|RAN)LIB[[:blank:]]*=@d;' \
98			${WRKSRC}/make.inc.example > ${WRKSRC}/make.inc
99
100pre-configure:
101	${REINPLACE_CMD} -e 's@\./lapack_testing\.py@${S} &@' \
102		${WRKSRC}/Makefile
103	${FIND} ${WRKSRC} -name Makefile | ${XARGS}	\
104		${SED} -i ".bak" -e 's|^ifdef|.ifdef|;s|^endif|.endif|'
105
106post-build:
107.if defined(BLAS_SLAVEPORT)
108	${SED} -e 's|%%LIB%%|blas|g;s|cd SRC|cd BLAS/SRC|;s|SRC/lib|BLAS/SRC/lib|'	\
109		${FILESDIR}/static.mk >> ${BUILD_WRKSRC}/CMakeFiles/blas.dir/build.make
110	(cd ${CONFIGURE_WRKSRC} && ${MAKE} -f BLAS/SRC/CMakeFiles/blas.dir/build.make build-static)
111.elif defined(CBLAS_SLAVEPORT)
112	${SED} -e 's|%%LIB%%|cblas|g;s|cd SRC|cd CBLAS/src|;s|SRC/lib|CBLAS/src/lib|'	\
113		${FILESDIR}/static.mk >> ${BUILD_WRKSRC}/src/CMakeFiles/cblas.dir/build.make
114	(cd ${CONFIGURE_WRKSRC} && ${MAKE} -f CBLAS/src/CMakeFiles/cblas.dir/build.make build-static)
115.elif defined(LAPACKE_SLAVEPORT)
116	${SED} -e 's|%%LIB%%|lapacke|g;s|cd SRC|cd LAPACKE|' ${FILESDIR}/static.mk	\
117		>> ${BUILD_WRKSRC}/CMakeFiles/lapacke.dir/build.make
118	(cd ${CONFIGURE_WRKSRC} && ${MAKE} -f LAPACKE/CMakeFiles/lapacke.dir/build.make build-static)
119.else # xlapack + Lapack + tmglib
120	${SED} -e 's|%%LIB%%|lapack|g' ${FILESDIR}/static.mk	\
121		>> ${BUILD_WRKSRC}/SRC/CMakeFiles/lapack.dir/build.make
122	(cd ${CONFIGURE_WRKSRC} && ${MAKE} -f SRC/CMakeFiles/lapack.dir/build.make build-static)
123	${SED} -e 's|%%LIB%%|tmglib|g;s|cd SRC|cd TESTING/MATGEN|;s|SRC/lib|TESTING/MATGEN/lib|'	\
124		${FILESDIR}/static.mk >> ${BUILD_WRKSRC}/TESTING/MATGEN/CMakeFiles/tmglib.dir/build.make
125	(cd ${BUILD_WRKSRC} && ${MAKE} -f TESTING/MATGEN/CMakeFiles/tmglib.dir/build.make build-static)
126.endif
127
128pre-install:
129.if !(defined(BLAS_SLAVEPORT) || defined(CBLAS_SLAVEPORT) || defined(XLAPACK_SLAVEPORT) || defined(LAPACKE_SLAVEPORT))
130	cd ${WRKDIR} && ${FIND} man/man3 -type f | ${GREP} -v '/\._' | \
131	tee ${WRKDIR}/manpages | ${SED} 's|^|share/|; s|$$|.gz|' >> ${TMPPLIST}
132	cd ${WRKDIR} && \
133	${XARGS} -J @ ${INSTALL_MAN} @ ${PREFIX}/share/man/man3 < ${WRKDIR}/manpages
134.endif
135
136post-install:
137.if defined(BLAS_SLAVEPORT)
138	${INSTALL_DATA} ${CONFIGURE_WRKSRC}/BLAS/SRC/${BLASLIB} ${PREFIX}/lib
139	${INSTALL_DATA} ${CONFIGURE_WRKSRC}/BLAS/blas.pc ${PREFIX}/libdata/pkgconfig
140.elif defined(CBLAS_SLAVEPORT)
141	# Avoid conflict with OpenBLAS
142	${MKDIR} ${PREFIX}/include/cblas
143	${MV} ${PREFIX}/include/*.h ${PREFIX}/include/cblas/
144	${INSTALL_DATA} ${BUILD_WRKSRC}/src/${CBLASLIB} ${PREFIX}/lib
145.elif defined(LAPACKE_SLAVEPORT)
146	# Avoid conflict with OpenBLAS
147	${MKDIR} ${PREFIX}/include/lapacke
148	${MV} ${PREFIX}/include/*.h ${PREFIX}/include/lapacke/
149	${INSTALL_DATA} ${CONFIGURE_WRKSRC}/LAPACKE/${LAPACKELIB} ${PREFIX}/lib
150.elif defined(XLAPACK_SLAVEPORT)
151	${INSTALL_DATA} ${BUILD_WRKSRC}/SRC/liblapack.a ${PREFIX}/lib/libxlapack.a
152	${INSTALL_DATA} ${BUILD_WRKSRC}/TESTING/MATGEN/libtmglib.a	\
153		${PREFIX}/lib/libxtmglib.a
154	${MV} ${PREFIX}/lib/liblapack.so	\
155		${PREFIX}/lib/libxlapack.so.${PORTVERSION}
156	${LN} -sf libxlapack.so.${PORTVERSION} ${PREFIX}/lib/libxlapack.so
157	${LN} -sf libxlapack.so.${PORTVERSION}	\
158		${PREFIX}/lib/libxlapack.so.${SVERSION}
159	${MV} ${PREFIX}/lib/libtmglib.so	\
160		${PREFIX}/lib/libxtmglib.so.${PORTVERSION}
161	${LN} -sf libxtmglib.so.${PORTVERSION} ${PREFIX}/lib/libxtmglib.so
162	${LN} -sf libxtmglib.so.${PORTVERSION}	\
163		${PREFIX}/lib/libxtmglib.so.${SVERSION}
164	${SED} -e 's|lapack|xlapack|g;s|LAPACK|XLAPACK|'		\
165		${PREFIX}/libdata/pkgconfig/lapack.pc	\
166		> ${PREFIX}/libdata/pkgconfig/xlapack.pc
167	${RM} ${PREFIX}/libdata/pkgconfig/lapack.pc
168.else # Lapack
169	${INSTALL_DATA} ${BUILD_WRKSRC}/SRC/liblapack.a ${PREFIX}/lib
170	${INSTALL_DATA} ${BUILD_WRKSRC}/TESTING/MATGEN/libtmglib.a ${PREFIX}/lib
171.endif
172
173.include <bsd.port.post.mk>
174