]> gitweb @ CieloNegro.org - pkgsrc-ghc.git/blobdiff - bootstrap.mk
7.6.2 for powerpc-apple-darwin
[pkgsrc-ghc.git] / bootstrap.mk
index 317ef13f527e79b40350231f5b8e6338050c0ae1..5f48c44a509a9a02ec3a1bfedca0cdc9c9ac7eb5 100644 (file)
 # $NetBSD$
-
-USE_TOOLS+=    autoconf date gtar perl
-
-# Build an unregisterised bootstrap compiler and install it directly
-# into the .buildlink directory. But we can't use "make install"
-# because we don't build it in a standard way (./configure && make).
+# -----------------------------------------------------------------------------
+# Select a bindist of bootstrapping compiler based on a per-platform
+# basis.
 #
-# To install it, we just copy ghc and ghc-pkg from
-# "work/bootstrap/ghc-${VERSION}/inplace/bin" to
-# "${BUILDLINK_DIR}/bin". Note that in-place ghc isn't usable until we
-# run "ghc-pkg recache".
-
-BOOTSTRAP_MAIN_C=      ${PKGDIR}/files/bootstrap-main.c
-BOOTSTRAP_CC_OPTS=     -I${PREFIX:Q}/include
-BOOTSTRAP_LD_OPTS=     -L${PREFIX:Q}/lib -Wl,-rpath -Wl,${PREFIX:Q}/lib
-BOOTSTRAP_LD_OPTS+=    -lm -liconv -lncurses
-BOOTSTRAP_CONF_ARGS=   --enable-hc-boot --with-ghc=""
-
+# BOOT_ARCHIVE
+#   This variable is set to the name of compressed archive file of a
+#   bootstrapping compiler for the current platform.
+#
+# BOOT_TARBALL
+#   Similar to BOOT_ARCHIVE, but "*.tar" not "*.tar.xz".
+#
+.include "../../mk/bsd.prefs.mk"
 .if ${MACHINE_ARCH} == "i386" && ${OPSYS} == "NetBSD"
-PLATFORM=              i386-unknown-netbsd
-BOOTSTRAP_CAPI_C=      ${PKGDIR}/files/capi-wrappers-netbsd-i386.c
-BOOTSTRAP_TARBALL=     ${DISTNAME}-boot-i386-unknown-netbsdelf6.99.1.tar.bz2
-# Unregisterised compilers get too large (.text section being over 64
-# MiB) without -Os, exceeding NetBSD/i386's kernel default limitation.
-BOOTSTRAP_CC_OPTS+=    -Os
-BOOTSTRAP_CONF_ARGS+=  CONF_CC_OPTS_STAGE2="-Os"
+BOOT_ARCHIVE=  ${DISTNAME}-boot-i386-unknown-netbsdelf6.99.1.tar.bz2
 
 .elif ${MACHINE_ARCH} == "i386" && ${OPSYS} == "FreeBSD"
-PLATFORM=              i386-unknown-freebsd
-BOOTSTRAP_CAPI_C=      ${PKGDIR}/files/capi-wrappers-freebsd-i386.c
-BOOTSTRAP_TARBALL=     ${DISTNAME}-boot-i386-unknown-freebsd8.0.tar.bz2
-BOOTSTRAP_CC_OPTS+=    -O2
-BOOTSTRAP_LD_OPTS+=    -lutil -lrt
-BOOTSTRAP_CONF_ARGS+=  CONF_CC_OPTS_STAGE2="-O2"
+BOOT_ARCHIVE=  ${DISTNAME}-boot-i386-unknown-freebsd8.0.tar.bz2
 
 .elif ${MACHINE_ARCH} == "powerpc" && ${OPSYS} == "Darwin"
