[Haskell-cafe] Ease of Haskell development on OS X?

Hans Aberg haberg at math.su.se
Fri Mar 20 17:02:05 EDT 2009

On 20 Mar 2009, at 21:05, David Leimbach wrote:

> > Since GHC is written in Haskell, do you need to have another Haskell
> > compiler installed before GHC 6.10.1 can be installed through  
> MacPorts?
> It bootstraps itself.
> ???  GHC does or MacPorts does.  My experience was that you needed  
> GHC to build GHC :-)

MacPort developers tweak sources into packages which can install by  
themselves. So one just types
   sudo port install ghc
and it does the rest. Here is info about ghc:
> $ port info ghc
> ghc 6.8.3, Revision 1, lang/ghc (Variants: universal, darwin_6,  
> darwin_7, darwin_8_powerpc, darwin_8_i386, darwin_9_powerpc,  
> darwin_9_i386, no_opengl)
> http://haskell.org/
> 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.
> Library Dependencies: readline, gmp
> Runtime Dependencies: perl5.8
> Platforms: darwin
> Maintainers: gwright at macports.org

However, as someone needs to do the packaging, the versions tend to be  
older than from direct sources. So the latter is to be preferred, but  
the package manager does the package chasing for you (which is a  
problem with Gtk+ installed directly).

Therefore, as mentioned before, it might be best to install the GHC  
binaries and install libraries like Gtk+ from MacPorts. There is also  
Intel Gtk+ that binds directly to Aqua, the Mac OS X native GUI (for  
making native Mac OS X Applications):

You need to set of environmental variables UNIX style, but there is a  
Mac OS X way, too (see below). In the traditional way, one must be  
aware of that the shell 'bash' (see 'man bash') reads different  
startup files when called as a login shell (as from the Terminal) and  
non-login-shell (as from X11 and xterm). For the former, one can put  
the stuff in .profile, and the latter .bashrc. To make things simple,  
one can put in .bashrc:
   source ~/.profile
thus reading .profile. In .profile, one might put something like the  
stuff at the bottom of this letter (which also adds support for the  
other package manager, as well admitting user binaries to be installed).

There is another, Mac OS X specific way (also see below): go to  
Terminal, and make a directory:
   mkdir .MacOSX
   cd .MacOSX
   touch environment.plist
   open -a Xcode environment.plist
The last command opens the file into the Xcode editor, which has a  
facility to create the special format for these files. Pne drawback of  
this method is the one has to log out and login again to set them.

This assumes you have installed Xcode, wither from the installation  
disk, or by signing up as a developer at http://developer.apple.com/

When working with files, it is convenient to set them so that they  
open in your favorite program. For that, I have found it convenient to  
install a System Preferences panel 'Default Apps' found at
I see now they have one for editing the environment.plist file.

If you come from a non-UNIX (POSIX) platform, then note that in order  
to work as root, it is most of the time sufficient to use (from an  
administrator account)
   sudo -s
The 'root' account is by default disabled (can be started from the  
Directory Utility). Also never edit in /usr/ outside /usr/local/, the  
other system directories, or /System/ as they belong to the system  
installation (Mac OS X user modified system files are out into / 
Library/, but often via some other program which does safety checks.)

   Hans Aberg

# Add to end of searchpath:
   if ! eval test -z "\"\${$1##*:$2:*}\"" -o -z "\"\${$1%%*:$2}\"" -o - 
z "\"\${$1##$2:*}\"" -o -z "\"\${$1##$2}\"" ; then
     eval "$1=\$$1:$2"

# Add to beginning of searchpath:
   if ! eval test -z "\"\${$1##*:$2:*}\"" -o -z "\"\${$1%%*:$2}\"" -o - 
z "\"\${$1##$2:*}\"" -o -z "\"\${$1##$2}\"" ; then
     eval "$1=$2:\$$1"

# Set system searchpaths:

# In the case a directory may exist (depending on the program) both  
with and without
# parent directory 'share/' (like in the cae of MANPATH and INFOPATH),  
the 'share/'
# version is put first, as it is what is used in /usr on Mac OS X  
# The idea is that if a program is somehow adapted to this platform,  
the the stuff will
# be moved to the 'share/' variation, and should thus be ovverride the  
unadapted versions.


# Prepend Fink searchpaths:
test -r /sw/bin/init.sh && . /sw/bin/init.sh

# Prepend MacPorts (former DarwinPorts) searchpaths:
prepend_path PATH /opt/local/bin:/opt/local/sbin
prepend_path MANPATH /opt/local/share/man:/opt/local/man
prepend_path INFOPATH /opt/local/share/info:/opt/local/info
prepend_path LIBPATH /opt/local/lib

# Prepend MacTeX paths
prepend_path PATH /usr/texbin
prepend_path MANPATH /usr/local/texlive/2007/texmf/doc/man
prepend_path INFOPATH /usr/local/texlive/2007/texmf/doc/info

# Prepend /usr/local/ searchpaths:
prepend_path PATH /usr/local/bin:/usr/local/X11R6/bin
prepend_path MANPATH /usr/local/share/man:/usr/local/man
prepend_path INFOPATH /usr/local/share/info:/usr/local/info
prepend_path LIBPATH /usr/local/lib

# Prepend $HOME searchpaths:
prepend_path PATH $HOME/local/bin
prepend_path MANPATH $HOME/local/share/man:$HOME/local/man
prepend_path INFOPATH $HOME/local/share/info:$HOME/local/info
prepend_path LIBPATH $HOME/local/lib

# Export changed paths:
export PATH
export MANPATH
export LIBPATH

More information about the Haskell-Cafe mailing list