Follow changes in Cabal
[ghc-hetmet.git] / libraries / installPackage.hs
1
2 import Distribution.PackageDescription
3 import Distribution.PackageDescription.Parse
4 import Distribution.ReadE
5 import Distribution.Simple
6 import Distribution.Simple.Configure
7 import Distribution.Simple.LocalBuildInfo
8 import Distribution.Simple.Program
9 import Distribution.Simple.Setup
10 import Distribution.Simple.Utils
11 import Distribution.Verbosity
12 import System.Environment
13
14 main :: IO ()
15 main
16   = do args <- getArgs
17        case args of
18            "register" : "--inplace" :args' ->
19                let verbosity = mkVerbosity args'
20                in doRegisterInplace verbosity
21            "install" : ghcpkg : ghcpkgconf : destdir : topdir :
22                     iprefix : ibindir : ilibdir : ilibexecdir : idynlibdir :
23                     idatadir : idocdir : ihtmldir : ihaddockdir :
24                     args' ->
25                let verbosity = mkVerbosity args'
26                in doInstall verbosity ghcpkg ghcpkgconf destdir topdir
27                             iprefix ibindir ilibdir ilibexecdir idynlibdir idatadir
28                             idocdir ihtmldir ihaddockdir
29            _ ->
30                error ("Bad arguments: " ++ show args)
31
32 mkVerbosity :: [String] -> Verbosity
33 mkVerbosity [] = normal
34 mkVerbosity ['-':'v':v] = readEOrFail flagToVerbosity v
35 mkVerbosity args = error ("Bad arguments: " ++ show args)
36
37 doRegisterInplace :: Verbosity -> IO ()
38 doRegisterInplace verbosity =
39        do lbi <- getConfig verbosity
40           let registerFlags = defaultRegisterFlags { regInPlace = toFlag True }
41               pd = localPkgDescr lbi
42               pd_reg = if pkgName (package pd) == "ghc-prim"
43                        then case library pd of
44                             Just lib ->
45                                 let ems = "GHC.Prim" : exposedModules lib
46                                     lib' = lib { exposedModules = ems }
47                                 in pd { library = Just lib' }
48                             Nothing ->
49                                 error "Expected a library, but none found"
50                        else pd
51           (regHook simpleUserHooks) pd_reg lbi simpleUserHooks registerFlags
52           return ()
53
54 doInstall :: Verbosity -> FilePath -> FilePath -> FilePath -> FilePath
55           -> FilePath -> FilePath -> FilePath -> FilePath -> FilePath
56           -> FilePath -> FilePath -> FilePath -> FilePath
57           -> IO ()
58 doInstall verbosity ghcpkg ghcpkgconf destdir topdir
59      iprefix ibindir ilibdir ilibexecdir idynlibdir idatadir
60      idocdir ihtmldir ihaddockdir =
61        do let userHooks = simpleUserHooks
62               copyto = if null destdir then NoCopyDest else CopyTo destdir
63               copyFlags = defaultCopyFlags {
64                               copyDest = toFlag copyto,
65                               copyVerbosity = toFlag verbosity
66                           }
67               registerFlags = defaultRegisterFlags {
68                                   regPackageDB = toFlag GlobalPackageDB,
69                                   regVerbosity = toFlag verbosity,
70                                   regGenScript = toFlag $ False,
71                                   regInPlace = toFlag $ False
72                               }
73           lbi <- getConfig verbosity
74           let pd = localPkgDescr lbi
75               i = installDirTemplates lbi
76               -- This is an almighty hack. We need to register
77               -- ghc-prim:GHC.Prim, but it doesn't exist, get built, get
78               -- haddocked, get copied, etc.
79               pd_reg = if pkgName (package pd) == "ghc-prim"
80                        then case library pd of
81                             Just lib ->
82                                 let ems = "GHC.Prim" : exposedModules lib
83                                     lib' = lib { exposedModules = ems }
84                                 in pd { library = Just lib' }
85                             Nothing ->
86                                 error "Expected a library, but none found"
87                        else pd
88               -- When coying, we need to actually give a concrete
89               -- directory to copy to rather than "$topdir"
90               toPathTemplate' = toPathTemplate . replaceTopdir topdir
91               i_copy = i { prefix       = toPathTemplate' iprefix,
92                            bindir       = toPathTemplate' ibindir,
93                            libdir       = toPathTemplate' ilibdir,
94                            dynlibdir    = toPathTemplate' idynlibdir,
95                            libexecdir   = toPathTemplate' ilibexecdir,
96                            datadir      = toPathTemplate' idatadir,
97                            docdir       = toPathTemplate' idocdir,
98                            htmldir      = toPathTemplate' ihtmldir,
99                            haddockdir   = toPathTemplate' ihaddockdir
100                          }
101               lbi_copy = lbi { installDirTemplates = i_copy }
102               -- When we run GHC we give it a $topdir that includes the
103               -- $compiler/lib/ part of libsubdir, so we only want the
104               -- $pkgid part in the package.conf file. This is a bit of
105               -- a hack, really.
106               progs = withPrograms lbi
107               prog = ConfiguredProgram {
108                          programId = programName ghcPkgProgram,
109                          programVersion = Nothing,
110                          programArgs = ["--force", "--global-conf", ghcpkgconf],
111                          programLocation = UserSpecified ghcpkg
112                      }
113               progs' = updateProgram prog progs
114               i_reg = i { prefix       = toPathTemplate iprefix,
115                           bindir       = toPathTemplate ibindir,
116                           libdir       = toPathTemplate ilibdir,
117                           dynlibdir    = toPathTemplate idynlibdir,
118                           libexecdir   = toPathTemplate ilibexecdir,
119                           datadir      = toPathTemplate idatadir,
120                           docdir       = toPathTemplate idocdir,
121                           htmldir      = toPathTemplate ihtmldir,
122                           haddockdir   = toPathTemplate ihaddockdir
123                         }
124               lbi_reg = lbi { installDirTemplates = i_reg,
125                               withPrograms = progs' }
126           (copyHook simpleUserHooks) pd     lbi_copy userHooks copyFlags
127           (regHook simpleUserHooks)  pd_reg lbi_reg  userHooks registerFlags
128           return ()
129
130 replaceTopdir :: FilePath -> FilePath -> FilePath
131 replaceTopdir topdir ('$':'t':'o':'p':'d':'i':'r':p) = topdir ++ p
132 replaceTopdir topdir ('$':'h':'t':'t':'p':'t':'o':'p':'d':'i':'r':p)
133     = topdir ++ p
134 replaceTopdir _ p = p
135
136 -- Get the build info, merging the setup-config and buildinfo files.
137 getConfig :: Verbosity -> IO LocalBuildInfo
138 getConfig verbosity = do
139     lbi <- getPersistBuildConfig
140     maybe_infoFile <- defaultHookedPackageDesc
141     case maybe_infoFile of
142         Nothing -> return lbi
143         Just infoFile -> do
144             hbi <- readHookedBuildInfo verbosity infoFile
145             return lbi { localPkgDescr = updatePackageDescription hbi (localPkgDescr lbi)}
146
147