Targets.hs 4.44 KB
Newer Older
1
module Targets (
Andrey Mokhov's avatar
Andrey Mokhov committed
2
    targetWays, targetPackages, targetDirectory, allPackages,
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

Andrey Mokhov's avatar
Andrey Mokhov committed
10
import Ways hiding (parallel)
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
20
21
22
23
24
25
26
targetPackages :: Packages
targetPackages = mconcat
    [ stage Stage0 ? packagesStage0
    , stage Stage1 ? packagesStage1 ]

packagesStage0 :: Packages
packagesStage0 = mconcat
    [ append [binPackageDb, binary, cabal, compiler, hoopl, hpc, transformers]
    , notWindowsHost ? notTargetOs "ios" ? append [terminfo] ]
27

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

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

44
45
46
47
48
-- 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
49
50
targetDirectory :: Stage -> Package -> FilePath
targetDirectory stage package
Andrey Mokhov's avatar
Andrey Mokhov committed
51
    | package == compiler = "stage" ++ show (fromEnum stage + 1)
52
53
    | stage   == Stage0   = "dist-boot"
    | otherwise           = "dist-install"
Andrey Mokhov's avatar
Andrey Mokhov committed
54

55
-- Package definitions
Andrey Mokhov's avatar
Andrey Mokhov committed
56
57
58
59
60
61
allPackages :: [Package]
allPackages =
    [ array, base, binPackageDb, binary, bytestring, cabal, compiler
    , containers, deepseq, directory, filepath, ghcPrim, haskeline
    , hoopl, hpc, integerLibrary, parallel, pretty, primitive, process
    , stm, templateHaskell, terminfo, time, transformers, unix, win32, xhtml ]
62

Andrey Mokhov's avatar
Andrey Mokhov committed
63
64
65
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
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"
91

92
93
94
95
96
97
98
99
100
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
101
102
103
    IntegerGmp    -> "integer-gmp.cabal"
    IntegerGmp2   -> "integer-gmp.cabal" -- Indeed, why make life easier?
    IntegerSimple -> "integer-simple.cabal"
104
105

-- Custom configure settings for packages
106
customConfigureSettings :: Settings
Andrey Mokhov's avatar
Andrey Mokhov committed
107
customConfigureSettings = mconcat
Andrey Mokhov's avatar
Andrey Mokhov committed
108
109
110
111
    [ package integerLibrary ?
      windowsHost     ? appendSub "--configure-option" ["--with-intree-gmp"]
    , package base    ? appendSub "--flags" [integerLibraryName]
    , package ghcPrim ? appendSub "--flag"  ["include-ghc-prim"]]
112

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