hledger/Shake.hs

151 lines
4.1 KiB
Haskell
Raw Normal View History

#!/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 <-
2016-04-06 01:46:44 +03:00
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
2016-04-06 01:46:44 +03:00
"--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
2016-04-06 01:40:59 +03:00
-- 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"
2016-04-06 01:46:44 +03:00
"--filter doc/pandoc-drop-man-blocks"
"-o" out
2016-04-06 01:40:59 +03:00
phony "pandocfilters" $ need pandocFilters
pandocFilters |%> \out -> do
need [out <.> "hs"]
cmd ("stack "++pandocFiltersResolver++" ghc") out
2016-04-06 01:40:59 +03:00
-- 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 ["//*"]