|
1 | | -import Distribution.Simple |
2 | | -main = defaultMain |
| 1 | +module Main (main) where |
| 2 | + |
| 3 | +import Data.List ( nub, sortBy ) |
| 4 | +import Data.Ord ( comparing ) |
| 5 | +import Data.Version ( showVersion ) |
| 6 | +import Distribution.Package ( PackageName(PackageName), PackageId, InstalledPackageId, packageVersion, packageName ) |
| 7 | +import Distribution.PackageDescription ( PackageDescription(), TestSuite(..), Executable(..) ) |
| 8 | +import Distribution.Simple ( defaultMainWithHooks, UserHooks(..), simpleUserHooks ) |
| 9 | +import Distribution.Simple.Utils ( rewriteFile, createDirectoryIfMissingVerbose ) |
| 10 | +import Distribution.Simple.BuildPaths ( autogenModulesDir ) |
| 11 | +import Distribution.Simple.Setup ( BuildFlags(buildVerbosity), fromFlag ) |
| 12 | +import Distribution.Simple.LocalBuildInfo ( withLibLBI, withTestLBI, withExeLBI, LocalBuildInfo(), ComponentLocalBuildInfo(componentPackageDeps) ) |
| 13 | +import Distribution.Verbosity ( Verbosity ) |
| 14 | +import System.FilePath ( (</>) ) |
| 15 | + |
| 16 | +main :: IO () |
| 17 | +main = defaultMainWithHooks simpleUserHooks |
| 18 | + { buildHook = \pkg lbi hooks flags -> do |
| 19 | + generateBuildModule (fromFlag (buildVerbosity flags)) pkg lbi |
| 20 | + buildHook simpleUserHooks pkg lbi hooks flags |
| 21 | + } |
| 22 | + |
| 23 | +generateBuildModule :: Verbosity -> PackageDescription -> LocalBuildInfo -> IO () |
| 24 | +generateBuildModule verbosity pkg lbi = do |
| 25 | + let dir = autogenModulesDir lbi |
| 26 | + createDirectoryIfMissingVerbose verbosity True dir |
| 27 | + withLibLBI pkg lbi $ \_ libcfg -> do |
| 28 | + withTestLBI pkg lbi $ \suite clbi -> |
| 29 | + rewriteFile (dir </> "Build_" ++ testName suite ++ ".hs") $ unlines |
| 30 | + [ "module Build_" ++ testName suite ++ " where" |
| 31 | + , "" |
| 32 | + , "autogen_dir :: String" |
| 33 | + , "autogen_dir = " ++ show dir |
| 34 | + , "" |
| 35 | + , "deps :: [String]" |
| 36 | + , "deps = " ++ (show $ formatdeps (testDeps libcfg clbi)) |
| 37 | + ] |
| 38 | + withExeLBI pkg lbi $ \exe clbi -> |
| 39 | + rewriteFile (dir </> "Build_" ++ exeName exe ++ ".hs") $ unlines |
| 40 | + [ "module Build_" ++ exeName exe ++ " where" |
| 41 | + , "" |
| 42 | + , "deps :: [String]" |
| 43 | + , "deps = " ++ (show $ formatdeps (testDeps libcfg clbi)) |
| 44 | + ] |
| 45 | + where |
| 46 | + formatdeps = map formatone . sortBy (comparing unPackageName') . map snd |
| 47 | + formatone p = unPackageName' p ++ "-" ++ showVersion (packageVersion p) |
| 48 | + unPackageName' p = case packageName p of PackageName n -> n |
| 49 | + |
| 50 | +testDeps :: ComponentLocalBuildInfo -> ComponentLocalBuildInfo -> [(InstalledPackageId, PackageId)] |
| 51 | +testDeps xs ys = nub $ componentPackageDeps xs ++ componentPackageDeps ys |
0 commit comments