Cabal-3.10.1.0: A framework for packaging Haskell software

Copyright | Isaac Jones 2003-2007
License | BSD3
Maintainer | cabal-devel@haskell.org
Portability | portable
Safe Haskell | Safe-Inferred
Language | Haskell2010

Distribution.Simple.GHC

Contents

- Constructing and deconstructing GHC environment files
- Version-specific implementation quirks

Description

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.

Synopsis

- getGhcInfo :: Verbosity -> ConfiguredProgram -> IO [(String, String)]
- configure :: Verbosity -> Maybe FilePath -> Maybe FilePath -> ProgramDb -> IO (Compiler, Maybe Platform, ProgramDb)
- getInstalledPackages :: Verbosity -> Compiler -> PackageDBStack -> ProgramDb -> IO InstalledPackageIndex
- getInstalledPackagesMonitorFiles :: Verbosity -> Platform -> ProgramDb -> [PackageDB] -> IO [FilePath]
- getPackageDBContents :: Verbosity -> PackageDB -> ProgramDb -> IO InstalledPackageIndex
- buildLib :: Verbosity -> Flag (Maybe Int) -> PackageDescription -> LocalBuildInfo -> Library -> ComponentLocalBuildInfo -> IO ()
- buildFLib :: Verbosity -> Flag (Maybe Int) -> PackageDescription -> LocalBuildInfo -> ForeignLib -> ComponentLocalBuildInfo -> IO ()
- buildExe :: Verbosity -> Flag (Maybe Int) -> PackageDescription -> LocalBuildInfo -> Executable -> ComponentLocalBuildInfo -> IO ()
- replLib :: ReplOptions -> Verbosity -> Flag (Maybe Int) -> PackageDescription -> LocalBuildInfo -> Library -> ComponentLocalBuildInfo -> IO ()
- replFLib :: ReplOptions -> Verbosity -> Flag (Maybe Int) -> PackageDescription -> LocalBuildInfo -> ForeignLib -> ComponentLocalBuildInfo -> IO ()
- replExe :: ReplOptions -> Verbosity -> Flag (Maybe Int) -> PackageDescription -> LocalBuildInfo -> Executable -> ComponentLocalBuildInfo -> IO ()
- startInterpreter :: Verbosity -> ProgramDb -> Compiler -> Platform -> PackageDBStack -> IO ()
- installLib :: Verbosity -> LocalBuildInfo -> FilePath -> FilePath -> FilePath -> PackageDescription -> Library -> ComponentLocalBuildInfo -> IO ()
- installFLib :: Verbosity -> LocalBuildInfo -> FilePath -> FilePath -> PackageDescription -> ForeignLib -> IO ()
- installExe :: Verbosity -> LocalBuildInfo -> FilePath -> FilePath -> (FilePath, FilePath) -> PackageDescription -> Executable -> IO ()
- libAbiHash :: Verbosity -> PackageDescription -> LocalBuildInfo -> Library -> ComponentLocalBuildInfo -> IO String
- hcPkgInfo :: ProgramDb -> HcPkgInfo
- registerPackage :: Verbosity -> ProgramDb -> PackageDBStack -> InstalledPackageInfo -> RegisterOptions -> IO ()
- componentGhcOptions :: Verbosity -> LocalBuildInfo -> BuildInfo -> ComponentLocalBuildInfo -> FilePath -> GhcOptions
- componentCcGhcOptions :: Verbosity -> LocalBuildInfo -> BuildInfo -> ComponentLocalBuildInfo -> FilePath -> FilePath -> GhcOptions
- getGhcAppDir :: IO FilePath
- getLibDir :: Verbosity -> LocalBuildInfo -> IO FilePath
- isDynamic :: Compiler -> Bool
- getGlobalPackageDB :: Verbosity -> ConfiguredProgram -> IO FilePath
- pkgRoot :: Verbosity -> LocalBuildInfo -> PackageDB -> IO FilePath
- data GhcEnvironmentFileEntry
  - = GhcEnvFileComment String
  - | GhcEnvFilePackageId UnitId
  - | GhcEnvFilePackageDb PackageDB
  - | GhcEnvFileClearPackageDbStack