-PLATFORM=              powerpc-apple-darwin
-BOOTSTRAP_CAPI_C=      ${PKGDIR}/files/capi-wrappers-darwin-powerpc.c
-BOOTSTRAP_TARBALL=     ${DISTNAME}-boot-powerpc-apple-darwin9.8.0.tar.bz2
-BOOTSTRAP_CC_OPTS+=    -O2
-BOOTSTRAP_CONF_ARGS+=  CONF_CC_OPTS_STAGE2="-O2"
+BOOT_ARCHIVE=  ${DISTNAME}-boot-powerpc-apple-darwin.tar.xz
 # Existence of libelf makes LeadingUnderscore being "NO", which is
-# incorrect for this platform. See ghc-6.12.1/aclocal.m4
+# incorrect for this platform. See ${WRKSRC}/aclocal.m4
 # (FP_LEADING_UNDERSCORE)
 CONFLICTS+=            libelf-[0-9]*
 
 .elif ${MACHINE_ARCH} == "x86_64" && ${OPSYS} == "Linux"
-PLATFORM=              x86_64-unknown-linux
-BOOTSTRAP_CAPI_C=      ${PKGDIR}/files/capi-wrappers-linux-x86_64.c
-BOOTSTRAP_TARBALL=     ${DISTNAME}-boot-x86_64-unknown-linux-gnu.tar.bz2
-BOOTSTRAP_CC_OPTS+=    -O2
-BOOTSTRAP_LD_OPTS+=    -lrt -ldl
-BOOTSTRAP_CONF_ARGS+=  CONF_CC_OPTS_STAGE2="-O2"
+BOOT_ARCHIVE=  ${DISTNAME}-boot-x86_64-unknown-linux-gnu.tar.bz2
 
 .else
 PKG_FAIL_REASON+=      "internal error: unsupported platform"
 .endif
 
