Targets.hs 4.45 KB
Newer Older
1
module Targets (
2
3
    targetWays, targetPackages, targetDirectory,
    allPackages,
4
    customConfigureSettings,
5
6
7
8
    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
9
    ) where
10

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

18
-- These are the packages we build
Andrey Mokhov's avatar
Andrey Mokhov committed
19
20
21
22
23
24
25
26
27
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] ]
28

Andrey Mokhov's avatar
Andrey Mokhov committed
29
30
31
32
33
34
35
36
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] ]
37

38
-- Packages will be build these ways
39
targetWays :: Ways
Andrey Mokhov's avatar
Andrey Mokhov committed
40
targetWays = mconcat
Andrey Mokhov's avatar
Andrey Mokhov committed
41
42
43
    [                              append [vanilla] -- always build vanilla
    , notStage Stage0            ? append [profiling]
    , platformSupportsSharedLibs ? append [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
50
51
targetDirectory :: Stage -> Package -> FilePath
targetDirectory stage package
Andrey Mokhov's avatar
Andrey Mokhov committed
52
    | package == compiler = "stage" ++ show (fromEnum stage + 1)
53
54
    | stage   == Stage0   = "dist-boot"
    | otherwise           = "dist-install"
Andrey Mokhov's avatar
Andrey Mokhov committed
55

56
-- Package definitions
Andrey Mokhov's avatar
Andrey Mokhov committed
57
58
59
60
61
62
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 ]
63

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

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

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

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