- simpleGhcEnvironmentFile :: PackageDBStack -> [UnitId] -> [GhcEnvironmentFileEntry]
- renderGhcEnvironmentFile :: [GhcEnvironmentFileEntry] -> String
- writeGhcEnvironmentFile :: FilePath -> Platform -> Version -> [GhcEnvironmentFileEntry] -> IO FilePath
- ghcPlatformAndVersionString :: Platform -> Version -> String
- readGhcEnvironmentFile :: FilePath -> IO [GhcEnvironmentFileEntry]
- parseGhcEnvironmentFile :: Parser [GhcEnvironmentFileEntry]
- newtype ParseErrorExc = ParseErrorExc ParseError
- getImplInfo :: Compiler -> GhcImplInfo
- data GhcImplInfo = GhcImplInfo {
  - supportsHaskell2010 :: Bool
  - supportsGHC2021 :: Bool
  - reportsNoExt :: Bool
  - alwaysNondecIndent :: Bool
  - flagGhciScript :: Bool
  - flagProfAuto :: Bool
  - flagProfLate :: Bool
  - flagPackageConf :: Bool
  - flagDebugInfo :: Bool
  - supportsDebugLevels :: Bool
  - supportsPkgEnvFiles :: Bool
  - flagWarnMissingHomeModules :: Bool
  }

# Documentation

getGhcInfo :: Verbosity -> ConfiguredProgram -> IO [(String, String)] Source #

configure :: Verbosity -> Maybe FilePath -> Maybe FilePath -> ProgramDb -> IO (Compiler, Maybe Platform, ProgramDb) Source #

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

Given a package DB stack, return all installed packages.

getInstalledPackagesMonitorFiles :: Verbosity -> Platform -> ProgramDb -> [PackageDB] -> IO [FilePath] Source #

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

Given a single package DB, return all installed packages.

buildLib :: Verbosity -> Flag (Maybe Int) -> PackageDescription -> LocalBuildInfo -> Library -> ComponentLocalBuildInfo -> IO () Source #

buildFLib :: Verbosity -> Flag (Maybe Int) -> PackageDescription -> LocalBuildInfo -> ForeignLib -> ComponentLocalBuildInfo -> IO () Source #

Build a foreign library

buildExe :: Verbosity -> Flag (Maybe Int) -> PackageDescription -> LocalBuildInfo -> Executable -> ComponentLocalBuildInfo -> IO () Source #

Build an executable with GHC.

replLib :: ReplOptions -> Verbosity -> Flag (Maybe Int) -> PackageDescription -> LocalBuildInfo -> Library -> ComponentLocalBuildInfo -> IO () Source #

replFLib :: ReplOptions -> Verbosity -> Flag (Maybe Int) -> PackageDescription -> LocalBuildInfo -> ForeignLib -> ComponentLocalBuildInfo -> IO () Source #

replExe :: ReplOptions -> Verbosity -> Flag (Maybe Int) -> PackageDescription -> LocalBuildInfo -> Executable -> ComponentLocalBuildInfo -> IO () Source #

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

Start a REPL without loading any source files.

installLib Source #

Arguments

:: 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 #

Arguments

:: Verbosity |
-> LocalBuildInfo |
-> FilePath | install location
-> FilePath | Build location
-> PackageDescription |
-> ForeignLib |
-> IO () |

Install foreign library for GHC.

installExe Source #

Arguments

:: 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.

hcPkgInfo :: ProgramDb -> HcPkgInfo Source #

registerPackage :: Verbosity -> ProgramDb -> PackageDBStack -> InstalledPackageInfo -> RegisterOptions -> IO () Source #

componentGhcOptions :: Verbosity -> LocalBuildInfo -> BuildInfo -> ComponentLocalBuildInfo -> FilePath -> GhcOptions Source #

componentCcGhcOptions :: Verbosity -> LocalBuildInfo -> BuildInfo -> ComponentLocalBuildInfo -> FilePath -> FilePath -> GhcOptions Source #

getGhcAppDir :: IO FilePath Source #

Return the `FilePath` to the GHC application data directory.

Since: Cabal-3.4.0.0

getLibDir :: Verbosity -> LocalBuildInfo -> IO FilePath Source #

isDynamic :: Compiler -> Bool Source #

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

Return the `FilePath` to the global GHC package database.

pkgRoot :: Verbosity -> LocalBuildInfo -> PackageDB -> IO FilePath Source #

# Constructing and deconstructing GHC environment files

