@@ -1,20 +1,28 @@
2\begin{code}
1\begin{code}
3−{-# OPTIONS_GHC -Wall #-}
2+{-# LANGUAGE CPP #-}
3+#ifndef MIN_VERSION_Cabal
4+#define MIN_VERSION_Cabal(x,y,z) 0
4module Main (main) where
6module Main (main) where
6import Data.List ( nub )
8import Data.List ( nub )
7−import Data.Version ( showVersion )
9+import Distribution.Package ( InstalledPackageId )
8−import Distribution.Package ( PackageName(PackageName), PackageId, InstalledPackageId, packageVersion, packageName )
10+import Distribution.Package ( PackageId, Package (..), packageVersion, packageName )
9import Distribution.PackageDescription ( PackageDescription(), TestSuite(..) )
11import Distribution.PackageDescription ( PackageDescription(), TestSuite(..) )
10import Distribution.Simple ( defaultMainWithHooks, UserHooks(..), simpleUserHooks )
12import Distribution.Simple ( defaultMainWithHooks, UserHooks(..), simpleUserHooks )
11−import Distribution.Simple.Utils ( rewriteFile, createDirectoryIfMissingVerbose )
13+import Distribution.Simple.Utils ( rewriteFile, createDirectoryIfMissingVerbose, copyFiles )
12import Distribution.Simple.BuildPaths ( autogenModulesDir )
14import Distribution.Simple.BuildPaths ( autogenModulesDir )
13−import Distribution.Simple.Setup ( BuildFlags(buildVerbosity), fromFlag )
15+import Distribution.Simple.Setup ( BuildFlags(buildVerbosity), Flag(..), fromFlag, HaddockFlags(haddockDistPref))
14−import Distribution.Simple.LocalBuildInfo ( withLibLBI, withTestLBI, LocalBuildInfo(), ComponentLocalBuildInfo(componentPackageDeps) )
16+import Distribution.Simple.LocalBuildInfo ( withLibLBI, withTestLBI, LocalBuildInfo(), ComponentLocalBuildInfo(componentPackageDeps), compiler, buildDir )
17+import Distribution.Simple.Compiler ( showCompilerId )
15−import Distribution.Verbosity ( Verbosity )
18+import Distribution.Text ( display , simpleParse )
19+import Distribution.Verbosity ( Verbosity, normal )
16import System.FilePath ( (</>) )
20import System.FilePath ( (</>) )
22+#if MIN_VERSION_Cabal(1,25,0)
23+import Distribution.Simple.BuildPaths ( autogenComponentModulesDir )
18main :: IO ()
26main :: IO ()
19main = defaultMainWithHooks simpleUserHooks
27main = defaultMainWithHooks simpleUserHooks
20 { buildHook = \pkg lbi hooks flags -> do
28 { buildHook = \pkg lbi hooks flags -> do
@@ -22,25 +30,62 @@ main = defaultMainWithHooks simpleUserHooks
22 buildHook simpleUserHooks pkg lbi hooks flags
30 buildHook simpleUserHooks pkg lbi hooks flags
33+haddockOutputDir :: Package p => HaddockFlags -> p -> FilePath
34+haddockOutputDir flags pkg = destDir where
35+ baseDir = case haddockDistPref flags of
38+ destDir = baseDir </> "doc" </> "html" </> display (packageName pkg)
25generateBuildModule :: Verbosity -> PackageDescription -> LocalBuildInfo -> IO ()
40generateBuildModule :: Verbosity -> PackageDescription -> LocalBuildInfo -> IO ()
26generateBuildModule verbosity pkg lbi = do
41generateBuildModule verbosity pkg lbi = do
27 let dir = autogenModulesDir lbi
42 let dir = autogenModulesDir lbi
43+ let bdir = buildDir lbi
28 createDirectoryIfMissingVerbose verbosity True dir
44 createDirectoryIfMissingVerbose verbosity True dir
29 withLibLBI pkg lbi $ \_ libcfg -> do
45 withLibLBI pkg lbi $ \_ libcfg -> do
46+ -- We need the directory with library's cabal_macros.h!
47+#if MIN_VERSION_Cabal(1,25,0)
48+ let dir2 = autogenComponentModulesDir lbi libcfg
30 withTestLBI pkg lbi $ \suite suitecfg -> do
52 withTestLBI pkg lbi $ \suite suitecfg -> do
53+ -- when (testName suite == "doctest") $ we need IsString instance
31− rewriteFile (dir </> "Build_" ++ testName suite ++ ".hs") $ unlines
54+ rewriteFile (dir </> "Build_doctests.hs") $ unlines
32− [ "module Build_" ++ testName suite ++ " where"
55+ [ "module Build_doctests where"
34 , "autogen_dir :: String"
57 , "autogen_dir :: String"
35 , "autogen_dir = " ++ show dir
58 , "autogen_dir = " ++ show dir
60+ , "component_autogen_dir :: String"
61+ , "component_autogen_dir = " ++ show dir2
63+ , "build_dir :: String"
64+ , "build_dir = " ++ show bdir
66+ -- -package-id etc. flags
37− , "deps :: [String]"
67+ , "pkgs :: [String]"
38− , "deps = " ++ (show $ formatdeps (testDeps libcfg suitecfg))
68+ , "pkgs = " ++ (show $ formatDeps $ testDeps libcfg suitecfg)
70+ , "compiler :: String"
71+ , "compiler = " ++ (show $ showCompilerId $ compiler lbi)
73+ , "isOldCompiler :: Bool"
74+ , "isOldCompiler = " ++ show isOldCompiler
41− formatdeps = map (formatone . snd)
77+ -- we do this check in Setup, as then doctests don't need to depend on Cabal
42− formatone p = case packageName p of
78+ isOldCompiler = maybe False id $ do
79+ a <- simpleParse $ showCompilerId $ compiler lbi
80+ b <- simpleParse "7.5"
43− PackageName n -> n ++ "-" ++ showVersion (packageVersion p)
81+ return $ packageVersion (a :: PackageId) < b
83+ formatDeps = map formatOne
84+ formatOne (installedPkgId, pkgId)
85+ -- The problem is how different cabal executables handle package databases
86+ -- when doctests depend on the library
87+ | packageId pkg == pkgId = "-package=" ++ display pkgId
88+ | otherwise = "-package-id=" ++ display installedPkgId
45testDeps :: ComponentLocalBuildInfo -> ComponentLocalBuildInfo -> [(InstalledPackageId, PackageId)]
90testDeps :: ComponentLocalBuildInfo -> ComponentLocalBuildInfo -> [(InstalledPackageId, PackageId)]
46testDeps xs ys = nub $ componentPackageDeps xs ++ componentPackageDeps ys
91testDeps xs ys = nub $ componentPackageDeps xs ++ componentPackageDeps ys