#!/usr/bin/env stack {- stack runghc --verbosity info --package base-prelude --package directory --package extra --package here --package safe --package shake --package time --package pandoc -} {- Usage: see below. Shake.hs is a more powerful Makefile, providing a number of commands for performing useful tasks. Compiling this script is suggested, so that it runs quicker and will not be affected eg when exploring old code versions. More about Shake: http://shakebuild.com/manual Requires: https://www.haskell.org/downloads#stack Shake notes: notes: unclear: oracles wishlist: wildcards in phony rules multiple individually accessible wildcards just one shake import -} {-# LANGUAGE PackageImports, QuasiQuotes #-} import Prelude () import "base-prelude" BasePrelude -- import "base" System.Console.GetOpt import "extra" Data.List.Extra import "here" Data.String.Here import "safe" Safe import "shake" Development.Shake import "shake" Development.Shake.FilePath import "time" Data.Time import "directory" System.Directory as S (getDirectoryContents) usage = [i|Usage: ./Shake.hs compile # compile this script (optional) ./Shake --help # show options, eg --color ./Shake # show commands ./Shake docs # generate all docs ./Shake manpages # generate nroff files for man ./Shake webmanpages # generate web man pages for hakyll |] buildDir = ".build" pandocExe = "stack exec -- pandoc" -- use the pandoc required above pandocFiltersResolver = "" manpages = [ "hledger_csv.5" ,"hledger_journal.5" ,"hledger_timedot.5" ,"hledger_timelog.5" ,"hledger.1" ,"hledger-api.1" ,"hledger-ui.1" ,"hledger-web.1" ] manpageDir p | '_' `elem` p = "hledger-lib" | otherwise = dropExtension p main = do pandocFilters <- map ("doc" ). nub . sort . map (-<.> "") . filter ("pandoc-" `isPrefixOf`) <$> S.getDirectoryContents "doc" shakeArgs shakeOptions{ shakeFiles=buildDir ,shakeVerbosity=Loud -- ,shakeReport=[".shake.html"] } $ do want ["help"] phony "help" $ liftIO $ putStrLn usage phony "compile" $ need ["Shake"] "Shake" %> \out -> do need ["Shake.hs"] cmd "stack ghc Shake.hs" :: Action ExitCode putLoud "Compiled ./Shake, you can now use this instead of ./Shake.hs" phony "docs" $ need [ "manpages" ,"webmanpages" ] -- docs let manpageNroffs = [manpageDir p p | p <- manpages] webManpageMds = ["site" p <.>".md" | p <- manpages] phony "manpages" $ need manpageNroffs -- man pages converted to nroff, with web-only sections removed manpageNroffs |%> \out -> do let md = out <.> "md" tmpl = "doc/manpage.nroff" need $ md : tmpl : pandocFilters cmd pandocExe md "--to-man -s --template" tmpl "--filter doc/pandoc-drop-web-blocks" "--filter doc/pandoc-drop-html-blocks" "--filter doc/pandoc-drop-html-inlines" "--filter doc/pandoc-drop-links" "--filter doc/pandoc-drop-notes" "--filter doc/pandoc-capitalize-headers" "-o" out phony "webmanpages" $ need webManpageMds -- man pages still as markdown, but with man-only sections removed -- (hakyll does the final rendering) webManpageMds |%> \out -> do let p = dropExtension $ takeFileName out md = manpageDir p p <.> "md" tmpl = "doc/manpage.html" need $ md : tmpl : pandocFilters cmd pandocExe md "--to markdown" "--filter doc/pandoc-drop-man-blocks" "-o" out phony "pandocfilters" $ need pandocFilters pandocFilters |%> \out -> do need [out <.> "hs"] cmd ("stack "++pandocFiltersResolver++" ghc") out -- cleanup phony "clean" $ do putNormal "Cleaning generated files" removeFilesAfter "" manpageNroffs removeFilesAfter "" webManpageMds putNormal "Cleaning object files" removeFilesAfter "doc" ["*.o","*.p_o","*.hi"] putNormal "Cleaning shake build files" removeFilesAfter buildDir ["//*"]