-pre-configure: ${WRKDIR}/stamp-bootstrap-ghc
-
-${WRKDIR}/stamp-autoreconf:
-       ${RUN} cd ${WRKSRC} && \
-               ${PHASE_MSG} "Regenerating configuration scripts for ${PKGNAME}" && \
-               ${PERL5} boot && \
-               ${TOUCH} ${.TARGET}
-
-${WRKDIR}/stamp-prepare-bootstrap: ${WRKDIR}/stamp-autoreconf
-       ${RUN} cd ${WRKDIR} && \
-               ${PHASE_MSG} "Preparing bootstrapping compiler for ${PKGNAME}" && \
-               ${RM} -rf bootstrap && \
-               ${MKDIR} bootstrap && \
-               ${GTAR} -cf - ${DISTNAME} | ${GTAR} -C bootstrap -xf - && \
-               ${CP} -f ${BOOTSTRAP_MAIN_C:Q} bootstrap/${DISTNAME}/rts/bootstrap-main.c && \
-               ${CP} -f ${BOOTSTRAP_CAPI_C:Q} bootstrap/${DISTNAME}/rts/capi-wrappers.c  && \
-               ${TOUCH} ${.TARGET}
-
-${WRKDIR}/stamp-configure-hc-boot: ${WRKDIR}/stamp-prepare-bootstrap
-       ${RUN} cd ${WRKDIR}/bootstrap/${DISTNAME} && \
-               ${PHASE_MSG} "Configuring bootstrapping compiler for ${PKGNAME}" && \
-               ${SETENV} ${CONFIGURE_ENV} ./configure ${BOOTSTRAP_CONF_ARGS} ${CONFIGURE_ARGS} && \
-               ${TOUCH} ${.TARGET}
-
-${WRKDIR}/stamp-extract-hc: ${WRKDIR}/stamp-configure-hc-boot
-       ${RUN} cd ${WRKDIR}/bootstrap && \
-               ${PHASE_MSG} "Extracting bootstrap HC archive for ${PKGNAME}" && \
-               if ${TEST} "`${DATE} '+%Y%m%d%H%M'`" -le 200001010000; then \
-                       ${FAIL_MSG} "Adjust your system clock: `${DATE}`"; \
-               fi && \
-               ${FIND} ${DISTNAME} -type d -o -type f | ${XARGS} ${TOUCH} -t 200001010000 && \
-               ${GTAR} -jxf ${DISTDIR}/${BOOTSTRAP_TARBALL} && \
-               (cd ${DISTNAME} && ${SH} mkfiles) && \
-               ${TOUCH} ${.TARGET}
-
-${WRKDIR}/stamp-rewrite-hc-paths: ${WRKDIR}/stamp-extract-hc
-       ${RUN} cd ${WRKDIR}/bootstrap/${DISTNAME} && \
-               ${PHASE_MSG} "Rewriting source paths in bootstrapping compiler for ${PKGNAME}" && \
-               ${CP} -f ${PKGDIR:Q}/files/build.bootstrap.common.mk mk/build.mk && \
-               ${ECHO} "SRC_CC_OPTS += ${BOOTSTRAP_CC_OPTS}" >> mk/build.mk && \
-               ${ECHO} "LD_OPTS += ${BOOTSTRAP_LD_OPTS}" >> mk/build.mk && \
-               for c in libraries/*/configure; do \
-                       (cd `${DIRNAME} $$c` && ${SETENV} ${CONFIGURE_ENV} ${SH} configure ${CONFIGURE_ARGS}); \
-               done && \
-               for i in inplace/lib/package.conf.d/*.conf \
-                                */package.conf.inplace \
-                                */*/package-data.mk \
-                                */*/*/package-data.mk \
-                                */*/*/*/package-data.mk; do \
-                       ${SED} -e "s#\\[\\[PREFIX\\]\\]#${PREFIX}#g" \
-                                  -e "s#\\[\\[GHC_SOURCE_PATH\\]\\]#`${PWD_CMD}`#g" $$i > $$i.tmp; \
-                       ${MV} -f $$i.tmp $$i; \
-               done && \
-               ${TOUCH} -r inplace/lib/package.conf.d \
-                                       inplace/lib/package.conf.d/*.conf \
-                                       */package.conf.inplace \
-                                       */*/package-data.mk \
-                                       */*/*/package-data.mk \
-                                       */*/*/*/package-data.mk \
-                                       compiler/stage?/build/Config.hs && \
-               ${TOUCH} ${.TARGET}
-
-${WRKDIR}/stamp-bootstrap-ghc: ${WRKDIR}/stamp-rewrite-hc-paths
-       ${RUN} cd ${WRKDIR}/bootstrap/${DISTNAME} && \
-               ${PHASE_MSG} "Creating bootstrapping files for ${PKGNAME}" && \
-               ${BUILD_MAKE_CMD} bootstrapping-files && \
-               ${PHASE_MSG} "Building bootstrapping compiler for ${PKGNAME}" && \
-               ${BUILD_MAKE_CMD} all_ghc_stage2 && \
-               ${PHASE_MSG} "Building bootstrapping toolkit for ${PKGNAME}" && \
-               ${BUILD_MAKE_CMD} inplace/bin/ghc-pkg && \
-               ${BUILD_MAKE_CMD} inplace/lib/unlit && \
-               inplace/bin/ghc-pkg recache && \
-               ${CP} -f inplace/bin/ghc-stage2 ${BUILDLINK_DIR}/bin/ghc && \
-               ${CP} -f inplace/bin/ghc-pkg ${BUILDLINK_DIR}/bin/ghc-pkg && \
-               ${TOUCH} ${.TARGET}
+BOOT_TARBALL=  ${BOOT_ARCHIVE:C/\.xz$//}
+
+
+# -----------------------------------------------------------------------------
+# The "pre-configure" hook
+#
+# Install a bootstrapping compiler directly into TOOLS_DIR so that
+# ./configure can find it.
+#
+USE_TOOLS+=    gmake xzcat
+
+pre-configure:
+       @${PHASE_MSG} "Extracting bootstrapping compiler for ${PKGNAME}"
+       ${RUN} ${MKDIR} ${WRKDIR:Q}/build-extract
+       ${RUN} cd ${WRKDIR:Q}/build-extract && \
+               ${EXTRACT_CMD_DEFAULT} ${DISTDIR:Q}/${DIST_SUBDIR:Q}/${BOOT_ARCHIVE}
+
+       @${PHASE_MSG} "Preparing bootstrapping compiler for ${PKGNAME}"
+       ${RUN} cd ${WRKDIR:Q}/build-extract/${DISTNAME}-boot && \
+               ${SH} ./configure \
+                       --prefix=${TOOLS_DIR:Q} \
+                       --with-gcc=${CCPATH:Q} && \
+               ${MAKE_PROGRAM} install
+
+
+# -----------------------------------------------------------------------------
+# An unusual target "bootstrap"
+#
+# Build a bootstrapping compiler using an already installed GHC. This
+# can certainly impossible if you don't have one. It's absolutely
+# important to build it with the fewest possible run-time
+# dependencies, otherwise the resulting binary can easily get
+# unusable.
+#
+.PHONY: bootstrap
+
+.if exists(${WRKDIR}/${DISTNAME}/mk/config.mk)
+bootstrap:
+       @${ERROR_MSG} "You have already configured the package in a way\
+       that building bootstrapping compiler is impossible."
+       @${FAIL_MSG}  "Run \"${MAKE} clean\" first."
+.else
+bootstrap: patch ${WRKDIR}/${BOOT_ARCHIVE}
+       @${PHASE_MSG} "Done creating" ${WRKDIR}/${BOOT_ARCHIVE}
+
+${WRKDIR}/lndir:
+       @${PHASE_MSG} "Building lndir(1) to duplicate the source tree."
+       cd ${WRKSRC:Q}/utils/lndir && \
+               ${CCPATH:Q} lndir.c -o ${.TARGET}
+
+${WRKDIR}/stamp-lndir-boot: ${WRKDIR}/lndir
+       @${PHASE_MSG} "Duplicating the source tree for bootstrapping ${DISTNAME}"
+       ${MKDIR} ${WRKDIR:Q}/build-boot
+       cd ${WRKDIR:Q}/build-boot && \
+               ${WRKDIR}/lndir -silent ../${DISTNAME:Q}
+       ${TOUCH} ${.TARGET}
+
+${WRKDIR}/stamp-configure-boot: ${WRKDIR}/stamp-lndir-boot
+       @${PHASE_MSG} "Configuring bootstrapping compiler ${DISTNAME}"
+       ${MKDIR} ${WRKDIR:Q}/build-boot
+       cd ${WRKDIR:Q}/build-boot && \
+               ${SH} ./configure --with-gcc=${CCPATH:Q} && \
+               ${LN} -f ${FILESDIR:Q}/bootstrap.build.mk mk/build.mk
+       ${TOUCH} ${.TARGET}
+
+${WRKDIR}/stamp-build-boot: ${WRKDIR}/stamp-configure-boot
+       @${PHASE_MSG} "Building bootstrapping compiler ${DISTNAME}"
+       ${RUN} cd ${WRKDIR:Q}/build-boot && ${BUILD_MAKE_CMD}
+       ${TOUCH} ${.TARGET}
+
+${WRKDIR}/${BOOT_TARBALL}: ${WRKDIR}/stamp-build-boot
+       @${PHASE_MSG} "Creating binary distribution of bootstrapping ${DISTNAME}"
+       ${RUN} cd ${WRKDIR:Q}/build-boot && ${BUILD_MAKE_CMD} binary-dist
+       ${MV} -f ${WRKDIR:Q}/build-boot/${BOOT_TARBALL} ${.TARGET}
+
+# This can take up half an hour. Memory usage is also very high, about 680 MiB.
+${WRKDIR}/${BOOT_ARCHIVE}: ${WRKDIR}/${BOOT_TARBALL}
+       @${PHASE_MSG} "Compressing binary distribution of bootstrapping ${DISTNAME}"
+       ${PREFIX:Q}/bin/xz --verbose -9 --extreme ${WRKDIR:Q}/${BOOT_TARBALL}
+.endif