summaryrefslogtreecommitdiff
path: root/libraries/installPackage.hs
blob: 475a55e31e2b5e18a6e9f6809180ec2d71d97ad6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117

import Distribution.PackageDescription
import Distribution.Simple
import Distribution.Simple.Configure
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Program
import Distribution.Simple.Setup
import Distribution.Simple.Utils
import Distribution.Verbosity
import System.Environment

main :: IO ()
main
  = do args <- getArgs
       case args of
           destdir : ipref : ibindir : ilibdir : ilibexecdir
                   : idatadir : idocdir : ihtmldir_copy : ihtmldir_reg
                   : ghcpkg : ghcpkgconf : args' ->
               let verbosity = case args' of
                           [] -> normal
                           ['-':'v':v] ->
                               let m = case v of
                                           "" -> Nothing
                                           _ -> Just v
                               in flagToVerbosity m
                           _ -> error ("Bad arguments: " ++ show args)
               in doit destdir ipref ibindir ilibdir
                       ilibexecdir idatadir idocdir
                       ihtmldir_copy ihtmldir_reg
                       ghcpkg ghcpkgconf verbosity
           _ ->
               error "Missing arguments"

doit :: FilePath -> FilePath -> FilePath -> FilePath -> FilePath
     -> FilePath -> FilePath -> FilePath -> FilePath -> FilePath
     -> FilePath
     -> Verbosity
     -> IO ()
doit destdir ipref ibindir ilibdir ilibexecdir idatadir idocdir
     ihtmldir_copy ihtmldir_reg ghcpkg ghcpkgconf verbosity =
       do let userHooks = simpleUserHooks
              copyto = if null destdir then NoCopyDest else CopyTo destdir
              copyFlags = (emptyCopyFlags copyto) {
                              copyVerbose = verbosity
                          }
              registerFlags = emptyRegisterFlags {
                                  regPackageDB = Just GlobalPackageDB,
                                  regVerbose = verbosity,
                                  regGenScript = False,
                                  regInPlace = False
                              }
          lbi <- getConfig verbosity
          let pd = localPkgDescr lbi
              i = installDirTemplates lbi
              -- XXX This is an almighty hack, shadowing the base
              -- Setup.hs hack
              mkLib filt = case library pd of
                           Just lib ->
                               let ems = filter filt $ exposedModules lib
                               in lib {
                                      exposedModules = ems
                                   }
                           Nothing ->
                               error "Expected a library, but none found"
              -- There's no files for GHC.Prim, so we will fail if we
              -- try to copy them
              pd_copy = pd { library = Just (mkLib ("GHC.Prim" /=)) }
              pd_reg  = pd { library = Just (mkLib (const True)) }
              -- When coying, we need to actually give a concrete
              -- directory to copy to rather than "$topdir"
              i_copy = i { prefixDirTemplate  = toPathTemplate ipref,
                           binDirTemplate     = toPathTemplate ibindir,
                           libDirTemplate     = toPathTemplate ilibdir,
                           libexecDirTemplate = toPathTemplate ilibexecdir,
                           dataDirTemplate    = toPathTemplate idatadir,
                           docDirTemplate     = toPathTemplate idocdir,
                           htmlDirTemplate    = toPathTemplate ihtmldir_copy
                         }
              lbi_copy = lbi { installDirTemplates = i_copy }
              -- When we run GHC we give it a $topdir that includes the
              -- $compiler/lib/ part of libsubdir, so we only want the
              -- $pkgid part in the package.conf file. This is a bit of
              -- a hack, really.
              progs = withPrograms lbi
              prog = ConfiguredProgram {
                         programId = programName ghcPkgProgram,
                         programVersion = Nothing,
                         programArgs = ["--global-conf", ghcpkgconf],
                         programLocation = UserSpecified ghcpkg
                     }
              progs' = updateProgram prog progs
              i_reg = i { prefixDirTemplate  = toPathTemplate ipref,
                          binDirTemplate     = toPathTemplate ibindir,
                          libDirTemplate     = toPathTemplate ilibdir,
                          libexecDirTemplate = toPathTemplate ilibexecdir,
                          dataDirTemplate    = toPathTemplate idatadir,
                          docDirTemplate     = toPathTemplate idocdir,
                          htmlDirTemplate    = toPathTemplate ihtmldir_reg
                        }
              lbi_reg = lbi { installDirTemplates = i_reg,
                              withPrograms = progs' }
          (copyHook simpleUserHooks) pd_copy lbi_copy userHooks copyFlags
          (regHook simpleUserHooks)  pd_reg  lbi_reg  userHooks registerFlags
          return ()

-- Get the build info, merging the setup-config and buildinfo files.
getConfig :: Verbosity -> IO LocalBuildInfo
getConfig verbosity = do
    lbi <- getPersistBuildConfig
    maybe_infoFile <- defaultHookedPackageDesc
    case maybe_infoFile of
        Nothing -> return lbi
        Just infoFile -> do
            hbi <- readHookedBuildInfo verbosity infoFile
            return lbi { localPkgDescr = updatePackageDescription hbi (localPkgDescr lbi)}