Targets.hs 4.53 KB
Newer Older
1
module Targets (
2
    targetWays, targetPackages, targetDirectories,
3
    customConfigureSettings,
4
5
6
7
    array, base, binPackageDb, binary, bytestring, cabal, containers, deepseq,
    directory, filepath, ghcPrim, haskeline, hoopl, hpc, integerLibrary,
    parallel, pretty, primitive, process, stm, templateHaskell, terminfo, time,
    transformers, unix, win32, xhtml
8
    ) where
9

10
import qualified Ways
Andrey Mokhov's avatar
Andrey Mokhov committed
11
import Base hiding (arg, args, Args, TargetDir)
12
import Package
Andrey Mokhov's avatar
Andrey Mokhov committed
13
14
15
import Switches
import Expression
import Expression.Settings
16

17
-- These are the packages we build
Andrey Mokhov's avatar
Andrey Mokhov committed
18
19
targetPackages :: Packages Action
targetPackages = mconcat
20
21
    [ stage Stage0 ? packagesStage0
    , stage Stage1 ? packagesStage1 ]
22

Andrey Mokhov's avatar
Andrey Mokhov committed
23
24
25
26
packagesStage0 :: Packages Action
packagesStage0 = mconcat
    [ return [ binPackageDb, binary, cabal, hoopl, hpc, transformers ]
    , notWindowsHost ? notTargetOs "ios" ? return [terminfo] ]
27

Andrey Mokhov's avatar
Andrey Mokhov committed
28
29
packagesStage1 :: Packages Action
packagesStage1 = mconcat
30
    [ packagesStage0
Andrey Mokhov's avatar
Andrey Mokhov committed
31
32
33
34
35
36
    , return [ array, base, bytestring, containers, deepseq, directory
             , filepath, ghcPrim, haskeline, integerLibrary, parallel
             , pretty, primitive, process, stm, templateHaskell, time ]
    , notWindowsHost ? return [unix]
    , windowsHost    ? return [win32]
    , buildHaddock   ? return [xhtml] ]
37

38
-- Packages will be build these ways
Andrey Mokhov's avatar
Andrey Mokhov committed
39
40
41
42
43
targetWays :: Ways Action
targetWays = mconcat
    [                              return [Ways.vanilla] -- always build vanilla
    , notStage Stage0            ? return [Ways.profiling]
    , platformSupportsSharedLibs ? return [Ways.dynamic] ]
44

45
46
47
48
49
-- Build results will be placed into a target directory with the following
-- typical structure:
-- * build/           : contains compiled object code
-- * doc/             : produced by haddock
-- * package-data.mk  : contains output of ghc-cabal applied to pkgCabal
Andrey Mokhov's avatar
Andrey Mokhov committed
50
51
52
53
54
55
56
57
58
targetDirectories :: Monad m => TargetDir m
targetDirectories = do
    stage   <- asks getStage
    package <- asks getPackage
    let targetDir
            | package == compiler = "stage" ++ show (succ stage)
            | stage   == Stage0   = "dist-boot"
            | otherwise           = "dist-install"
    return targetDir
Andrey Mokhov's avatar
Andrey Mokhov committed
59

60
61
62
63
64
65
-- Package definitions
array, base, binPackageDb, binary, bytestring, cabal, containers, deepseq,
    directory, filepath, ghcPrim, haskeline, hoopl, hpc, integerLibrary,
    parallel, pretty, primitive, process, stm, templateHaskell, terminfo, time,
    transformers, unix, win32, xhtml :: Package

Andrey Mokhov's avatar
Andrey Mokhov committed
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
array           = library  "array"
base            = library  "base"
binPackageDb    = library  "bin-package-db"
binary          = library  "binary"
bytestring      = library  "bytestring"
cabal           = library  "Cabal/Cabal" `setCabal` "Cabal.cabal"
compiler        = topLevel "compiler"    `setCabal` "ghc.cabal"
containers      = library  "containers"
deepseq         = library  "deepseq"
directory       = library  "directory"
filepath        = library  "filepath"
ghcPrim         = library  "ghc-prim"
haskeline       = library  "haskeline"
hoopl           = library  "hoopl"
hpc             = library  "hpc"
integerLibrary  = library  integerLibraryName `setCabal` integerLibraryCabal
parallel        = library  "parallel"
pretty          = library  "pretty"
primitive       = library  "primitive"
process         = library  "process"
stm             = library  "stm"
templateHaskell = library  "template-haskell"
terminfo        = library  "terminfo"
time            = library  "time"
transformers    = library  "transformers"
unix            = library  "unix"
win32           = library  "Win32"
xhtml           = library  "xhtml"
94

95
96
97
98
99
100
101
102
103
integerLibraryName :: String
integerLibraryName = case integerLibraryImpl of
    IntegerGmp    -> "integer-gmp"
    IntegerGmp2   -> "integer-gmp2"
    IntegerSimple -> "integer-simple"

-- see Note [Cabal name weirdness]
integerLibraryCabal :: FilePath
integerLibraryCabal = case integerLibraryImpl of
Andrey Mokhov's avatar
Andrey Mokhov committed
104
105
106
    IntegerGmp    -> "integer-gmp.cabal"
    IntegerGmp2   -> "integer-gmp.cabal" -- Indeed, why make life easier?
    IntegerSimple -> "integer-simple.cabal"
107
108

-- Custom configure settings for packages
Andrey Mokhov's avatar
Andrey Mokhov committed
109
110
111
112
113
114
customConfigureSettings :: Settings Action
customConfigureSettings = mconcat
    [ package base           ? arg ("--flags=" ++ integerLibraryName)
    , package ghcPrim        ? arg "--flag=include-ghc-prim"
    , package integerLibrary ?
        windowsHost ? arg "--configure-option=--with-intree-gmp"
115
116
    ]

117
-- Note [Cabal name weirdness]
118
119
-- Find out if we can move the contents to just Cabal/
-- What is Cabal/cabal-install? Do we need it?
120
-- A related question about gmp2 -- let's rename the cabal file?