data GhcEnvironmentFileEntry Source #

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

Constructors

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`

GhcEnvFileClearPackageDbStack

    clear-package-db

#### Instances

Instances details

Show GhcEnvironmentFileEntry Source # |
Instance details Defined in Distribution.Simple.GHC.Internal Methods showsPrec :: Int -> GhcEnvironmentFileEntry -> ShowS Source # show :: GhcEnvironmentFileEntry -> String Source # showList :: [GhcEnvironmentFileEntry] -> ShowS Source #
Eq GhcEnvironmentFileEntry Source # |
Instance details Defined in Distribution.Simple.GHC.Internal Methods (==) :: GhcEnvironmentFileEntry -> GhcEnvironmentFileEntry -> Bool # (/=) :: GhcEnvironmentFileEntry -> GhcEnvironmentFileEntry -> Bool #
Ord GhcEnvironmentFileEntry Source # |

Instance details

Defined in Distribution.Simple.GHC.Internal

Methods

compare :: GhcEnvironmentFileEntry -> GhcEnvironmentFileEntry -> Ordering #

(<) :: GhcEnvironmentFileEntry -> GhcEnvironmentFileEntry -> Bool #

(<=) :: GhcEnvironmentFileEntry -> GhcEnvironmentFileEntry -> Bool #

(>) :: GhcEnvironmentFileEntry -> GhcEnvironmentFileEntry -> Bool #

(>=) :: GhcEnvironmentFileEntry -> GhcEnvironmentFileEntry -> Bool #

max :: GhcEnvironmentFileEntry -> GhcEnvironmentFileEntry -> GhcEnvironmentFileEntry #

min :: GhcEnvironmentFileEntry -> GhcEnvironmentFileEntry -> GhcEnvironmentFileEntry #

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.

renderGhcEnvironmentFile :: [GhcEnvironmentFileEntry] -> String Source #

Render a bunch of GHC environment file entries

writeGhcEnvironmentFile Source #

Arguments

:: FilePath | directory in which to put it
-> Platform | the GHC target platform
-> Version | the GHC version
-> [GhcEnvironmentFileEntry] | the content
-> IO FilePath |

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.

Returns the name of the file written.

ghcPlatformAndVersionString :: Platform -> Version -> String Source #

GHC's rendering of its platform and compiler version string as used in certain file locations (such as user package db location). For example `x86_64-linux-7.10.4`

readGhcEnvironmentFile :: FilePath -> IO [GhcEnvironmentFileEntry] Source #

parseGhcEnvironmentFile :: Parser [GhcEnvironmentFileEntry] Source #

newtype ParseErrorExc Source #

Constructors

ParseErrorExc ParseError |

#### Instances

Instances details

Exception ParseErrorExc Source # |
Instance details Defined in Distribution.Simple.GHC.EnvironmentParser Methods toException :: ParseErrorExc -> SomeException Source # fromException :: SomeException -> Maybe ParseErrorExc Source # displayException :: ParseErrorExc -> String Source #
Show ParseErrorExc Source # |
Instance details Defined in Distribution.Simple.GHC.EnvironmentParser Methods showsPrec :: Int -> ParseErrorExc -> ShowS Source # show :: ParseErrorExc -> String Source # showList :: [ParseErrorExc] -> ShowS Source #

# Version-specific implementation quirks

getImplInfo :: Compiler -> GhcImplInfo Source #

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.

Constructors

GhcImplInfo |

Fields

- supportsHaskell2010 :: Bool
  - XHaskell2010 and -XHaskell98 flags
- supportsGHC2021 :: Bool
  - XGHC2021 flag
- reportsNoExt :: Bool
  - -supported-languages gives Ext and NoExt
- alwaysNondecIndent :: Bool

  NondecreasingIndentation is always on

- flagGhciScript :: Bool
  - ghci-script flag supported
- flagProfAuto :: Bool

  new style -fprof-auto* flags

- flagProfLate :: Bool

  fprof-late flag

- flagPackageConf :: Bool

  use package-conf instead of package-db

- flagDebugInfo :: Bool
  - g flag supported
- supportsDebugLevels :: Bool

  supports numeric `-g` levels

- supportsPkgEnvFiles :: Bool

  picks up `.ghc.environment` files

- flagWarnMissingHomeModules :: Bool
  - Wmissing-home-modules is supported