1
2
3PORTNAME=	atlas
4PORTVERSION=	3.10.3
5PORTREVISION=	2
6PORTEPOCH=	1
7CATEGORIES=	math
8MASTER_SITES=	SF/math-${PORTNAME}/Stable/${PORTVERSION}
9PKGNAMESUFFIX=	-math
10DISTNAME=	${PORTNAME}${PORTVERSION}
11
12MAINTAINER=	ports@MidnightBSD.org
13COMMENT=	Automatically Tuned Linear Algebra Software (ATLAS)
14
15LICENSE=	bsd3
16
17BUILD_DEPENDS=	${NONEXISTENT}:math/lapack:checksum
18
19USES=		fortran gmake tar:bzip2
20USE_GCC=	yes
21
22CONFLICTS=	cblas-[0-9]*
23MANUAL_PACKAGE_BUILD=	Optimizes for the local machine.
24
25OPTIONS_DEFINE=		DOCS DATA ARCHDEF TSC WALL_TIMER
26OPTIONS_DEFAULT=	DATA
27ARCHDEF_DESC=		Use a specified architectural default
28DATA_DESC=		Install tuning data and logs from the build
29TSC_DESC=		If WALL_TIMER is enabled, use the TSC
30WALL_TIMER_DESC=	Use less robust timing with higher resolution
31
32PORTSCOUT=	limitw:1,even
33WRKSRC=		${WRKDIR}/ATLAS
34
35.include <bsd.mport.options.mk>
36
37#Increase ATLAS_MAXMALLOC if the atlas threaded libraries perform poorly on large problems:
38# http://math-atlas.sourceforge.net/errata.html#MaxMalloc
39ATLAS_MAXMALLOC?=	67108864
40
41.if !empty(ARCH:M*64*)
42POINTER?=	64
43.else
44POINTER?=	32
45.endif
46
47.if defined(MAINTAINER_MODE)
48LIB_DEPENDS+=	libblas.so:math/blas
49.endif
50
51.if ${PORT_OPTIONS:MDATA}
52PORTDATA=	*
53.endif
54PORTDOCS=	*
55
56.if ${PORT_OPTIONS:MARCHDEF}
57.  if defined(ARCHDEF)
58.    if ${ARCHDEF} == "NONE"
59ARCHDEFFLAG=	-Si archdef 0
60.    endif
61.  else
62IGNORE=		you have set WITH_ARCHDEF, but have not defined ARCHDEF
63.  endif
64.endif
65
66USE_LDCONFIG=	yes
67
68EXTRA_FLAGS?=	${PICFLAG} -Wl,-rpath=${_GCC_RUNTIME}
69SHARED_FLAGS=	${PICFLAG} -DPIC
70SHARED_LAPACK_WRKSRC=	WRKSRC
71STATIC_LAPACK_WRKSRC=	WRKSRC
72PICFLAG?=	-fPIC
73CFLAGS+=	${PICFLAG}
74CONFIGURE_ENV+=	PATH="${WRKDIR}/.bin:${PATH}"
75MAKE_ENV+=	MAKE=${GMAKE} PATH="${WRKDIR}/.bin:${PATH}"
76BINARY_ALIAS=	make=${GMAKE} gcc=${CC} gfortran=${FC} f77=${FC}
77
78pre-everything::
79	@${CAT} ${FILESDIR}/tuning-message
80
81pre-configure:
82	${REINPLACE_CMD} -e 's|$$(ARCH)|$$(ATLAS_ARCH)|g' \
83		${WRKSRC}/Make.top \
84		${WRKSRC}/makes/Make.bin \
85		${WRKSRC}/makes/Make.lib \
86		${WRKSRC}/makes/Make.sysinfo \
87		${WRKSRC}/CONFIG/src/Makefile \
88		${WRKSRC}/CONFIG/ARCHS/Makefile
89	${REINPLACE_CMD} -e "\|OS=ALL|{N; \
90		s|-mavx|-msse3|;s|'| ${EXTRA_FLAGS}'|4;}" \
91		${WRKSRC}/CONFIG/src/atlcomp.txt
92	${REINPLACE_CMD} -E -e \
93	"\|(#define ATL_MaxMalloc[[:blank:]]+)([[:digit:]]+)|s||\1${ATLAS_MAXMALLOC}|" \
94		${WRKSRC}/include/atlas_lvl3.h
95	${REINPLACE_CMD} -e 's|%%WRKBIN%%|${WRKDIR}/.bin|'	\
96		${WRKSRC}/CONFIG/src/probe_comp.c
97
98do-configure:
99	if [ ${PORT_OPTIONS:MWALL_TIMER} ] ; then \
100		TIMEFLAG= ; \
101		if [ \( ${ARCH} = "i386" -o ${ARCH} = "amd64" \) -a ${PORT_OPTIONS:MTSC} ] ; then \
102			freq=`${SYSCTL} -ni machdep.tsc_freq` ; \
103			if [ "x$${freq}" != "x" ] ; then \
104				if [ $${freq} -gt 1000000 ] ; then \
105					MHZ=$$(($${freq}/1000000)) ; \
106					TIMEFLAG="-D c -DPentiumCPS=$${MHZ}" ; \
107				fi ; \
108			fi ; \
109		fi ; \
110		if [ "x$${TIMEFLAG}" = "x" ] ; then \
111			TIMEFLAG="-D c -DWALL" ; \
112		fi ; \
113	fi ; \
114	${ECHO_CMD} "TIMEFLAG = $${TIMEFLAG}" \
115		> ${WRKSRC}/saved_flags ; \
116	${ECHO_CMD} "Dummy configuration of ATLAS to obtain compiler flags:" ; \
117	${MKDIR} ${WRKSRC}/static ; cd ${WRKSRC}/static ; \
118		${SETENV} ${CONFIGURE_ENV} ../configure --cc="${CC}" --cflags="${CFLAGS}" \
119		--prefix="${PREFIX}" -v 2 $${TIMEFLAG} ${ARCHDEFFLAG} \
120		-Ss f77lib " " -Ss pmake "${MAKE} ${_MAKE_JOBS}" \
121		-Fa alg "${STATIC_FLAGS} " -b ${POINTER}
122	${SED} -ne "\|F77FLAGS =|p" ${WRKSRC}/static/Make.inc \
123		>> ${WRKSRC}/saved_flags
124
125post-configure:
126	@${RM} -r ${WRKSRC}/static
127
128do-build:
129.for opt in shared static
130	@${ECHO_CMD} "Building the LAPACK archives with ${opt} ATLAS flags:"
131	F77FLAGS="`${MAKE} -f ${WRKSRC}/saved_flags -V F77FLAGS` ${EXTRA_FLAGS}" ; \
132	LW=`${MAKE} -C ${PORTSDIR}/math/lapack -V ${${opt:tu}_LAPACK_WRKSRC}` ; \
133	${MAKE} -C ${PORTSDIR}/math/lapack WITH=${opt:tu} clean patch ; \
134	${REINPLACE_CMD} -e 's|-O0|-O0 ${EXTRA_FLAGS}|'	$${LW}/make.inc ; \
135	cd $${LW} ; ${SETENV} ${MAKE_ENV:NFFLAGS=*} EXTRAFLAGS="${${opt:tu}_FLAGS} ${PICFLAG} " \
136		FFLAGS="-pipe $${F77FLAGS}" ${MAKE_CMD} ${_MAKE_JOBS} ${MAKE_ARGS} \
137		ARCH="${AR}" lapacklib ; \
138	TIMEFLAG=`${MAKE} -f ${WRKSRC}/saved_flags -V TIMEFLAG` ; \
139	${MKDIR} ${WRKSRC}/${opt}/lib ; cd ${WRKSRC}/${opt} ; \
140	${MV} $${LW}/liblapack.a liblapack_${opt}.a ; \
141	${AR} -dv liblapack_${opt}.a lsame.o xerbla.o csrot.o zdrot.o ; \
142	${CP} liblapack_${opt}.a lib/liblapack.a ; \
143	${MAKE} -C ${PORTSDIR}/math/lapack clean ; \
144	${ECHO_CMD} "Configuring ${opt} ATLAS:" ; \
145		${SETENV} ${CONFIGURE_ENV} ../configure --cc="${CC}" --cflags="${CFLAGS}" \
146		--prefix="${PREFIX}" -v 2 $${TIMEFLAG} ${ARCHDEFFLAG} \
147		-Ss flapack "${WRKSRC}/${opt}/liblapack_${opt}.a" \
148		-Ss f77lib " " -Ss pmake "${MAKE_CMD} ${_MAKE_JOBS}" \
149		-Si lapackref 1 -D c -DATL_FULL_LAPACK \
150		-Fa alg "${${opt:tu}_FLAGS} " -b ${POINTER} ; \
151	if [ "x${WITH_ARCHDEF}" != "x" ] ; then \
152		if [ "x${ARCHDEF}" != "xNONE" ] ; then \
153			if [ -f ${ARCHDEF} ] ; then \
154				${CP} -f ${ARCHDEF} ${WRKSRC}/CONFIG/ARCHS/ ; \
155			elif [ ! -f ${WRKSRC}/CONFIG/ARCHS/${ARCHDEF} ] ; then \
156				${ECHO_CMD} \
157				"==> ${PKGNAME} : ARCHDEF \"${ARCHDEF}\" does not exist" ; \
158				exit 1 ; \
159			fi ; \
160			${REINPLACE_CMD} -E -e \
161			"\|[[:blank:]]*ARCH =|s|=.*|= ${ARCHDEF:T:S/.tgz$//}|" \
162			${WRKSRC}/${opt}/Make.inc ; \
163		fi ; \
164	fi ; \
165	${ECHO_CMD} "Building ${opt} ATLAS:" ; cd ${WRKSRC}/${opt} ; \
166	${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${MAKE_ARGS} all
167.endfor
168
169L1=	${FC} $${F77FLAGS} ${SHARED_FLAGS} ${LDFLAGS} -shared -Wl,-x \
170	-Wl,--whole-archive -Wl,-soname,
171L2=	-Wl,--no-whole-archive -Wl,--as-needed -lpthread
172
173post-build:
174.for opt in shared static
175	@${ECHO_CMD} "Timing ${opt} ATLAS:"
176	(cd ${WRKSRC}/${opt} ; ${SETENV} ${MAKE_ENV} \
177		${MAKE_CMD} ${MAKE_ARGS} time ; \
178		cd ARCHS ; ${SETENV} ${MAKE_ENV} \
179			${MAKE_CMD} ${MAKE_ARGS} ArchNew tarfile)
180.endfor
181	@${ECHO_CMD} "Building ATLAS shared libraries:"
182	F77FLAGS="`${MAKE} -f ${WRKSRC}/saved_flags -V F77FLAGS` ${EXTRA_FLAGS}" ; \
183	cd ${WRKSRC}/shared/lib ; \
184	${L1}libatlas.so.2 -o libatlas.so.2 libatlas.a ${L2} ; \
185	${L1}libf77blas.so.2 -o libf77blas.so.2 libf77blas.a ${L2} libatlas.so.2 ; \
186	${L1}libptf77blas.so.2 -o libptf77blas.so.2 libptf77blas.a ${L2} libatlas.so.2 ; \
187	${L1}libcblas.so.2 -o libcblas.so.2 libcblas.a ${L2} libatlas.so.2 ; \
188	${L1}libptcblas.so.2 -o libptcblas.so.2 libptcblas.a ${L2} libatlas.so.2 ; \
189	${L1}libalapack.so.2 -o libalapack.so.2 liblapack.a ${L2} libatlas.so.2
190
191.if defined(MAINTAINER_MODE)
192STATIC_BLAS=	${LOCALBASE}/lib/libblas.a
193SHARED_BLAS=	-L${LOCALBASE}/lib -lblas
194
195test: build
196.  for opt in shared static
197	@${ECHO_CMD} "Testing ${opt} ATLAS:"
198	@cd ${WRKSRC}/${opt} ; ${SETENV} ${MAKE_ENV} BLAS="${${opt:tu}_BLAS}" \
199	${MAKE_CMD} ${MAKE_ARGS} check ptcheck error_report
200.  endfor
201.endif
202
203do-install:
204.for i in libatlas libcblas libf77blas liblapack libptcblas libptf77blas
205	${INSTALL_DATA} ${WRKSRC}/static/lib/${i}.a \
206		${STAGEDIR}${PREFIX}/lib/${i:S|lapack|alapack|}.a
207	${INSTALL_DATA} ${WRKSRC}/shared/lib/${i}.a \
208		${STAGEDIR}${PREFIX}/lib/${i:S|lapack|alapack|}_pic.a
209	${INSTALL_LIB} ${WRKSRC}/shared/lib/${i:S|lapack|alapack|}.so.2 \
210		${STAGEDIR}${PREFIX}/lib
211	${LN} -sf ${i:S|lapack|alapack|}.so.2 \
212		${STAGEDIR}${PREFIX}/lib/${i:S|lapack|alapack|}.so
213.endfor
214	${INSTALL_DATA} ${WRKSRC}/include/cblas.h ${WRKSRC}/include/clapack.h \
215		${STAGEDIR}${PREFIX}/include
216.for opt in shared static
217	@${MKDIR} ${STAGEDIR}${PREFIX}/include/atlas/${opt}
218	${INSTALL_DATA} ${WRKSRC}/${opt}/include/* \
219		${STAGEDIR}${PREFIX}/include/atlas/${opt}
220.    if ${PORT_OPTIONS:MDATA}
221	@${MKDIR} ${STAGEDIR}${DATADIR}/${opt}
222	(cd ${WRKSRC}/${opt}/bin; \
223		${COPYTREE_SHARE} INSTALL_LOG ${STAGEDIR}${DATADIR}/${opt})
224	(cd ${WRKSRC}/${opt}/ARCHS; \
225		${COPYTREE_SHARE} "*" ${STAGEDIR}${DATADIR}/${opt} \
226		"! -name Makefile -and ! -name *.tgz")
227	@${FIND} ${STAGEDIR}${DATADIR}/${opt} -type d -empty -delete
228.    endif
229.endfor
230.if ${PORT_OPTIONS:MDOCS}
231	@${MKDIR} ${STAGEDIR}${DOCSDIR}
232	${INSTALL_DATA} ${WRKSRC}/doc/* ${STAGEDIR}${DOCSDIR}
233.endif
234
235post-install:
236.for d in shared static
237.  for f in xnegmm xnegmv xnegr1
238	${STRIP_CMD} ${STAGEDIR}${DATADIR}/${d}/${f}
239.  endfor
240.endfor
241
242.include <bsd.port.mk>
243