# New ports collection makefile for: sml/nj
# Date created:        7 July 1998
# Whom:                jkoshy
#
# $FreeBSD: ports/lang/sml-nj-devel/Makefile,v 1.21 2003/02/21 12:35:07 knu Exp $
#

PORTNAME=	smlnj
PORTVERSION=	110.42
CATEGORIES=	lang
MASTER_SITES=	ftp://ftp.research.bell-labs.com/dist/smlnj/working/${PORTVERSION}/ \
		ftp://flint.cs.yale.edu/pub/smlnj/working/${PORTVERSION}/ \
		ftp://gd.tuwien.ac.at/languages/smlnj/working/${PORTVERSION}/
DISTFILES=	config.tgz runtime.tgz
.if (${MACHINE_ARCH} == "i386")
DISTFILES+=	boot.x86-unix.tgz
.elif (${MACHINE_ARCH} == "alpha")
DISTFILES+=	boot.alpha32-unix.tgz
.endif
DISTFILES+=	ml-yacc.tgz ml-lex.tgz smlnj-lib.tgz cml.tgz
.if defined(WITH_EVERYTHING) || defined(WITH_RECOMPILE) || defined(WITH_FLINT)
DISTFILES+=	ml-burg.tgz \
		ckit.tgz ml-nlffi-lib.tgz ml-nlffigen.tgz \
		eXene.tgz \
		MLRISC.tgz cm.tgz compiler.tgz system.tgz
.endif
EXTRACT_ONLY=	config.tgz

MAINTAINER=	joemann@beefree.free.de
COMMENT=	A popular functional language from Bell Labs

DIST_SUBDIR=	sml-nj/${PORTVERSION}
NO_WRKSUBDIR=	yes
USE_GMAKE=	yes

NO_LATEST_LINK=	yes

.if (${MACHINE_ARCH} == "i386")
MLARCH=		x86
.elif (${MACHINE_ARCH} == "alpha")
MLARCH=		alpha32
.else
BROKEN=		not ported to ${MACHINE_ARCH}
.endif

.if defined(WITH_FLINT)
WITH_RECOMPILE?=	${WITH_FLINT}
.endif
.if defined(WITH_RECOMPILE)
WITH_EVERYTHING?=	${WITH_RECOMPILE}
.endif

MLROOTRELATIVE=	smlnj
MLROOT=	${PREFIX}/${MLROOTRELATIVE}
MLBIN=		${MLROOT}/bin
MLLIB=		${MLROOT}/lib
MLSRCSBASE=	ckit src
MLSRCSRELATIVE=	${MLROOTRELATIVE}/ckit ${MLROOTRELATIVE}/src
MLSRCS=	${MLROOT}/ckit ${MLROOT}/src
MLEXE=		sml ml-yacc ml-lex ml-build ml-makedepend
.if defined(WITH_EVERYTHING)
MLTARGETS=	ml-burg eXene src-smlnj \
		ml-nlffi-lib ml-nlffigen nowhere pgraph-util
MLEXE+=		ml-burg ml-nlffigen nowhere
PLIST=		${WRKDIR}/.PLIST
MLSRCPLIST=	${WRKDIR}/.PLIST.src
MLPLISTFILES=	${.CURDIR}/pkg-plist ${FILESDIR}/plist-everything ${MLSRCPLIST}
.endif

pre-fetch:
	@${ECHO}
.if !defined(WITH_EVERYTHING)
	@${ECHO} 'Use make WITH_EVERYTHING=yes to also build ml-burg,'
	@${ECHO} ' CML (Concurrent ML), eXene (X Windows toolkit),'
	@${ECHO} ' ml-nlffi (foreign function interface to C code),'
	@${ECHO} ' nowhere (preprocessor for conditional patterns),'
	@${ECHO} ' and all the sources.'
.endif
.if !defined(WITH_RECOMPILE)
	@${ECHO} 'Use make WITH_RECOMPILE=yes to recompile the compiler.'
	@${ECHO} ' This implies WITH_EVERYTHING.'
.endif
.if !defined(WITH_FLINT)
	@${ECHO} 'Use make WITH_FLINT=yes to apply a p''atch w''hich makes'
	@${ECHO} ' the compiler'"'"'s FLINT structures visible (see'
	@${ECHO} ' http://flint.cs.yale.edu/flint/publications/tcif.html),'
	@${ECHO} ' use it with CM.autoload "$$smlnj/viscomp/core.cm";'
	@${ECHO} ' or see http://offshore.free.de/~5/FLINTerpreter/sml2flint/'
	@${ECHO} ' for code that should help you to get started.'
	@${ECHO} ' This implies WITH_RECOMPILE.'
.endif
	@${ECHO}

# make symlinks to the dist files

