Update lang/ghc to version 8.8.3_1
[dports.git] / lang / ghc / Makefile
1 # Created by: Simon Marlow <simonmar@microsoft.com>
2 # $FreeBSD$
3
4 PORTNAME=       ghc
5 PORTVERSION=    ${GHC_VERSION}
6 PORTREVISION=   1
7 CATEGORIES=     lang haskell
8 MASTER_SITES=   https://www.haskell.org/ghc/dist/${PORTVERSION}/:source \
9                 http://leaf.dragonflybsd.org/~marino/dports-src/:dflyboot \
10                 LOCAL/arrowd/:boot \
11                 https://hackage.haskell.org/package/hscolour-${HSCOLOUR_VERSION}/:docs
12 DISTFILES=      ghc-${PORTVERSION}-src${EXTRACT_SUFX}:source \
13                 hscolour-${HSCOLOUR_VERSION}.tar.gz:docs
14 EXTRACT_ONLY=   ${_DISTFILES:C/hscolour.*$//g}
15
16 MAINTAINER=     haskell@FreeBSD.org
17 COMMENT=        Compiler for the functional language Haskell
18
19 LICENSE=        BSD3CLAUSE
20 LICENSE_FILE=   ${WRKSRC}/LICENSE
21
22 # other supported arches are added based on GHC_VERSION below
23 ONLY_FOR_ARCHS= amd64 i386
24
25 USES=                   autoreconf compiler:c11 gmake iconv:translit \
26                         localbase:ldflags ncurses perl5 tar:xz
27 USE_LOCALE=             en_US.UTF-8
28 USE_PERL5=              build
29 GNU_CONFIGURE=          yes
30 CONFIGURE_ARGS=         --with-iconv-includes=${LOCALBASE}/include \
31                         --with-iconv-libraries=${LOCALBASE}/lib
32 CONFIGURE_ENV=          CC=${CC} LD=${LD} PATH=${SLAVES_PREFIX}/bin:${PATH}
33 MAKE_ENV=               PATH=${SLAVES_PREFIX}/bin:${PATH}
34
35 SUB_FILES=              build.mk
36 SUB_LIST=               GHC_VERSION=${GHC_VERSION} \
37                         NCURSESINC="${NCURSESBASE}/include" NCURSESLIB="${NCURSESLIB}" \
38                         CFLAGS="${CFLAGS}"
39
40 OPTIONS_GROUP=          BOOTSTRAP
41 BOOTSTRAP_DESC=         Bootsrap using installed ghc
42 OPTIONS_GROUP_BOOTSTRAP=BOOT
43 OPTIONS_DEFINE=         DYNAMIC GMP PROFILE DOCS
44 OPTIONS_SUB=            yes
45
46 OPTIONS_DEFAULT=        DYNAMIC PROFILE GMP
47
48 BOOT_DESC=              Use installed GHC for bootstrapping
49 DOCS_DESC=              Install HTML documentation
50 DYNAMIC_DESC=           Add support for dynamic linking
51 GMP_DESC=               Use GNU Multi-precision Library for big integers support
52 PROFILE_DESC=           Add support for performance profiling
53
54 DOCS_BUILD_DEPENDS=     sphinx-build:textproc/py-sphinx
55
56 DYNAMIC_CONFIGURE_WITH= system-libffi \
57                         ffi-includes=${LOCALBASE}/include \
58                         ffi-libraries=${LOCALBASE}/lib
59 # The version number is needed as lang/gcc installs a different version
60 DYNAMIC_LIB_DEPENDS=    libffi.so.6:devel/libffi
61 DYNAMIC_SUB_LIST=       WITH_DYNAMIC="YES"
62 DYNAMIC_SUB_LIST_OFF=   WITH_DYNAMIC="NO"
63
64 GMP_CONFIGURE_WITH=     gmp-includes=${LOCALBASE}/include \
65                         gmp-libraries=${LOCALBASE}/lib
66 GMP_LIB_DEPENDS=        libgmp.so:math/gmp
67 GMP_SUB_LIST=           INTEGER_LIBRARY="integer-gmp"
68 GMP_SUB_LIST_OFF=       INTEGER_LIBRARY="integer-simple"
69
70 # Append substitutions for build.mk
71 BOOT_SUB_LIST=          HSC2HS=${LOCALBASE}/bin/hsc2hs
72 BOOT_SUB_LIST_OFF=      HSC2HS=${BOOT_HSC2HS}
73
74 PROFILE_SUB_LIST=       WITH_PROFILE="YES"
75 PROFILE_SUB_LIST_OFF=   WITH_PROFILE="NO"
76
77 GHC_VERSION?=           ${GHC_VERSION_DEFAULT}
78 GHC_VERSION_DEFAULT=    8.8.3
79 GHC_VERSION_MAJOR=      ${GHC_VERSION:S/./ /g:[1]}
80 GHC_VERSION_MINOR=      ${GHC_VERSION:S/./ /g:[2]}
81
82 HSCOLOUR_VERSION=       1.24.4
83
84 .if ${GHC_VERSION_MAJOR} >= 8 && ${GHC_VERSION_MINOR} >= 6
85 ONLY_FOR_ARCHS+=        aarch64 armv6 armv7 powerpc64
86 .endif
87
88 .include <bsd.port.pre.mk>
89
90 # This version of ncurses is needed by bootstrap compiler
91 .if ${OPSYS} == FreeBSD
92 .if ${OSVERSION} > 1300078 && empty(PORT_OPTIONS:MBOOT) && ${ARCH} != powerpc64
93 BUILD_DEPENDS+= ${LOCALBASE}/lib/compat/libncursesw.so.8:misc/compat12x
94 .endif
95 .endif
96
97 .if ${GHC_VERSION_MAJOR} == 8 && ${GHC_VERSION_MINOR} == 4
98 LLVM_VERSION=           50
99 # Turn off for old GHCs, see PR 228727
100 CONFIGURE_ARGS+=        --enable-dtrace=0
101 .elif ${GHC_VERSION_MAJOR} == 8 && ${GHC_VERSION_MINOR} == 6
102 LLVM_VERSION=           60
103 .elif ${GHC_VERSION_MAJOR} == 8 && ${GHC_VERSION_MINOR} == 8
104 LLVM_VERSION=           70
105 .else # ghc 8.10
106 LLVM_VERSION=           90
107 .endif
108
109 .if ${ARCH} == powerpc64
110 CONFIGURE_ARGS+=        --enable-dtrace=0
111 .endif
112
113 .if defined(PPC_ABI) && ${PPC_ABI} == ELFv1
114 BOOT_GHC_VERSION=      8.6.3
115 .else
116 BOOT_GHC_VERSION=       8.6.5
117 .endif
118 # LLVM version that bootstrap compiler uses
119 BOOT_LLVM_VERSION=      60
120
121 .if "${GHC_VERSION}" != "${GHC_VERSION_DEFAULT}"
122 PATCHDIR=       ${.CURDIR}/files${GHC_VERSION:S/.//g}/
123 .endif
124
125 NO_CCACHE=      ccache: error: Failed to create directory /nonexistent/.ccache/tmp: Permission denied
126
127 DOCSDIR=                ${PREFIX}/share/doc/${DISTNAME}
128 DATADIR=                ${PREFIX}/share/ghc-${GHC_VERSION}
129 EXAMPLESDIR=            ${PREFIX}/share/examples/ghc-${GHC_VERSION}
130 GHC_ARCH=               ${ARCH:S/amd64/x86_64/:C/armv.*/arm/}
131 GHC_LIBDIR=             ${STAGEDIR}${PREFIX}/lib/ghc-${GHC_VERSION}
132 GHC_LIBDIR_REL=         lib/ghc-${GHC_VERSION}
133
134 _EXECUTABLES=   ${GHC_LIBDIR}/bin/unlit \
135                 ${GHC_LIBDIR}/bin/hpc \
136                 ${GHC_LIBDIR}/bin/ghc-iserv \
137                 ${GHC_LIBDIR}/bin/ghc-pkg \
138                 ${GHC_LIBDIR}/bin/hsc2hs \
139                 ${GHC_LIBDIR}/bin/runghc \
140                 ${GHC_LIBDIR}/bin/ghc \
141                 ${GHC_LIBDIR}/bin/haddock \
142                 ${GHC_LIBDIR}/bin/hp2ps
143
144 .if ${PORT_OPTIONS:MPROFILE}
145 _EXECUTABLES+=  ${GHC_LIBDIR}/bin/ghc-iserv-prof
146 .endif
147 .if ${PORT_OPTIONS:MDYNAMIC}
148 _EXECUTABLES+=  ${GHC_LIBDIR}/bin/ghc-iserv-dyn
149 .endif
150
151 .include <bsd.port.options.mk>
152
153 .if empty(PORT_OPTIONS:MBOOT) && ${OPSYS} == "FreeBSD"
154 BOOTSTRAPS_SUFFIX?=             ${BOOTSTRAPS_SUFFIX_${ARCH}}
155 BOOTSTRAPS_SUFFIX_powerpc64?=   -${PPC_ABI:tl}
156 .  if ${OSVERSION} < 1200000 && (${ARCH} == x86_64 || ${ARCH} == i386)
157 ELEVEN_SUFX=            11
158 .  endif
159 DISTFILES+=             ghc-${BOOT_GHC_VERSION}-boot-${ARCH}-freebsd${BOOTSTRAPS_SUFFIX}${ELEVEN_SUFX}${EXTRACT_SUFX}:boot
160 .endif # MBOOT
161
162 .if ${ARCH} == aarch64 || ${ARCH} == armv6 || ${ARCH} == armv7
163 # CONFIGURE_TARGET must to be the same as the llvm triple
164 CONFIGURE_TARGET=       ${ARCH}-unknown-freebsd${"${ARCH:Maarch64}" != "":?:-gnueabihf}
165 EXTRA_PATCHES+=         ${PATCHDIR}/extra-patch-aclocal.m4
166 BUILD_DEPENDS+=         llc${LLVM_VERSION}:devel/llvm${LLVM_VERSION}
167 RUN_DEPENDS+=           llc${LLVM_VERSION}:devel/llvm${LLVM_VERSION}
168
169 # When GHC being compiled and GHC used for bootstrapping support different
170 # LLVM versions, we have to pull in both. Luckily, this is relatively rare.
171 .  if ${BOOT_LLVM_VERSION} != ${LLVM_VERSION}
172 BUILD_DEPENDS+=         llc${BOOT_LLVM_VERSION}:devel/llvm${BOOT_LLVM_VERSION}
173 RUN_DEPENDS+=           llc${BOOT_LLVM_VERSION}:devel/llvm${BOOT_LLVM_VERSION}
174 .  endif
175 .endif
176
177 .if ${ARCH} == aarch64 || ${ARCH} == armv6 || ${ARCH} == armv7 || ${ARCH} == powerpc64
178 .  if ${OSVERSION} < 1201000
179 IGNORE= lang/ghc requires at least FreeBSD 12.1-RELEASE
180 .  endif
181 .  ifdef QEMU_EMULATING
182 IGNORE= qemu-user-static isn't able to build lang/ghc, but it builds fine on a real hardware
183 .  endif
184 .endif
185
186 PLIST_SUB+=     GHC_VERSION=${GHC_VERSION} GHC_LIBDIR=${GHC_LIBDIR_REL}
187
188 .if ${GHC_VERSION_MAJOR} <= 8 && ${GHC_VERSION_MINOR} < 8
189 WITH_GHC=       --with-ghc
190 .else
191 WITH_GHC=       GHC
192 .endif
193
194 .if empty(PORT_OPTIONS:MBOOT)
195 BOOT_DIR=       ${WRKDIR}/ghc-${BOOT_GHC_VERSION}-boot
196 BOOT_GHC=       ${BOOT_DIR}/bin/ghc-${BOOT_GHC_VERSION}
197 BOOT_GHC-PKG=   ${BOOT_DIR}/bin/ghc-pkg-${BOOT_GHC_VERSION}
198 BOOT_HSC2HS=    ${BOOT_DIR}/bin/hsc2hs
199
200 SLAVE_ENV=      ${SETENV} PATH=${BOOT_DIR}/bin:${PATH}
201
202 CONFIGURE_ARGS+=        ${WITH_GHC}=${BOOT_GHC}
203 .else # MBOOT
204 SLAVE_ENV=              # empty
205 CONFIGURE_ARGS+=        ${WITH_GHC}=${LOCALBASE}/bin/ghc
206 .endif # MBOOT
207
208 .if empty(PORT_OPTIONS:MBOOT) && ${OPSYS} == "DragonFly"
209 BOOT_GHC_VERSION=       8.4.4
210 DISTFILES+=             ghc-${BOOT_GHC_VERSION}-boot-${ARCH}-dragonfly.tar.xz:dflyboot
211 CONFIGURE_TARGET=       ${ARCH}-portbld-dragonfly
212 CONFIGURE_ENV+=         BOOTDIR=${BOOT_DIR} LBASE=${LOCALBASE}
213
214 # avoid "sed: RE error: Illegal byte sequence" in bootstrap configure script, smth fishy
215 BUILD_DEPENDS+=         gsed:textproc/gsed
216 dfly-patch:
217         ${REINPLACE_CMD} -e 's@sed@gsed@g' \
218                 ${BOOT_DIR}/configure
219 .endif
220
221 # override TMPDIR because /tmp often doesn't have enough space
222 # to build some of the larger libraries.
223 #TMPDIR=                ${WRKSRC}/tmp
224
225 SLAVES_PREFIX=          ${WRKDIR}/slaves_prefix
226 SLAVES_WRKDIRPREFIX=    ${WRKDIR}/slaves_wrkdirprefix
227
228 # %%PORTDOCS%%%%DOCSDIR%%/html/libraries/doc-index-V.html
229 post-install-script:
230         ${FIND} -ds ${GHC_LIBDIR} -type f -print | ${SED} -E \
231                 -e 's,^${STAGEDIR}${PREFIX}/?,,' \
232                 -e '/^${GHC_LIBDIR:C/\//\\\//g}\/package.conf.d\/package\.cache/s|^|@comment |g' \
233                 >> ${TMPPLIST}
234 .if ${PORT_OPTIONS:MDOCS}
235         ${FIND} -ds ${STAGEDIR}${DOCSDIR} -type f -print | ${SED} -E \
236                 -e 's,^${STAGEDIR}${PREFIX}/?,,' \
237                 -e '/^${STAGEDIR:C/\//\\\//g}${DOCSDIR:C/\//\\\//g}\/html\/libraries\/doc-index-[^.]+\.html/s|^|@comment |g' \
238                 -e '/^${STAGEDIR:C/\//\\\//g}${DOCSDIR:C/\//\\\//g}\/html\/libraries\/index[^\/.]*\.html/s|^|@comment|g' \
239                 -e '/^${STAGEDIR:C/\//\\\//g}${DOCSDIR:C/\//\\\//g}\/html\/libraries\/[^\/]+\.png/s|^|@comment |g' \
240                 >> ${TMPPLIST}
241
242         # Cleanup the indexen created by gen_contents_index
243         ${ECHO} "@postunexec ${RM} %D/${DOCSDIR_REL}/html/libraries/doc-index-*.html" >> ${TMPPLIST}
244         ${ECHO} "@postunexec ${RM} %D/${DOCSDIR_REL}/html/libraries/index*.html" >> ${TMPPLIST}
245         ${ECHO} "@postunexec ${RM} %D/${DOCSDIR_REL}/html/libraries/*.png" >> ${TMPPLIST}
246 .endif
247         ${ECHO} '@postunexec ${RM} %D/${GHC_LIBDIR_REL}/package.conf.d/package.cache' >>${TMPPLIST}
248
249 post-patch:
250         @${REINPLACE_CMD} -e 's|%%CC%%|${CC}|; \
251                 s|%%AR%%|${AR}|; \
252                 s|%%LD%%|${LD}|' \
253                 ${WRKSRC}/libraries/Cabal/Cabal/Distribution/Simple/Program/Builtin.hs
254         @${REINPLACE_CMD} -e 's/@SettingsLlcCommand@/llc${LLVM_VERSION}/' ${WRKSRC}/settings.in
255         @${REINPLACE_CMD} -e 's/@SettingsOptCommand@/opt${LLVM_VERSION}/' ${WRKSRC}/settings.in
256
257 .if empty(PORT_OPTIONS:MBOOT) && ${OPSYS} == "FreeBSD"
258         @${REINPLACE_CMD} -e '/^mandir/d' ${BOOT_DIR}/mk/build.mk
259         @${REINPLACE_CMD} -e '/^infodir/d' ${BOOT_DIR}/mk/build.mk
260         @${REINPLACE_CMD} -e '/^docdir/d' ${BOOT_DIR}/mk/build.mk
261         @${REINPLACE_CMD} -e '/^htmldir/d' ${BOOT_DIR}/mk/build.mk
262 .endif
263
264 .if ${ARCH} == powerpc64 && ${PPC_ABI} == ELFv2
265         @${REINPLACE_CMD} -e 's/ELF_V1/ELF_V2/' \
266                 ${WRKSRC}/configure ${WRKSRC}/aclocal.m4
267 .endif
268
269 pre-configure: apply-slist
270         # Copy the subbed build.mk to the proper position
271         ${CP} ${WRKDIR}/build.mk ${WRKSRC}/mk/build.mk
272
273 # If we are using bootstrap compiler, configure and install it into ${BOOT_DIR}
274 .if empty(PORT_OPTIONS:MBOOT)
275         cd ${BOOT_DIR} && ${CONFIGURE_ENV} ${CONFIGURE_CMD} --prefix=${BOOT_DIR}
276         cd ${BOOT_DIR} && PACKAGES='' ${MAKE_CMD} install
277 .else
278 # otherwise, make sure we have "ghc" in PATH
279         if ! ${WHICH} -s ghc ; then \
280                 echo "No 'ghc' executable is found in your PATH! Turn off BOOT option." ; false ; \
281         fi
282 .endif
283 # If DOCS are set, install HsColour in-place
284 .if ${PORT_OPTIONS:MDOCS}
285         ${MKDIR} ${SLAVES_PREFIX}
286         ${MKDIR} ${SLAVES_WRKDIRPREFIX}
287
288         cd ${SLAVES_WRKDIRPREFIX} && \
289                 ${TAR} xvf ${DISTDIR}/hscolour-${HSCOLOUR_VERSION}.tar.gz && \
290                 cd hscolour-${HSCOLOUR_VERSION} && \
291                 ${SLAVE_ENV} ghc --make -o Setup Setup.hs -package Cabal && \
292                 ${SLAVE_ENV} ./Setup configure --ghc --prefix=${SLAVES_PREFIX} --with-gcc=${CC} --with-ld=${LD} && \
293                 ${SLAVE_ENV} ./Setup build && \
294                 ${SLAVE_ENV} ./Setup install
295 .endif
296
297 post-install:
298         (for f in ${_EXECUTABLES} $$(${FIND} ${GHC_LIBDIR} -name '*.so*'); do \
299                 ${STRIP_CMD} $$f; done)
300         ${RM} ${STAGEDIR}${PREFIX}/bin/haddock
301
302 # Create a bootstrap compiler tar ball: run this in an interactive poudriere jail
303 .PHONY: create-bootstrap
304 create-bootstrap:
305         cd ${WRKSRC} \
306                 && ${ECHO} "BIN_DIST_NAME=ghc-${GHC_VERSION}-boot" >> mk/build.mk \
307                 && ${ECHO} "BIN_DIST_TAR=ghc-${GHC_VERSION}-boot.tar" >> mk/build.mk \
308                 && ${ECHO} "HADDOCK_DOCS=NO" >> mk/build.mk \
309                 && ${GMAKE} binary-dist TAR_COMP=xz \
310                 && ${MV} ${WRKSRC}/ghc-${GHC_VERSION}-boot-${GHC_ARCH}-portbld-freebsd.tar.xz /tmp/ghc-${GHC_VERSION}-boot-${ARCH}-freebsd.tar.xz
311
312         cd /tmp \
313                 && sha256 ghc-${GHC_VERSION}-boot-${ARCH}-freebsd.tar.xz \
314                 && ${ECHO} -n "SIZE (ghc-${GHC_VERSION}-boot-${ARCH}-freebsd.tar.xz) = " \
315                 && ${STAT} -f %z ghc-${GHC_VERSION}-boot-${ARCH}-freebsd.tar.xz
316
317 # Much like create-bootstrap, just different naming and output format
318 .PHONY: create-stack-bindist
319 create-stack-bindist:
320         ${REINPLACE_CMD} -e '/^mandir/d' \
321                         -e '/^infodir/d' \
322                         -e '/^docdir/d' \
323                         -e '/^htmldir/d' \
324                 ${WRKSRC}/mk/build.mk
325
326         cd ${WRKSRC} \
327                 && ${GMAKE} binary-dist TAR_COMP=xz \
328                 && ${MV} ${WRKSRC}/ghc-${GHC_VERSION}-${GHC_ARCH}-portbld-freebsd.tar.xz /tmp/
329
330         cd /tmp \
331                 && ${ECHO} "${GHC_VERSION}:" \
332                 && ${ECHO} "url: \"http://distcache.FreeBSD.org/local-distfiles/arrowd/stack-bindists/ghc-${GHC_VERSION}-${GHC_ARCH}-portbld-freebsd.tar.xz\"" \
333                 && ${ECHO} -n "content-length: " \
334                 && ${STAT} -f %z ghc-${GHC_VERSION}-${GHC_ARCH}-portbld-freebsd.tar.xz \
335                 && ${ECHO} -n "sha1: " \
336                 && sha1 -q ghc-${GHC_VERSION}-${GHC_ARCH}-portbld-freebsd.tar.xz \
337                 && ${ECHO} -n "sha256: " \
338                 && sha256 -q ghc-${GHC_VERSION}-${GHC_ARCH}-portbld-freebsd.tar.xz
339
340 .include <bsd.port.post.mk>