diff --git a/Makefile b/Makefile index 33ddbdac8..7a5babd4d 100644 --- a/Makefile +++ b/Makefile @@ -1,24 +1,20 @@ -############################################################################### -# hledger project makefile -# -# This is a reboot of Makefile.old. The old rules are commented out below, +# One of two project scripts files (Makefile, Shake.hs). +# This one is usually the simplest to use. +# It requires GNU Make (https://www.gnu.org/software/make/). +# Also, some rules require: +# - stack (http://haskell-lang.org/get-started, installs libs and runs ghc) +# - shelltestrunner (hackage, runs functional tests) +# - quickbench (hackage/stackage, runs benchmarks) +# - hasktags (hackage, generates tag files for code navigation) +# - profiteur (hackage/stackage, renders profiles as html) +# - hpack (hackage/stackage, generates cabal files from package.yaml files) +# - site/hakyll-std/hakyll-std (generic site-building hakyll script) +# - perl + +# This was a reboot of Makefile.old. The old rules were commented out below, # to be removed or updated over the next while. # -# Users of this makefile: hledger developers, contributors, probably not end-users. -# -# Every user-relevant rule in this makefile should use def-help to define -# a help string. Use "make help" to see the available rules. -# -# Supplementary tools used: -# -# - stack, installs dependencies and drives cabal & ghc -# - shelltestrunner (latest version from hackage or possibly git), runs functional tests -# - quickbench (from git), runs benchmarks -# - hasktags, generates tag files for code navigation -# - profiteur, renders profiles as interactive html -# - hpack, generates cabal files from package.yaml files -# - hakyll-std, my generic site-building hakyll script -# - perl, currently used by a few rules (setversion) +# Target users: hledger developers, contributors, probably not end-users. # # Kinds of hledger builds: # @@ -33,6 +29,9 @@ # This makefile mostly uses stack to get things done (slow but robust). # Secondarily it uses ghc directly to do some developer tasks (faster). # # Also if needed it uses cabal directly for a few tasks. +# +# Every user-relevant rule in this makefile should use def-help to define +# a help string. Use "make help" to see the available rules. # def-help* functions for documenting make rules. See the file for usage. include help-system.mk diff --git a/Shake.hs b/Shake.hs index 87b0667b8..e75f605f7 100755 --- a/Shake.hs +++ b/Shake.hs @@ -3,54 +3,61 @@ --package base-prelude --package directory --package extra - --package here + --package pandoc --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 +One of two project scripts files (Makefile, Shake.hs). +This one provides a stronger programming language and more +platform independence than Make. It will build needed packages (above) +on first run and whenever the resolver in stack.yaml changes. +To minimise such startup delays, and reduce sensitivity to git checkout, +compiling is recommended: ./Shake.hs compile -Shake notes: - wishlist: - just one shake import - wildcards in phony rules - multiple individually accessible wildcards - not having to write :: Action ExitCode after a non-final cmd +It requires stack (https://haskell-lang.org/get-started) and +auto-installs the packages above. Also, some rules require: +- groff +- m4 +- makeinfo +- site/hakyll-std/hakyll-std + +Usage: see below. + +Shake wishes: +just one shake import +wildcards in phony rules +multiple individually accessible wildcards +not having to write :: Action ExitCode after a non-final cmd -} -{-# LANGUAGE PackageImports, QuasiQuotes #-} - +{-# LANGUAGE PackageImports #-} 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 all # generate everything - ./Shake docs # generate general docs - ./Shake website # generate the web site - ./Shake manpages # generate nroff files for man - ./Shake txtmanpages # generate text man pages for embedding - ./Shake infomanpages # generate info files for info - ./Shake webmanpages # generate web man pages for hakyll - ./Shake webmanual # generate combined web man page for hakyll -|] +usage = unlines + ["Usage:" + ,"./Shake.hs compile # compile this script (recommended)" + ,"./Shake # show commands" + ,"./Shake all # generate everything" + ,"./Shake docs # generate general docs" + ,"./Shake website # generate the web site" + ,"./Shake manpages # generate nroff files for man" + ,"./Shake txtmanpages # generate text man pages for embedding" + ,"./Shake infomanpages # generate info files for info" + ,"./Shake webmanpages # generate web man pages for hakyll" + ,"./Shake webmanual # generate combined web man page for hakyll" + ,"./Shake clean # clean generated files" + ,"./Shake Clean # clean harder" + ,"./Shake --help # show options, eg --color" + ] pandoc = "pandoc" -- pandoc from PATH (faster) -- "stack exec -- pandoc" -- pandoc from project's stackage snapshot @@ -80,7 +87,7 @@ main = do "Shake" %> \out -> do need [out <.> "hs"] cmd "stack ghc Shake.hs" :: Action ExitCode - putLoud "Compiled ./Shake, you can now use this instead of ./Shake.hs" + putLoud "You can now run ./Shake instead of ./Shake.hs" phony "all" $ need ["docs", "website"] @@ -191,7 +198,7 @@ main = do -- web site phony "website" $ do - need $ + need $ webmanpages ++ [webmanual ,"releasemanual" @@ -226,7 +233,7 @@ main = do -- adjust and combine man page mds for single-page web output, using pandoc phony "webmanual" $ need [ webmanual ] - webmanual %> \out -> do + webmanual %> \out -> do need webmanpages liftIO $ writeFile webmanual "* toc\n\n" forM_ webmanpages $ \f -> do -- site/hledger.md, site/journal.md