post-extract:
	cd ${WRKDIR} && ${LN} -sf ${_DISTDIR}/*  .

# Configuring is done by uncommenting the appropriate #request xxx
# lines of config/targets. Dependency details are handled by
# config/install.sh using config/dependencies.

.if defined(WITH_EVERYTHING)
do-configure:
	${ECHO_CMD} -n > ${WRKDIR}/.tmp.sed
.for t in ${MLTARGETS}
	${ECHO_CMD} '/^#request[ 	]+${t}$$/s/^#//' >> ${WRKDIR}/.tmp.sed
.endfor
	${SED} -E -f ${WRKDIR}/.tmp.sed "${WRKDIR}/config/targets" \
	> "${WRKDIR}/config/targets.customized"
.endif

# The build target builds and installs the system within the WRKDIR.
# The src/runtime is not cleaned afterwards to avoid recompilation during
# a subsequent make install.
# See src/system/README for information on recompiling the compiler.

.if defined(WITH_FLINT)
MLFLINTPATCH=	optional-patch-flint-access
.endif

do-build:
.if defined(WITH_RECOMPILE)
	${MV} "${WRKDIR}/config/targets.customized" "${WRKDIR}/config/targets.customized.later"
	${SED} -E -e '/^#request[        ]+src-smlnj$$/s/^#//' \
	"${WRKDIR}/config/targets" > "${WRKDIR}/config/targets.customized"
.endif
	cd ${WRKDIR} && unset PWD && \
	FILESDIR="$(FILESDIR)" PATCH="$(PATCH)" PATCH_ARGS="$(PATCH_ARGS)" \
	MLNORUNTIMECLEAN=yes	./config/install.sh
.if defined(WITH_FLINT)
	${TEST} -f "${WRKDIR}/.patch.${MLFLINTPATCH}" || \
	( cd ${WRKDIR} && \
	${PATCH} < "${FILESDIR}/${MLFLINTPATCH}" && \
	${TOUCH} "${WRKDIR}/.patch.${MLFLINTPATCH}" )
.endif
.if defined(WITH_RECOMPILE)
	cd ${WRKDIR}/src/system && ( \
	${ECHO_CMD} 'CM.autoload "$$smlnj/cmb.cm";' ; \
	${ECHO_CMD} 'CMB.make ();' ) | \
	../../bin/sml && \
	./makeml && \
	${RM} -rf ../../lib && ${MKDIR} ../../lib && \
	${FIND} ../../bin/.heap -name '*.${MLARCH}-bsd' \
	\! -name 'sml.${MLARCH}-bsd' -delete && \
	./installml && \
	${MV} "${WRKDIR}/config/targets.customized.later" \
	"${WRKDIR}/config/targets.customized"
	cd ${WRKDIR} && unset PWD && \
	FILESDIR="$(FILESDIR)" PATCH="$(PATCH)" PATCH_ARGS="$(PATCH_ARGS)" \
	MLNORUNTIMECLEAN=yes	./config/install.sh
.endif

# The install target installs the heaps and libraries to their final
# location in ${MLBIN} and ${MLLIB}.
# In case of recompilation, installml installs the sml heap and the
# libraries built during compiler bootstrap to ${MLBIN} and ${MLLIB}.

.if defined(WITH_EVERYTHING)
MLNOINSTALL=	CM
.if defined(WITH_RECOMPILE)
MLNOINSTALL+=	sml.boot.${MLARCH}-unix sml.bin.${MLARCH}-unix
.endif
MLSRCEXCLUDES=
.for excl in ${MLNOINSTALL}
MLSRCEXCLUDES+=	--exclude "${excl}"
.endfor
.endif

PLIST_SUB=	MLARCH=${MLARCH}

do-install:
	${MKDIR} "${MLROOT}"
.if defined(WITH_RECOMPILE)
	${MV} "${WRKDIR}/config/targets.customized" "${WRKDIR}/config/targets.customized.later"
	${ECHO_CMD} -n > "${WRKDIR}/config/targets.customized"
.endif
	cd ${WRKDIR} && unset PWD && \
	FILESDIR="$(FILESDIR)" PATCH="$(PATCH)" PATCH_ARGS="$(PATCH_ARGS)" \
	INSTALLDIR="$(MLROOT)"	./config/install.sh
	MLARCHOPSYS=`$(MLBIN)/.arch-n-opsys` && \
	( eval $${MLARCHOPSYS} ; \
	$(STRIP_CMD) "$(MLBIN)/.run/run.$${ARCH}-$${OPSYS}" )
.if defined(WITH_RECOMPILE)
	cd ${WRKDIR}/src/system && \
	INSTALLROOT="${MLROOT}" ./makeml && \
	${RM} -rf "${MLLIB}" && ${MKDIR} "${MLLIB}" && \
	${FIND}  "${MLBIN}"/.heap -name '*.${MLARCH}-bsd' \
	\! -name 'sml.${MLARCH}-bsd' -delete && \
	INSTALLROOT="${MLROOT}" ./installml
	${MV} "${WRKDIR}/config/targets.customized.later" \
	"${WRKDIR}/config/targets.customized"
	cd ${WRKDIR} && unset PWD && \
	FILESDIR="$(FILESDIR)" PATCH="$(PATCH)" PATCH_ARGS="$(PATCH_ARGS)" \
	INSTALLDIR="$(MLROOT)"	./config/install.sh
.endif
	@${CHOWN} -R ${BINOWN}:${BINGRP} "${MLBIN}" "${MLLIB}"
.if defined(WITH_EVERYTHING)
	cd ${WRKDIR}/src/runtime/objs && ${GMAKE} clean
	@${ECHO} -n 'Installing sources into ${MLROOT} ...'
	@cd ${WRKDIR} && ${TAR} -cf - ${MLSRCEXCLUDES} ${MLSRCSBASE} | \
	${TAR} -xf - -C "${MLROOT}"
	@${CHOWN} -R ${SHAREOWN}:${SHAREGRP} ${MLSRCS}
	@${ECHO} ' done.'
	cd "${PREFIX}" && ( ${FIND} -s -d ${MLSRCSRELATIVE} \! -type d ; \
	( ${FIND} -s -d ${MLSRCSRELATIVE} -type d | \
	${AWK} '{ printf "@dirrm "; print }' ) ) > ${MLSRCPLIST}
	${GREP} -h ^[^@] ${MLPLISTFILES} | sort -u > ${PLIST}
	${GREP} -h ^@dirrm ${MLPLISTFILES} | sort -r -u >> ${PLIST}
.endif

post-install:
	${MKDIR} $(PREFIX)/bin
.for f in $(MLEXE)
	${LN} -s $(MLBIN)/$f $(PREFIX)/bin/$f
.endfor

.include <bsd.port.mk>
