Cabal- A framework for packaging Haskell software

CopyrightIsaac Jones 2003-2007
Safe HaskellNone




This is a fairly large module. It contains most of the GHC-specific code for configuring, building and installing packages. It also exports a function for finding out what packages are already installed. Configuring involves finding the ghc and ghc-pkg programs, finding what language extensions this version of ghc supports and returning a Compiler value.

getInstalledPackages involves calling the ghc-pkg program to find out what packages are installed.

Building is somewhat complex as there is quite a bit of information to take into account. We have to build libs and programs, possibly for profiling and shared libs. We have to support building libraries that will be usable by GHCi and also ghc's -split-objs feature. We have to compile any C files using ghc. Linking, especially for split-objs is remarkably complex, partly because there tend to be 1,000's of .o files and this can often be more than we can pass to the ld or ar programs in one go.

Installing for libs and exes involves finding the right files and copying them to the right places. One of the more tricky things about this module is remembering the layout of files in the build directory (which is not explicitly documented) and thus what search dirs are used for various kinds of files.



getInstalledPackages :: Verbosity -> Compiler -> PackageDBStack -> ProgramDb -> IO InstalledPackageIndex Source #

Given a package DB stack, return all installed packages.

getPackageDBContents :: Verbosity -> PackageDB -> ProgramDb -> IO InstalledPackageIndex Source #

Given a single package DB, return all installed packages.

startInterpreter :: Verbosity -> ProgramDb -> Compiler -> Platform -> PackageDBStack -> IO () Source #

Start a REPL without loading any source files.

installLib Source #


:: Verbosity 
-> LocalBuildInfo 
-> FilePath

install location

-> FilePath

install location for dynamic libraries

-> FilePath

Build location

-> PackageDescription 
-> Library 
-> ComponentLocalBuildInfo 
-> IO () 

Install for ghc, .hi, .a and, if --with-ghci given, .o

installFLib Source #


:: Verbosity 
-> LocalBuildInfo 
-> FilePath

install location

-> FilePath

Build location

-> PackageDescription 
-> ForeignLib 
-> IO () 

Install foreign library for GHC.

installExe Source #


:: Verbosity 
-> LocalBuildInfo 
-> FilePath

Where to copy the files to

-> FilePath

Build location

-> (FilePath, FilePath)

Executable (prefix,suffix)

-> PackageDescription 
-> Executable 
-> IO () 

Install executables for GHC.

libAbiHash :: Verbosity -> PackageDescription -> LocalBuildInfo -> Library -> ComponentLocalBuildInfo -> IO String Source #

Extracts a String representing a hash of the ABI of a built library. It can fail if the library has not yet been built.

getGlobalPackageDB :: Verbosity -> ConfiguredProgram -> IO FilePath Source #

Return the FilePath to the global GHC package database.

Constructing GHC environment files

data GhcEnvironmentFileEntry Source #

The kinds of entries we can stick in a .ghc.environment file.


GhcEnvFileComment String
-- a comment
GhcEnvFilePackageId UnitId
package-id foo-1.0-4fe301a...
GhcEnvFilePackageDb PackageDB

global-package-db, user-package-db or package-db blahpackage.conf.d


simpleGhcEnvironmentFile :: PackageDBStack -> [UnitId] -> [GhcEnvironmentFileEntry] Source #

Make entries for a GHC environment file based on a PackageDBStack and a bunch of package (unit) ids.

If you need to do anything more complicated then either use this as a basis and add more entries, or just make all the entries directly.

writeGhcEnvironmentFile Source #


:: FilePath

directory in which to put it

-> Platform

the GHC target platform

-> Version

the GHC version

-> [GhcEnvironmentFileEntry]

the content

-> NoCallStackIO () 

Write a .ghc.environment-$arch-$os-$ver file in the given directory.

The Platform and GHC Version are needed as part of the file name.

Version-specific implementation quirks

data GhcImplInfo Source #

Information about features and quirks of a GHC-based implementation.

Compiler flavors based on GHC behave similarly enough that some of the support code for them is shared. Every implementation has its own peculiarities, that may or may not be a direct result of the underlying GHC version. This record keeps track of these differences.

All shared code (i.e. everything not in the Distribution.Simple.FLAVOR module) should use implementation info rather than version numbers to test for supported features.