Changeset View
Changeset View
Standalone View
Standalone View
math/atlas/Makefile
Context not available. | |||||
# $FreeBSD$ | # $FreeBSD$ | ||||
PORTNAME= atlas | PORTNAME= atlas | ||||
PORTVERSION= 3.8.4 | PORTVERSION= 3.10.2 | ||||
PORTREVISION= 7 | |||||
PORTEPOCH= 1 | PORTEPOCH= 1 | ||||
CATEGORIES= math | CATEGORIES= math | ||||
MASTER_SITES= SF/math-${PORTNAME}/Stable/${PORTVERSION} | MASTER_SITES= SF/math-${PORTNAME}/Stable/${PORTVERSION} | ||||
Context not available. | |||||
MAINTAINER= ports@FreeBSD.org | MAINTAINER= ports@FreeBSD.org | ||||
COMMENT= Automatically Tuned Linear Algebra Software (ATLAS) | COMMENT= Automatically Tuned Linear Algebra Software (ATLAS) | ||||
LICENSE= BSD | LICENSE= BSD3CLAUSE | ||||
BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/math/lapack:checksum | BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/math/lapack:checksum | ||||
USES= fortran tar:bzip2 | LAPACK_VER= 3.4.2 | ||||
USES= fortran gmake tar:bzip2 | |||||
USE_GCC= yes | USE_GCC= yes | ||||
CONFLICTS= atlas-devel-[0-9]* cblas-[0-9]* | CONFLICTS= atlas-devel-[0-9]* cblas-[0-9]* | ||||
Context not available. | |||||
TSC_DESC= If WALL_TIMER is enabled, use the TSC | TSC_DESC= If WALL_TIMER is enabled, use the TSC | ||||
WALL_TIMER_DESC= Use less robust timing with higher resolution | WALL_TIMER_DESC= Use less robust timing with higher resolution | ||||
BADTAR= atlas_test1.1.3 lapack_test | |||||
MK2FIX= Make.top configure makes/Make.bin makes/Make.l1tune makes/Make.mvtune \ | |||||
makes/Make.plinc makes/Make.r1tune makes/Make.res_raw \ | |||||
results/report.base bin/atlas_install.c bin/sum2csv.sh | |||||
MKDIR2FIX= CONFIG/src/*.c include/atlas_*.h tune/blas/gemm/*.c \ | |||||
tune/blas/gemv/*.c tune/blas/ger/*.c tune/blas/level1/*.c \ | |||||
tune/sysinfo/*.c tune/threads/tune_count.c | |||||
GCC2FIX= gemm/CASES/dcases.vnb gemm/CASES/scases.vnb \ | |||||
gemv/MVNCASES/?mvncases.idx gemv/MVTCASES/?mvtcases.idx \ | |||||
ger/R1CASES/?r1cases.idx ger/R2CASES/?r2cases.idx | |||||
COMP2FIX= SpewMakeInc.c probe_comp.c | |||||
GOODGCC= include/atlas_genparse.h makes/Make.mmtune makes/Make.mvtune \ | |||||
makes/Make.r1tune | |||||
PORTSCOUT= limitw:1,even | PORTSCOUT= limitw:1,even | ||||
WRKSRC= ${WRKDIR}/ATLAS | WRKSRC= ${WRKDIR}/ATLAS | ||||
Context not available. | |||||
LIB_DEPENDS+= libblas.so:${PORTSDIR}/math/blas | LIB_DEPENDS+= libblas.so:${PORTSDIR}/math/blas | ||||
.endif | .endif | ||||
.if ${PORT_OPTIONS:MDATA} | |||||
PORTDATA= * | |||||
.endif | |||||
PORTDOCS= * | |||||
.if ${PORT_OPTIONS:MARCHDEF} | .if ${PORT_OPTIONS:MARCHDEF} | ||||
. if defined(ARCHDEF) | . if defined(ARCHDEF) | ||||
. if ${ARCHDEF} == "NONE" | . if ${ARCHDEF} == "NONE" | ||||
Context not available. | |||||
SHARED_FLAGS= ${PTHREAD_CFLAGS} ${PICFLAG} -DPIC | SHARED_FLAGS= ${PTHREAD_CFLAGS} ${PICFLAG} -DPIC | ||||
SHARED_LAPACK_WRKSRC= WRKSRC_SHARED | SHARED_LAPACK_WRKSRC= WRKSRC_SHARED | ||||
STATIC_FLAGS= ${PTHREAD_CFLAGS} | STATIC_FLAGS= ${PTHREAD_CFLAGS} | ||||
MAKE_ENV= MAKE=${MAKE_CMD} | |||||
STATIC_LAPACK_WRKSRC= WRKSRC | STATIC_LAPACK_WRKSRC= WRKSRC | ||||
# Remove specific optimizations from CFLAGS, they will be handled by the build | |||||
CCFLAGS= ${CFLAGS:C/-O./ /W:C/march=.*/march=native/} | |||||
FFFLAGS= ${FFLAGS:C/-O./ /W} | |||||
post-patch: | pre-everything:: | ||||
@cd ${WRKSRC}/CONFIG/ARCHS ; for t in *.tgz ; do \ | @${ECHO_MSG} | ||||
@${ECHO_MSG} "Please turn off CPU throttling when installing ATLAS!" | |||||
@${ECHO_MSG} | |||||
pre-configure: | |||||
.for bt in ${BADTAR} | |||||
${MV} ${WRKSRC}/CONFIG/ARCHS/${bt}.tar.bz2 ${WRKSRC}/CONFIG/ARCHS/${bt}.tar.bz2.bad | |||||
.endfor | |||||
cd ${WRKSRC}/CONFIG/ARCHS ; for t in *.tar.bz2 ; do \ | |||||
${MV} $${t} $${t}.bak ; \ | ${MV} $${t} $${t}.bak ; \ | ||||
${TAR} -s '/gcc/${CC}/' -xf $${t}.bak ; \ | ${TAR} -s '/gcc/${CC}/' -xf $${t}.bak ; \ | ||||
${TAR} -czf $${t} $${t%.tgz} ; \ | ${TAR} -cjf $${t} $${t%.tar.bz2} ; \ | ||||
${RM} -r $${t%.tgz} $${t}.bak ; \ | ${RM} -r $${t%.tar.bz2} $${t}.bak ; \ | ||||
done | done | ||||
@${REINPLACE_CMD} -e 's|$$(ARCH)|$$(ATLAS_ARCH)|g' \ | .for bt in ${BADTAR} | ||||
${MV} ${WRKSRC}/CONFIG/ARCHS/${bt}.tar.bz2.bad ${WRKSRC}/CONFIG/ARCHS/${bt}.tar.bz2 | |||||
.endfor | |||||
${REINPLACE_CMD} -e 's|$$(ARCH)|$$(ATLAS_ARCH)|g' \ | |||||
${WRKSRC}/Make.top \ | ${WRKSRC}/Make.top \ | ||||
${WRKSRC}/makes/Make.bin \ | ${WRKSRC}/makes/Make.bin \ | ||||
${WRKSRC}/makes/Make.lib \ | ${WRKSRC}/makes/Make.lib \ | ||||
Context not available. | |||||
${WRKSRC}/makes/Make.sysinfo \ | ${WRKSRC}/makes/Make.sysinfo \ | ||||
${WRKSRC}/CONFIG/src/Makefile \ | ${WRKSRC}/CONFIG/src/Makefile \ | ||||
${WRKSRC}/CONFIG/ARCHS/Makefile | ${WRKSRC}/CONFIG/ARCHS/Makefile | ||||
@${REINPLACE_CMD} -e "s|gcc|${CC}|" ${WRKSRC}/CONFIG/ARCHS/Makefile | ${REINPLACE_CMD} -e "s|gcc|${CC}|" ${WRKSRC}/CONFIG/ARCHS/Makefile | ||||
@${REINPLACE_CMD} -e "\|OS=ALL|{N; s|'gcc'|'${CC}'|; \ | ${REINPLACE_CMD} -e "\|OS=ALL|{N; s|'gcc'|'${CC}'|; \ | ||||
s|'gfortran'|'${FC}'|; s|-mavx|-msse3|;s|'| ${EXTRA_FLAGS}'|4;}" \ | s|'gfortran'|'${FC}'|; s|-mavx|-msse3|;s|'| ${EXTRA_FLAGS}'|4;}" \ | ||||
${WRKSRC}/CONFIG/src/atlcomp.txt | ${WRKSRC}/CONFIG/src/atlcomp.txt | ||||
@${REINPLACE_CMD} -e "s|%%PTHREAD_LIBS%%|${PTHREAD_LIBS}|" \ | ${REINPLACE_CMD} -e "s|%%PTHREAD_LIBS%%|${PTHREAD_LIBS}|" \ | ||||
-e "s|%%CC%%|${CC}|" \ | -e "s|%%CC%%|${CC}|" \ | ||||
${WRKSRC}/CONFIG/src/SpewMakeInc.c | ${WRKSRC}/CONFIG/src/SpewMakeInc.c | ||||
@${REINPLACE_CMD} -E -e \ | ${REINPLACE_CMD} -E -e \ | ||||
"\|(#define ATL_MaxMalloc[[:blank:]]+)([[:digit:]]+)|s||\1${ATLAS_MAXMALLOC}|" \ | "\|(#define ATL_MaxMalloc[[:blank:]]+)([[:digit:]]+)|s||\1${ATLAS_MAXMALLOC}|" \ | ||||
${WRKSRC}/include/atlas_lvl3.h | ${WRKSRC}/include/atlas_lvl3.h | ||||
@${CAT} ${FILESDIR}/tuning-message | .for mk in ${MK2FIX} | ||||
${REINPLACE_CMD} -e 's|make |${MAKE_CMD} |' ${WRKSRC}/${mk} | |||||
.endfor | |||||
.for mk in ${MKDIR2FIX} | |||||
${REINPLACE_CMD} -e 's|"make |"${MAKE_CMD} |' ${WRKSRC}/${mk} | |||||
.endfor | |||||
.for case in ${GCC2FIX} | |||||
${REINPLACE_CMD} -e "s|COMP='gcc'|COMP='${CC}'|" ${WRKSRC}/tune/blas/${case} | |||||
.endfor | |||||
.for fc in ${COMP2FIX} | |||||
${REINPLACE_CMD} -e 's|"gcc"|"${CC}"|;s|"gfortran"|"${FC}"|' \ | |||||
${WRKSRC}/CONFIG/src/${fc} | |||||
.endfor | |||||
${REINPLACE_CMD} -e "s|'gcc'|'${CC}'|;s|'gcc-4'|'${CC}'|;s|'gfortran'|'${FC}'|" \ | |||||
${WRKSRC}/CONFIG/src/atlcomp.txt | |||||
${REINPLACE_CMD} -e 's|%%CC%%|${CC}|' ${WRKSRC}/Make.top | |||||
.for fc in ${GOODGCC} | |||||
${REINPLACE_CMD} -e 's|goodgcc.txt|good${CC}.txt|' ${WRKSRC}/${fc} | |||||
.endfor | |||||
${CAT} ${FILESDIR}/tuning-message | |||||
do-configure: | do-configure: | ||||
@if [ ${PORT_OPTIONS:MWALL_TIMER} ] ; then \ | if [ ${PORT_OPTIONS:MWALL_TIMER} ] ; then \ | ||||
TIMEFLAG= ; \ | TIMEFLAG= ; \ | ||||
if [ \( ${ARCH} = "i386" -o ${ARCH} = "amd64" \) -a ${PORT_OPTIONS:MTSC} ] ; then \ | if [ \( ${ARCH} = "i386" -o ${ARCH} = "amd64" \) -a ${PORT_OPTIONS:MTSC} ] ; then \ | ||||
freq=`${SYSCTL} -ni machdep.tsc_freq` ; \ | freq=`${SYSCTL} -ni machdep.tsc_freq` ; \ | ||||
Context not available. | |||||
if [ "x$${TIMEFLAG}" = "x" ] ; then \ | if [ "x$${TIMEFLAG}" = "x" ] ; then \ | ||||
TIMEFLAG="-D c -DWALL" ; \ | TIMEFLAG="-D c -DWALL" ; \ | ||||
fi ; \ | fi ; \ | ||||
${ECHO_CMD} "TIMEFLAG = $${TIMEFLAG}" > ${WRKSRC}/saved_flags ; \ | |||||
fi ; \ | fi ; \ | ||||
${ECHO_CMD} "TIMEFLAG = $${TIMEFLAG}" \ | ${ECHO_MSG} "Dummy configuration of ATLAS to obtain compiler flags:" ; \ | ||||
> ${WRKSRC}/saved_flags ; \ | |||||
${ECHO_CMD} "Dummy configuration of ATLAS to obtain compiler flags:" ; \ | |||||
${MKDIR} ${WRKSRC}/static ; cd ${WRKSRC}/static ; \ | ${MKDIR} ${WRKSRC}/static ; cd ${WRKSRC}/static ; \ | ||||
../configure --cc="${CC}" --cflags="${CFLAGS}" \ | ${SETENV} ${CONFIGURE_ENV} ../configure --cc="${CC}" --cflags="${CCFLAGS}" \ | ||||
--prefix="${PREFIX}" -v 2 $${TIMEFLAG} ${ARCHDEFFLAG} \ | --prefix="${PREFIX}" -v 2 $${TIMEFLAG} ${ARCHDEFFLAG} \ | ||||
-Ss f77lib " " -Ss pmake "${MAKE} ${_MAKE_JOBS}" \ | -Ss f77lib " " -Ss pmake "${MAKE_CMD} ${_MAKE_JOBS}" \ | ||||
-C if ${FC} -F if '${FFFLAGS}' \ | |||||
-C acg ${CC} -F acg '${CCFLAGS}' \ | |||||
-Fa alg "${STATIC_FLAGS} " -b ${POINTER} | -Fa alg "${STATIC_FLAGS} " -b ${POINTER} | ||||
@${SED} -ne "\|F77FLAGS =|p" ${WRKSRC}/static/Make.inc \ | ${SED} -ne "\|F77FLAGS =|p" ${WRKSRC}/static/Make.inc \ | ||||
>> ${WRKSRC}/saved_flags | >> ${WRKSRC}/saved_flags | ||||
post-configure: | post-configure: | ||||
@${RM} -r ${WRKSRC}/static | ${RM} -r ${WRKSRC}/static | ||||
do-build: | do-build: | ||||
.for opt in shared static | .for opt in shared static | ||||
. if ${PORT_OPTIONS:M${opt:tu}} | . if ${PORT_OPTIONS:M${opt:tu}} | ||||
@${ECHO_CMD} "Building the LAPACK archives with ${opt} ATLAS flags:" | ${ECHO_MSG} "Configuring ${opt} ATLAS:" ; \ | ||||
F77FLAGS="`${MAKE} -f ${WRKSRC}/saved_flags -V F77FLAGS` ${EXTRA_FFLAGS}" ; \ | ${MKDIR} ${WRKSRC}/${opt} ; cd ${WRKSRC}/${opt} ; \ | ||||
LW=`${MAKE} -C ${PORTSDIR}/math/lapack -V ${${opt:tu}_LAPACK_WRKSRC}` ; \ | ${SETENV} ${CONFIGURE_ENV} ../configure --cc="${CC}" --cflags="${CCFLAGS}" \ | ||||
${MAKE} -C ${PORTSDIR}/math/lapack WITH=${opt:tu} clean patch ; \ | --with-netlib-lapack-tarfile="${DISTDIR}/lapack/lapack-${LAPACK_VER}.tgz" \ | ||||
cd $${LW} ; ${SETENV} ${MAKE_ENV:NFFLAGS=*} EXTRAFLAGS="${${opt:tu}_FLAGS}" \ | |||||
FFLAGS="-pipe $${F77FLAGS}" ${MAKE} ${_MAKE_JOBS} ${MAKE_ARGS} \ | |||||
ARCH="${AR}" lapacklib ; \ | |||||
TIMEFLAG=`${MAKE} -f ${WRKSRC}/saved_flags -V TIMEFLAG` ; \ | |||||
${MKDIR} ${WRKSRC}/${opt} ; cd ${WRKSRC}/${opt} ; \ | |||||
${MV} $${LW}/liblapack.a liblapack_${opt}.a ; \ | |||||
${MAKE} -C ${PORTSDIR}/math/lapack clean ; \ | |||||
${ECHO_CMD} "Configuring ${opt} ATLAS:" ; \ | |||||
../configure --cc="${CC}" --cflags="${CFLAGS}" \ | |||||
--with-netlib-lapack="${WRKSRC}/${opt}/liblapack_${opt}.a" \ | |||||
--prefix="${PREFIX}" -v 2 $${TIMEFLAG} ${ARCHDEFFLAG} \ | --prefix="${PREFIX}" -v 2 $${TIMEFLAG} ${ARCHDEFFLAG} \ | ||||
-Ss f77lib " " -Ss pmake "${MAKE} ${_MAKE_JOBS}" \ | -Ss f77lib " " -Ss pmake "${MAKE_CMD} ${_MAKE_JOBS}" \ | ||||
-C if ${FC} -F if '${FFFLAGS}' \ | |||||
-C acg ${CC} -F acg '${CCFLAGS}' \ | |||||
-Fa alg "${${opt:tu}_FLAGS} " -b ${POINTER} ; \ | -Fa alg "${${opt:tu}_FLAGS} " -b ${POINTER} ; \ | ||||
if [ "x${WITH_ARCHDEF}" != "x" ] ; then \ | if [ "x${WITH_ARCHDEF}" != "x" ] ; then \ | ||||
if [ "x${ARCHDEF}" != "xNONE" ] ; then \ | if [ "x${ARCHDEF}" != "xNONE" ] ; then \ | ||||
Context not available. | |||||
${WRKSRC}/${opt}/Make.inc ; \ | ${WRKSRC}/${opt}/Make.inc ; \ | ||||
fi ; \ | fi ; \ | ||||
fi ; \ | fi ; \ | ||||
${ECHO_CMD} "Building ${opt} ATLAS:" ; cd ${WRKSRC}/${opt} ; \ | ${ECHO_MSG} "Building ${opt} ATLAS:" ; cd ${WRKSRC}/${opt} ; \ | ||||
${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${MAKE_ARGS} all | ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${MAKE_ARGS} all | ||||
. endif | . endif | ||||
.endfor | .endfor | ||||
Context not available. | |||||
post-build: | post-build: | ||||
.for opt in shared static | .for opt in shared static | ||||
. if ${PORT_OPTIONS:M${opt:tu}} | . if ${PORT_OPTIONS:M${opt:tu}} | ||||
@${ECHO_CMD} "Timing ${opt} ATLAS:" | @${ECHO_MSG} "Timing ${opt} ATLAS:" | ||||
(cd ${WRKSRC}/${opt} ; ${SETENV} ${MAKE_ENV} \ | (cd ${WRKSRC}/${opt} ; ${SETENV} ${MAKE_ENV} \ | ||||
${MAKE_CMD} ${MAKE_ARGS} time ; \ | ${MAKE_CMD} ${MAKE_ARGS} time ; \ | ||||
cd ARCHS ; ${SETENV} ${MAKE_ENV} \ | cd ARCHS ; ${SETENV} ${MAKE_ENV} \ | ||||
Context not available. | |||||
. endif | . endif | ||||
.endfor | .endfor | ||||
.if ${PORT_OPTIONS:MSHARED} | .if ${PORT_OPTIONS:MSHARED} | ||||
@${ECHO_CMD} "Building ATLAS shared libraries:" | @${ECHO_MSG} "Building ATLAS shared libraries:" | ||||
@F77FLAGS="`${MAKE} -f ${WRKSRC}/saved_flags -V F77FLAGS` ${EXTRA_FFLAGS}" ; \ | @F77FLAGS="`${MAKE} -f ${WRKSRC}/saved_flags -V F77FLAGS` ${EXTRA_FFLAGS}" ; \ | ||||
cd ${WRKSRC}/shared/lib ; \ | cd ${WRKSRC}/shared/lib ; \ | ||||
${L1}libatlas.so.2 -o libatlas.so.2 libatlas.a ${L2} ; \ | ${L1}libatlas.so.2 -o libatlas.so.2 libatlas.a ${L2} ; \ | ||||
${L1}libtstatlas.so.2 -o libtstatlas.so.2 libtstatlas.a ${L2} libatlas.so.2 ; \ | |||||
${L1}libf77blas.so.2 -o libf77blas.so.2 libf77blas.a ${L2} libatlas.so.2 ; \ | ${L1}libf77blas.so.2 -o libf77blas.so.2 libf77blas.a ${L2} libatlas.so.2 ; \ | ||||
${L1}libf77refblas.so.2 -o libf77refblas.so.2 libf77refblas.a ${L2} libatlas.so.2 ; \ | |||||
${L1}libptf77blas.so.2 -o libptf77blas.so.2 libptf77blas.a ${L2} libatlas.so.2 ; \ | ${L1}libptf77blas.so.2 -o libptf77blas.so.2 libptf77blas.a ${L2} libatlas.so.2 ; \ | ||||
${L1}libcblas.so.2 -o libcblas.so.2 libcblas.a ${L2} libatlas.so.2 ; \ | ${L1}libcblas.so.2 -o libcblas.so.2 libcblas.a ${L2} libatlas.so.2 ; \ | ||||
${L1}libptcblas.so.2 -o libptcblas.so.2 libptcblas.a ${L2} libatlas.so.2 ; \ | ${L1}libptcblas.so.2 -o libptcblas.so.2 libptcblas.a ${L2} libatlas.so.2 ; \ | ||||
${L1}libptlapack.so.2 -o libptlapack.so.2 libptlapack.a ${L2} libatlas.so.2 ; \ | |||||
${L1}libalapack.so.2 -o libalapack.so.2 liblapack.a ${L2} libatlas.so.2 | ${L1}libalapack.so.2 -o libalapack.so.2 liblapack.a ${L2} libatlas.so.2 | ||||
.endif | .endif | ||||
Context not available. | |||||
check regression-test test: build | check regression-test test: build | ||||
. for opt in shared static | . for opt in shared static | ||||
. if ${PORT_OPTIONS:M${opt:tu}} | . if ${PORT_OPTIONS:M${opt:tu}} | ||||
@${ECHO_CMD} "Testing ${opt} ATLAS:" | @${ECHO_MSG} "Testing ${opt} ATLAS:" | ||||
@cd ${WRKSRC}/${opt} ; ${SETENV} ${MAKE_ENV} BLAS="${${opt:tu}_BLAS}" \ | ${REINPLACE_CMD} -e 's|${PTHREAD_LIBS} -lm|-llapack -lblas ${PTHREAD_LIBS} -lm|' \ | ||||
${WRKSRC}/${opt}/Make.inc | |||||
cd ${WRKSRC}/${opt} ; ${SETENV} ${MAKE_ENV} BLAS="${${opt:tu}_BLAS}" \ | |||||
${MAKE_CMD} ${MAKE_ARGS} check ptcheck error_report | ${MAKE_CMD} ${MAKE_ARGS} check ptcheck error_report | ||||
. endif | . endif | ||||
. endfor | . endfor | ||||
Context not available. | |||||
.endif | .endif | ||||
do-install: | do-install: | ||||
.for i in libatlas libcblas libf77blas liblapack libptcblas libptf77blas | .for i in libatlas libcblas libf77blas liblapack libptcblas libptf77blas \ | ||||
libtstatlas libf77refblas | |||||
. if ${PORT_OPTIONS:MSTATIC} | . if ${PORT_OPTIONS:MSTATIC} | ||||
${INSTALL_DATA} ${WRKSRC}/static/lib/${i}.a \ | ${INSTALL_DATA} ${WRKSRC}/static/lib/${i}.a \ | ||||
${STAGEDIR}${PREFIX}/lib/${i:S|lapack|alapack|}.a | ${STAGEDIR}${PREFIX}/lib/${i:S|lapack|alapack|}.a | ||||
Context not available. | |||||
(cd ${WRKSRC}/${opt}/ARCHS; \ | (cd ${WRKSRC}/${opt}/ARCHS; \ | ||||
${COPYTREE_SHARE} "*" ${STAGEDIR}${DATADIR}/${opt} \ | ${COPYTREE_SHARE} "*" ${STAGEDIR}${DATADIR}/${opt} \ | ||||
"! -name Makefile -and ! -name *.tgz") | "! -name Makefile -and ! -name *.tgz") | ||||
. for bin in xnegmm xnegmv xnegr1 | |||||
${CHMOD} 744 ${STAGEDIR}${DATADIR}/${opt}/${bin} | |||||
${STRIP_CMD} ${STAGEDIR}${DATADIR}/${opt}/${bin} | |||||
. endfor | |||||
. endif | . endif | ||||
. endif | . endif | ||||
.endfor | .endfor | ||||
Context not available. |