2 import Distribution.PackageDescription
3 import Distribution.Simple
4 import Distribution.Simple.Configure
5 import Distribution.Simple.LocalBuildInfo
6 import Distribution.Simple.Program
7 import Distribution.Simple.Setup
8 import Distribution.Simple.Utils
9 import Distribution.Verbosity
10 import System.Environment
16 ghcpkg : ghcpkgconf : destdir : topdir :
17 iprefix : ibindir : ilibdir : ilibexecdir :
18 idatadir : idocdir : ihtmldir :
20 let verbosity = case args' of
27 _ -> error ("Bad arguments: " ++ show args)
28 in doit verbosity ghcpkg ghcpkgconf destdir topdir
29 iprefix ibindir ilibdir ilibexecdir idatadir
32 error "Missing arguments"
34 doit :: Verbosity -> FilePath -> FilePath -> FilePath -> FilePath
35 -> FilePath -> FilePath -> FilePath -> FilePath -> FilePath
36 -> FilePath -> FilePath
38 doit verbosity ghcpkg ghcpkgconf destdir topdir
39 iprefix ibindir ilibdir ilibexecdir idatadir idocdir ihtmldir =
40 do let userHooks = simpleUserHooks
41 copyto = if null destdir then NoCopyDest else CopyTo destdir
42 copyFlags = (emptyCopyFlags copyto) {
43 copyVerbose = verbosity
45 registerFlags = emptyRegisterFlags {
46 regPackageDB = Just GlobalPackageDB,
47 regVerbose = verbosity,
51 lbi <- getConfig verbosity
52 let pd = localPkgDescr lbi
53 i = installDirTemplates lbi
54 -- XXX This is an almighty hack, shadowing the base
56 mkLib filt = case library pd of
58 let ems = filter filt $ exposedModules lib
63 error "Expected a library, but none found"
64 -- There's no files for GHC.Prim, so we will fail if we
66 pd_copy = pd { library = Just (mkLib ("GHC.Prim" /=)) }
67 pd_reg = pd { library = Just (mkLib (const True)) }
68 -- When coying, we need to actually give a concrete
69 -- directory to copy to rather than "$topdir"
70 toPathTemplate' = toPathTemplate . replaceTopdir topdir
71 i_copy = i { prefixDirTemplate = toPathTemplate' iprefix,
72 binDirTemplate = toPathTemplate' ibindir,
73 libDirTemplate = toPathTemplate' ilibdir,
74 libexecDirTemplate = toPathTemplate' ilibexecdir,
75 dataDirTemplate = toPathTemplate' idatadir,
76 docDirTemplate = toPathTemplate' idocdir,
77 htmlDirTemplate = toPathTemplate' ihtmldir
79 lbi_copy = lbi { installDirTemplates = i_copy }
80 -- When we run GHC we give it a $topdir that includes the
81 -- $compiler/lib/ part of libsubdir, so we only want the
82 -- $pkgid part in the package.conf file. This is a bit of
84 progs = withPrograms lbi
85 prog = ConfiguredProgram {
86 programId = programName ghcPkgProgram,
87 programVersion = Nothing,
88 programArgs = ["--force", "--global-conf", ghcpkgconf],
89 programLocation = UserSpecified ghcpkg
91 progs' = updateProgram prog progs
92 i_reg = i { prefixDirTemplate = toPathTemplate iprefix,
93 binDirTemplate = toPathTemplate ibindir,
94 libDirTemplate = toPathTemplate ilibdir,
95 libexecDirTemplate = toPathTemplate ilibexecdir,
96 dataDirTemplate = toPathTemplate idatadir,
97 docDirTemplate = toPathTemplate idocdir,
98 htmlDirTemplate = toPathTemplate ihtmldir
100 lbi_reg = lbi { installDirTemplates = i_reg,
101 withPrograms = progs' }
102 (copyHook simpleUserHooks) pd_copy lbi_copy userHooks copyFlags
103 (regHook simpleUserHooks) pd_reg lbi_reg userHooks registerFlags
106 replaceTopdir :: FilePath -> FilePath -> FilePath
107 replaceTopdir topdir ('$':'t':'o':'p':'d':'i':'r':p) = topdir ++ p
108 replaceTopdir _ p = p
110 -- Get the build info, merging the setup-config and buildinfo files.
111 getConfig :: Verbosity -> IO LocalBuildInfo
112 getConfig verbosity = do
113 lbi <- getPersistBuildConfig
114 maybe_infoFile <- defaultHookedPackageDesc
115 case maybe_infoFile of
116 Nothing -> return lbi
118 hbi <- readHookedBuildInfo verbosity infoFile
119 return lbi { localPkgDescr = updatePackageDescription hbi (localPkgDescr lbi)}