import Distribution.PackageDescription ( PackageDescription(..) )
import Distribution.Simple
import Distribution.Simple.InstallDirs ( docdir, mandir, CopyDest (NoCopyDest) )
import Distribution.Simple.LocalBuildInfo ( LocalBuildInfo(..), absoluteInstallDirs )
import Distribution.Simple.Program.Db ( ProgramDb, lookupProgram )
import Distribution.Simple.Program.Run ( runProgramInvocation, programInvocation, progInvokeCwd )
import Distribution.Simple.Program.Types ( ConfiguredProgram, simpleProgram )
import Distribution.Simple.Setup ( copyDest, copyVerbosity, fromFlag, installVerbosity, haddockVerbosity )
import Distribution.Simple.Utils ( installOrdinaryFile, installOrdinaryFiles, notice )
import Distribution.Verbosity ( Verbosity, moreVerbose )
import System.Exit ( exitSuccess )
import System.FilePath ( splitDirectories, joinPath, takeExtension, replaceExtension, (</>) )
import System.Directory ( getCurrentDirectory, setCurrentDirectory, createDirectoryIfMissing, doesFileExist )
main :: IO ()
main = do
defaultMainWithHooks $ simpleUserHooks
{ postCopy = \ _ flags pkg lbi ->
installManpages pkg lbi (fromFlag $ copyVerbosity flags) (fromFlag $ copyDest flags)
, postInst = \ _ flags pkg lbi ->
installManpages pkg lbi (fromFlag $ installVerbosity flags) NoCopyDest
, postHaddock = \ _ flags pkg lbi ->
runPdflatex pkg lbi (fromFlag $ haddockVerbosity flags)
, hookedPrograms = [ simpleProgram "pdflatex" ]
}
exitSuccess
installManpages :: PackageDescription -> LocalBuildInfo -> Verbosity -> CopyDest -> IO ()
installManpages pkg lbi verbosity copy = do
installOrdinaryFiles verbosity (mandir (absoluteInstallDirs pkg lbi copy))
[ ("man", joinPath mp) | ("man":mp) <- map splitDirectories $ extraSrcFiles pkg ]
installOrdinaryFiles' verbosity (docdir (absoluteInstallDirs pkg lbi copy))
[ (buildDir lbi </> "latex", replaceExtension (last p) "pdf")
| ("doc":p@(_:_)) <- map splitDirectories $ extraSrcFiles pkg
, takeExtension (last p) == ".tex" ]
installOrdinaryFiles' :: Verbosity -> FilePath -> [(FilePath, FilePath)] -> IO ()
installOrdinaryFiles' verb dest = mapM_ (uncurry go)
where
go base src = do e <- doesFileExist (base </> src)
if e then installOrdinaryFile verb (base </> src) (dest </> src)
else notice verb $ show (base </> src) ++ " was not built, can't install."
withLatex :: LocalBuildInfo -> (ConfiguredProgram -> IO ()) -> IO ()
withLatex lbi k = maybe (return ()) k $ lookupProgram (simpleProgram "pdflatex") $ withPrograms lbi
runPdflatex :: PackageDescription -> LocalBuildInfo -> Verbosity -> IO ()
runPdflatex pkg lbi verb =
withLatex lbi $ \cmd -> do
cwd <- getCurrentDirectory
createDirectoryIfMissing True (buildDir lbi </> "latex")
sequence_ [ runProgramInvocation (moreVerbose verb) $
(programInvocation cmd [ "-interaction=nonstopmode", cwd </> joinPath ("doc":f) ])
{ progInvokeCwd = Just (buildDir lbi </> "latex") }
| ("doc":f@(_:_)) <- map splitDirectories $ extraSrcFiles pkg
, takeExtension (last f) == ".tex" ]