git.iko.soy/typeable/pandoc
on 1.8.1.2 help sign in
typeable/pandoc/Setup.hs
107 lines 4.6 kB history raw
1import Distribution.Simple
2import Distribution.Simple.Setup
3 (copyDest, copyVerbosity, fromFlag, installVerbosity, BuildFlags(..))
4import Distribution.PackageDescription
5 (PackageDescription(..), Executable(..), BuildInfo(..))
6import Distribution.Simple.LocalBuildInfo
7 (LocalBuildInfo(..), absoluteInstallDirs)
8import Distribution.Verbosity ( Verbosity, silent )
9import Distribution.Simple.InstallDirs (mandir, bindir, CopyDest (NoCopyDest))
10import Distribution.Simple.Utils (copyFiles)
11import Control.Exception ( bracket_ )
12import Control.Monad ( unless )
13import System.Process ( rawSystem, runCommand, waitForProcess )
14import System.FilePath ( (</>) )
15import System.Directory
16import System.Exit
17import System.Time
18import System.IO.Error ( isDoesNotExistError )
19import Data.Maybe ( catMaybes )
20import Data.List ( (\\) )
22main :: IO ()
23main = do
24 defaultMainWithHooks $ simpleUserHooks {
25 runTests = runTestSuite
26 , postBuild = makeManPages
27 , postCopy = \ _ flags pkg lbi -> do
28 installManpages pkg lbi (fromFlag $ copyVerbosity flags)
29 (fromFlag $ copyDest flags)
30 installScripts pkg lbi (fromFlag $ copyVerbosity flags)
31 (fromFlag $ copyDest flags)
32 , postInst = \ _ flags pkg lbi -> do
33 installManpages pkg lbi (fromFlag $ installVerbosity flags) NoCopyDest
34 installScripts pkg lbi (fromFlag $ installVerbosity flags) NoCopyDest
35 }
36 exitWith ExitSuccess
38-- | Run test suite.
39runTestSuite :: Args -> Bool -> PackageDescription -> LocalBuildInfo -> IO a
40runTestSuite args _ pkg lbi = do
41 let testDir = buildDir lbi </> "test-pandoc"
42 testDir' <- canonicalizePath testDir
43 let testArgs = "--timeout=5" : concatMap (\arg -> ["-t",arg]) args
44 if any id [buildable (buildInfo exe) | exe <- executables pkg, exeName exe == "test-pandoc"]
45 then inDirectory "tests" $ rawSystem (testDir' </> "test-pandoc") testArgs >>= exitWith
46 else do
47 putStrLn "Build pandoc with the 'tests' flag to run tests"
48 exitWith $ ExitFailure 3
50-- | Build man pages from markdown sources in man/
51makeManPages :: Args -> BuildFlags -> PackageDescription -> LocalBuildInfo -> IO ()
52makeManPages _ flags _ _ = do
53 let verbosity = fromFlag $ buildVerbosity flags
54 ds1 <- modifiedDependencies (manDir </> "man1" </> "pandoc.1")
55 ["README", manDir </> "man1" </> "pandoc.1.template"]
56 ds2 <- modifiedDependencies (manDir </> "man1" </> "markdown2pdf.1")
57 [manDir </> "man1" </> "markdown2pdf.1.md"]
58 ds3 <- modifiedDependencies (manDir </> "man5" </> "pandoc_markdown.5")
59 ["README", manDir </> "man5" </> "pandoc_markdown.5.template"]
60 let cmd = "runghc -package-conf=dist/package.conf.inplace MakeManPage.hs"
61 let cmd' = if verbosity == silent
62 then cmd
63 else cmd ++ " --verbose"
64 -- Don't run MakeManPage.hs unless we have to
65 unless (null ds1 && null ds2 && null ds3) $
66 runCommand cmd' >>= waitForProcess >>= exitWith
68manpages :: [FilePath]
69manpages = ["man1" </> "pandoc.1"
70 ,"man1" </> "markdown2pdf.1"
71 ,"man5" </> "pandoc_markdown.5"]
73manDir :: FilePath
74manDir = "man"
76installScripts :: PackageDescription -> LocalBuildInfo
77 -> Verbosity -> CopyDest -> IO ()
78installScripts pkg lbi verbosity copy =
79 copyFiles verbosity (bindir (absoluteInstallDirs pkg lbi copy))
80 (zip (repeat ".") (wrappers \\ exes))
81 where exes = map exeName $ filter isBuildable $ executables pkg
82 isBuildable = buildable . buildInfo
83 wrappers = ["markdown2pdf"]
85installManpages :: PackageDescription -> LocalBuildInfo
86 -> Verbosity -> CopyDest -> IO ()
87installManpages pkg lbi verbosity copy =
88 copyFiles verbosity (mandir (absoluteInstallDirs pkg lbi copy))
89 (zip (repeat manDir) manpages)
91-- | Returns a list of 'dependencies' that have been modified after 'file'.
92modifiedDependencies :: FilePath -> [FilePath] -> IO [FilePath]
93modifiedDependencies file dependencies = do
94 fileModTime <- catch (getModificationTime file) $
95 \e -> if isDoesNotExistError e
96 then return (TOD 0 0) -- the minimum ClockTime
97 else ioError e
98 depModTimes <- mapM getModificationTime dependencies
99 let modified = zipWith (\dep time -> if time > fileModTime then Just dep else Nothing) dependencies depModTimes
100 return $ catMaybes modified
102-- | Perform an IO action in a directory.
103inDirectory :: FilePath -> IO a -> IO a
104inDirectory dir action = do
105 oldDir <- getCurrentDirectory
106 bracket_ (setCurrentDirectory dir) (setCurrentDirectory oldDir) action