Fetching contributors…
Cannot retrieve contributors at this time
173 lines (147 sloc) 7.02 KB
# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
PortSystem 1.0
PortGroup compiler_blacklist_versions 1.0
name ghc
# Do not update GHC separate from Haskell Platform.
# When updating GHC, make sure to revbump all Haskell ports.
# Also make sure to update the version in the Haskell PortGroup.
version 7.8.3
revision 6
categories lang haskell
maintainers {cal @neverpanic} openmaintainer
license BSD
platforms darwin
description The Glorious Glasgow Haskell Compilation System
long_description \
The Glasgow Haskell Compiler is a robust, \
fully-featured, optimising compiler and interactive \
environment for Haskell 98, GHC compiles Haskell to \
either native code or C. It implements numerous \
experimental language extensions to Haskell 98, \
for example: concurrency, a foreign language interface, \
multi-parameter type classes, scoped type variables, \
existential and universal quantification, unboxed \
types, exceptions, weak pointers, and so on. \
GHC comes with a generational garbage collector, \
and a space and time profiler.
master_sites ${homepage}/dist/${version}/
distname ${name}-${version}-src
worksrcdir ${name}-${version}
use_bzip2 yes
distfiles ${name}-${version}-src${extract.suffix} \
checksums ghc-7.8.3-src.tar.bz2 \
rmd160 464d31d924a8c1e23e94b3cae810c4e41dad4b75 \
sha256 2358826f8424bf571dcc313bd882422fe108a340d6e37db4339ff6d5d6ac3f37 \
ghc-7.8.3-testsuite.tar.bz2 \
rmd160 abc39b71e2f3926b80c681428c447f39599d7d83 \
sha256 9cfef874adf5b895701ae52e507f07049a64246af120ac15200e7bf612521122
depends_build port:ghc-bootstrap \
depends_lib port:gmp \
port:ncurses \
port:libiconv \
port:llvm-3.5 \
patchfiles patch-configure-workaround-bsdsed-incompatibility.diff \
patch-configure-disable-docs.diff \
if { ${os.platform} eq "darwin" && ${os.major} >= 16 } {
patchfiles-append patch-sierra-compatibility.diff
use_parallel_build \
livecheck.type none yes
# Compilation fails with older versions of clang. clang-4.1 from Xcode 4.5 is
# too old, clang-5.1 from from Xcode 5.1 works. I do not have any data points in
# between, so I'm blacklisting everything lower than 5.1. If you want to test
# the versions in between, be my guest.
# Also avoid LLVM GCC 4.2 and GCC 4.2, which are before MacPorts' clang 3.4 in
# the fallback list on some systems.
# NOTE that it is actually the C compiler used in ghc-bootstrap that is
# relevant here. This code block is duplicated in this port to avoid
# inconsistencies.
compiler.blacklist-append \
llvm-gcc-4.2 \
gcc-4.2 \
{clang < 503.0.38} \
# ghc needs a build and runtime dependency on the compiler used to build it
# same is also set in ghc-bootstrap. clang-4.0 works, is needed on older systems anyway
# also /usr/bin/clang does not work on 10.11, so override it there
if { ${os.platform} eq "darwin" && ( ${os.major} < 13 || ${os.major} == 15 ) } {
compiler.whitelist macports-clang-4.0
depends_run-append port:clang-4.0
set bootstraproot ${prefix}/share/ghc-bootstrap
set llvmPrefix ${prefix}/libexec/llvm-3.5
configure.args --with-ghc=${bootstraproot}/bin/ghc \
--with-iconv-includes=${prefix}/include \
--with-iconv-libraries=${prefix}/lib \
--with-gmp-includes=${prefix}/include \
--with-gmp-libraries=${prefix}/lib \
--with-ffi-includes=${prefix}/lib/libffi-3.2.1/include \
--with-ffi-libraries=${prefix}/lib \
--with-system-libffi \
--with-gcc="${}" \
--with-llc=${llvmPrefix}/bin/llc \
# OK so because the bootstrap binary has been prebuilt for libraries in
# /usr/lib we search these in addition to MacPorts' paths to prevent link
# errors. GHC _should_ actually compile itself in stage2 using paths from the
# command line arguments
compiler.cpath /usr/include
compiler.library_path /usr/lib
build.args VERBOSE=1
destroot.args VERBOSE=1
pre-activate {
set obsoletes [list]
# Legacy port deactivation hack added 2012-12-08, hs-platform-ghc no longer exists
lappend obsoletes hs-platform-ghc
# Legacy port deactivation hack added 2013-08-11, hs-process is provided by base
lappend obsoletes hs-process
# Legacy port deactivation hack added 2013-08-14, hs-template-haskell is provided by base
lappend obsoletes hs-template-haskell
# Legacy port deactivation hack added 2015-01-05, hs-transformers, hs-xhtml
# and hs-binary are provided by base
lappend obsoletes hs-transformers
lappend obsoletes hs-xhtml
lappend obsoletes hs-binary
foreach obsolete $obsoletes {
if {![catch {set obsolete_installed [lindex [registry_active $obsolete] 0]}]} {
# $obsolete is installed and active
# force deactivation
registry_deactivate_composite $obsolete "" [list ports_nodepcheck 1]
post-activate {
set libprefix "${prefix}/lib/${name}-${version}"
# delete old ${prefix}/lib/ghc-${version} directories
foreach fullpath [glob -nocomplain -directory ${prefix}/lib ghc-*] {
if {$fullpath ne $libprefix} {
ui_info "Cleaning up remnant GHC library directory ${fullpath}"
catch {delete $fullpath}
# Walk the current package.conf.d and delete all files not belonging to any
# port, since haskell packages now directly drop it in packages.conf.d and
# register the file to themselves. The package cache is updated by the
# post-activate phase of the packages, which now runs ghc-pkg recache.
# This *will* cause pre-deactivation failures for all ports that still are
# correctly installed and would unregister themselves on uninstall.
# Unfortunately there is no good way around this now that the contents of
# PortGroups are stored together with Portfiles and used for deactivation
# (otherwise I could just edit the PortGroup and make unregistration
# failures non-fatal)
foreach configfile [glob -nocomplain -directory $libprefix/package.conf.d *] {
if {[registry_file_registered $configfile] == 0} {
# file is not registered to any port, remove it
catch {delete $configfile}
catch {system [list ${prefix}/bin/ghc-pkg -v recache]}