makegeddon! makefile simplification and cleanup, including..
- section headings - fewer variables - less unnecessary rebuilding - more standardised sample ledgers and benchmarks (use "make benchtest" now) - more robust profiling - don't symlink tools in top directory
This commit is contained in:
parent
2e46d96402
commit
483cdb8fb2
379
Makefile
379
Makefile
@ -1,45 +1,73 @@
|
||||
# hledger project makefile
|
||||
|
||||
default: tag build
|
||||
TIME=`date +"%Y%m%d%H%M"`
|
||||
|
||||
# patches since last release tag (as a haskell string literal)
|
||||
PATCHES:=$(shell expr `darcs changes --count --from-tag=\\\\\.` - 1)
|
||||
|
||||
# build the normal hledger binary
|
||||
BUILD=ghc --make hledger.hs -o hledger #-O
|
||||
FLAGS=-DPATCHES=$(PATCHES)
|
||||
# optional extras described in README, turn em on if you've got the libs
|
||||
OPTFLAGS= #-DVTY -DHAPPS
|
||||
BUILDFLAGS=$(FLAGS) $(OPTFLAGS)
|
||||
build: setversion
|
||||
@$(BUILD) $(BUILDFLAGS)
|
||||
# optional flags described in README, turn em on if you've got the libs
|
||||
OPTFLAGS=-DHAPPS -DVTY
|
||||
|
||||
# build the fastest binary we can, as hledgeropt
|
||||
BUILDOPT=ghc --make hledger.hs -o hledgeropt -O2 -fvia-C
|
||||
buildopt opt: setversion
|
||||
$(BUILDOPT) $(BUILDFLAGS)
|
||||
BUILDFLAGS=-DPATCHES=$(PATCHES) $(OPTFLAGS)
|
||||
|
||||
# "continuous integration" testing - recompile and run test (or any other
|
||||
# command) whenever a module changes. sp is from searchpath.org , you
|
||||
# might need the patched version from http://joyful.com/repos/searchpath
|
||||
default: tag hledger
|
||||
|
||||
######################################################################
|
||||
# BUILDING, DEBUGGING
|
||||
|
||||
# build the standard developer's binary, quickly
|
||||
hledger: setversion
|
||||
ghc --make hledger.hs -o hledger $(BUILDFLAGS) # -O
|
||||
|
||||
# build the profiling-enabled binary. You may need to cabal install
|
||||
# --reinstall -p some libs.
|
||||
hledgerp: setversion
|
||||
ghc --make hledger.hs -prof -auto-all -o hledgerp #$(BUILDFLAGS)
|
||||
|
||||
# build the fastest binary we can
|
||||
hledgeropt: setversion
|
||||
ghc --make hledger.hs -o hledgeropt -O2 -fvia-C $(BUILDFLAGS)
|
||||
|
||||
# "continuous integration" testing - auto-recompile and run hledger test
|
||||
# (or some other command) whenever a module changes. sp is from
|
||||
# searchpath.org , you might need the patched version from
|
||||
# http://joyful.com/repos/searchpath .
|
||||
#CICMD=web --debug -BE
|
||||
CICMD=test
|
||||
continuous ci: setversion
|
||||
sp --no-exts --no-default-map -o hledger ghc --make hledger.hs $(BUILDFLAGS) --run $(CICMD)
|
||||
|
||||
# force a full rebuild with normal optimisation
|
||||
rebuild: clean build
|
||||
# build the benchmark runner. Requires tabular from hackage.
|
||||
bench:
|
||||
ghc --make tools/bench.hs
|
||||
|
||||
# debug prompt
|
||||
# build the doctest runner
|
||||
tools/doctest: tools/doctest.hs
|
||||
ghc --make tools/doctest.hs
|
||||
|
||||
# build the generateledger tool
|
||||
generateledger: tools/generateledger.hs
|
||||
ghc --make tools/generateledger.hs
|
||||
|
||||
# get a debug prompt
|
||||
ghci:
|
||||
ghci hledger.hs
|
||||
|
||||
# generate a standard profile, archive in profs/ and display
|
||||
PROFCMD=-f 1000x1000x10.ledger balance
|
||||
prof: sampleledgers hledgerp
|
||||
@echo "Profiling $(PROFCMD)"
|
||||
./hledgerp +RTS -p -RTS $(PROFCMD) >/dev/null
|
||||
mv hledgerp.prof profs/$(TIME).prof
|
||||
tools/simplifyprof.hs profs/$(TIME).prof >profs/$(TIME)-cleaned.prof
|
||||
echo; cat profs/$(TIME)-cleaned.prof
|
||||
|
||||
######################################################################
|
||||
# TESTING
|
||||
|
||||
# run all tests
|
||||
test: unittest doctest haddocktest
|
||||
|
||||
# make sure we have no haddock errors
|
||||
haddocktest:
|
||||
@make --quiet haddock
|
||||
|
||||
# run unit tests, without waiting for compilation
|
||||
unittest:
|
||||
runghc hledger.hs test
|
||||
@ -49,60 +77,126 @@ doctest: tools/doctest
|
||||
@tools/doctest AddCommand.hs
|
||||
@tools/doctest Tests.hs
|
||||
|
||||
tools/doctest: tools/doctest.hs
|
||||
ghc --make tools/doctest.hs
|
||||
# make sure we have no haddock errors
|
||||
haddocktest:
|
||||
@make --quiet haddock
|
||||
|
||||
# build profiling-enabled hledgerp and archive and show a cleaned-up profile
|
||||
# you may need to rebuild some libs: sudo cabal install --reinstall -p ...
|
||||
PROFBIN=hledgerp
|
||||
BUILDPROF=ghc $(BUILDFLAGS) --make hledger.hs -prof -auto-all -o $(PROFBIN)
|
||||
RUNPROF=./$(PROFBIN) +RTS -p -RTS
|
||||
PROFCMD=-f 1000.ledger balance
|
||||
TIME=`date +"%Y%m%d%H%M"`
|
||||
buildprof prof: sampleledgers
|
||||
@echo "Profiling $(PROFCMD)"
|
||||
$(BUILDPROF)
|
||||
$(RUNPROF) $(PROFCMD) #>/dev/null
|
||||
tools/simplifyprof.hs $(PROFBIN).prof >profile.prof
|
||||
cp profile.prof profs/$(TIME).prof
|
||||
echo; cat profile.prof
|
||||
|
||||
# run performance benchmarks and save results in profs
|
||||
# executables to test, prepend ./ to these if not in $PATH
|
||||
# requires tabular from hackage
|
||||
#BENCHEXES=hledger-0.1 hledger-0.2 hledger-0.3 hledger-0.4 hledger-0.5 ledger
|
||||
# run performance tests and save results in profs/.
|
||||
# Requires some tests defined in bench.tests and some executables defined below.
|
||||
# Prepend ./ to these if not in $PATH.
|
||||
BENCHEXES=hledger-0.4 hledger-0.5 ledger
|
||||
bench: buildbench sampleledgers
|
||||
./bench $(BENCHEXES) --verbose | tee profs/`date +%Y%m%d%H%M%S`.bench
|
||||
benchtest: sampleledgers bench.tests bench
|
||||
tools/bench $(BENCHEXES) --verbose | tee profs/`date +%Y%m%d%H%M%S`.bench
|
||||
|
||||
# build the benchmarking tool
|
||||
buildbench:
|
||||
ghc --make tools/bench.hs
|
||||
rm -f bench; ln -s tools/bench
|
||||
# generate standard sample ledgers
|
||||
sampleledgers: sample.ledger 100x100x10.ledger 1000x1000x10.ledger 10000x1000x10.ledger \
|
||||
100000x1000x10.ledger 1000.ledger 10000.ledger 100000.ledger 1000x1000x10.ledger
|
||||
|
||||
# generate sample ledgers
|
||||
# XXX should also generate sample.ledger with write_sample_ledger
|
||||
sampleledgers: 1000.ledger 10000.ledger 100000.ledger
|
||||
sample.ledger:
|
||||
true # XXX should probably regenerate this
|
||||
|
||||
1000.ledger:
|
||||
100x100x10.ledger: generateledger
|
||||
tools/generateledger 1000 1000 10 >$@
|
||||
|
||||
1000x1000x10.ledger: generateledger
|
||||
tools/generateledger 1000 1000 10 >$@
|
||||
|
||||
10000x1000x10.ledger: generateledger
|
||||
tools/generateledger 10000 1000 10 >$@
|
||||
|
||||
100000x1000x10.ledger: generateledger
|
||||
tools/generateledger 100000 1000 10 >$@
|
||||
|
||||
# keep for next benchmark report..
|
||||
1000include.ledger:
|
||||
ghc -e 'putStr $$ unlines $$ replicate 1000 "!include sample.ledger"' >1000.ledger
|
||||
|
||||
10000.ledger:
|
||||
10000include.ledger:
|
||||
ghc -e 'putStr $$ unlines $$ replicate 10000 "!include sample.ledger"' >10000.ledger
|
||||
|
||||
100000.ledger:
|
||||
100000include.ledger:
|
||||
ghc -e 'putStr $$ unlines $$ replicate 100000 "!include sample.ledger"' >100000.ledger
|
||||
|
||||
# send unpushed patches to the mail list
|
||||
send:
|
||||
darcs send http://joyful.com/repos/hledger --to=hledger@googlegroups.com --edit-description
|
||||
######################################################################
|
||||
# DOCS
|
||||
|
||||
# push patches to the main repo with ssh
|
||||
push:
|
||||
darcs push joyful.com:/repos/hledger
|
||||
DOCS=README NEWS
|
||||
|
||||
# rebuild all docs
|
||||
docs: pdf api-docs
|
||||
|
||||
# rebuild pdf docs
|
||||
pdf:
|
||||
for d in $(DOCS); do rst2pdf $$d -o doc/$$d.pdf; done
|
||||
|
||||
# rebuild api docs
|
||||
# We munge haddock and hoogle into a rough but useful framed layout.
|
||||
# For this to work the hoogle cgi must be built with base target "main".
|
||||
api-docs: haddock hoogleweb
|
||||
echo "Converting api docs to frames" ; \
|
||||
sed -i -e 's%^></HEAD%><base target="main"></HEAD%' api-doc/modules-index.html ; \
|
||||
cp doc/misc/api-doc-frames.html api-doc/index.html ; \
|
||||
cp doc/misc/hoogle-small.html hoogle
|
||||
|
||||
# build and preview the api docs
|
||||
BROWSER=open
|
||||
view-api-docs: api-docs
|
||||
$(BROWSER) api-doc/index.html
|
||||
|
||||
api-doc-dir:
|
||||
mkdir -p api-doc
|
||||
|
||||
MAIN=hledger.hs
|
||||
|
||||
# --ignore-all-exports here means these are actually implementation docs
|
||||
HADDOCK=haddock -B `ghc --print-libdir` --no-warnings --ignore-all-exports $(subst -D,--optghc=-D,$(BUILDFLAGS))
|
||||
haddock: api-doc-dir hscolour $(MAIN)
|
||||
echo "Generating haddock api docs with source" ; \
|
||||
$(HADDOCK) -o api-doc -h --source-module=src-%{MODULE/./-}.html --source-entity=src-%{MODULE/./-}.html#%N $(filter-out %api-doc-dir hscolour,$^) && \
|
||||
cp api-doc/index.html api-doc/modules-index.html
|
||||
|
||||
HSCOLOUR=HsColour -css
|
||||
hscolour: api-doc-dir
|
||||
echo "Generating colourised source" ; \
|
||||
for f in *hs Ledger/*hs; do \
|
||||
$(HSCOLOUR) -anchor $$f -oapi-doc/`echo "src/"$$f | sed -e's%/%-%g' | sed -e's%\.hs$$%.html%'` ; \
|
||||
done ; \
|
||||
cp api-doc/src-hledger.html api-doc/src-Main.html ; \
|
||||
HsColour -print-css >api-doc/hscolour.css
|
||||
|
||||
#set up the hoogle web interface
|
||||
#uses a hoogle source tree configured with --datadir=., patched to fix haddock urls/target frame
|
||||
HOOGLESRC=/usr/local/src/hoogle
|
||||
HOOGLE=$(HOOGLESRC)/dist/build/hoogle/hoogle
|
||||
HOOGLEVER=`$(HOOGLE) --version |tail -n 1 | sed -e 's/Version /hoogle-/'`
|
||||
hoogleweb: hoogleindex
|
||||
echo "Configuring hoogle web interface" ; \
|
||||
if test -f $(HOOGLE) ; then \
|
||||
mkdir -p hoogle && \
|
||||
cd hoogle && \
|
||||
rm -f $(HOOGLEVER) && \
|
||||
ln -s . $(HOOGLEVER) && \
|
||||
cp -r $(HOOGLESRC)/src/res/ . && \
|
||||
cp -p $(HOOGLE) index.cgi && \
|
||||
touch log.txt && chmod 666 log.txt ; \
|
||||
else \
|
||||
echo "Could not find $(HOOGLE) in the hoogle source tree" ; \
|
||||
fi
|
||||
|
||||
#generate a hoogle index
|
||||
hoogleindex: $(MAIN)
|
||||
echo "Generating hoogle index" ; \
|
||||
mkdir -p hoogle && \
|
||||
$(HADDOCK) -o hoogle --hoogle $^ && \
|
||||
cd hoogle && \
|
||||
hoogle --convert=main.txt --output=default.hoo
|
||||
|
||||
cleandocs:
|
||||
rm -rf api-doc hoogle
|
||||
|
||||
######################################################################
|
||||
# RELEASING
|
||||
|
||||
# version numbering, releasing etc.
|
||||
#
|
||||
# Places where hledger's version number makes an appearance:
|
||||
# hledger --version
|
||||
# hledger's cabal file
|
||||
@ -189,12 +283,59 @@ tagrelease:
|
||||
sdist:
|
||||
cabal sdist
|
||||
|
||||
# display a hackage upload command reminder
|
||||
hackageupload:
|
||||
@echo please do: cabal upload dist/hledger-$(VERSION).tar.gz -v3
|
||||
|
||||
# send unpushed patches to the mail list
|
||||
send:
|
||||
darcs send http://joyful.com/repos/hledger --to=hledger@googlegroups.com --edit-description
|
||||
|
||||
# update emacs TAGS file
|
||||
tag:
|
||||
# push patches to the main repo with ssh
|
||||
push:
|
||||
darcs push joyful.com:/repos/hledger
|
||||
|
||||
# show project stats useful for release notes
|
||||
stats: showlastreleasedate showreleaseauthors showloc showerrors showlocalchanges showreleasechanges bench
|
||||
|
||||
showreleaseauthors:
|
||||
@echo Patch authors since last release:
|
||||
@darcs changes --from-tag . |grep '^\w' |cut -c 31- |sort |uniq
|
||||
@echo
|
||||
|
||||
showloc:
|
||||
@echo Lines of non-test code:
|
||||
@sloccount `ls {,Ledger/}*.hs |grep -v Tests.hs` | grep haskell:
|
||||
@echo Lines of test code:
|
||||
@sloccount Tests.hs | grep haskell:
|
||||
@echo
|
||||
|
||||
showlastreleasedate:
|
||||
@echo Last release date:
|
||||
@darcs changes --from-tag . | tail -2
|
||||
@echo
|
||||
|
||||
showerrors:
|
||||
@echo Known errors:
|
||||
@awk '/^** errors/, /^** / && !/^** errors/' NOTES | grep '^\*\*\* ' | tail +1
|
||||
@echo
|
||||
|
||||
showlocalchanges:
|
||||
@echo Local changes:
|
||||
@-darcs push joyful.com:/repos/hledger --dry-run | grep '*' | tac
|
||||
@echo
|
||||
|
||||
showreleasechanges:
|
||||
@echo "Changes since last release: ("`darcs changes --from-tag . --count`")"
|
||||
@darcs changes --from-tag . | grep '*'
|
||||
@echo
|
||||
|
||||
######################################################################
|
||||
# MISCELLANEOUS
|
||||
|
||||
tag: emacstags
|
||||
|
||||
emacstags:
|
||||
@rm -f TAGS; hasktags -e *hs Ledger/*hs hledger.cabal
|
||||
|
||||
clean:
|
||||
@ -203,109 +344,3 @@ clean:
|
||||
Clean: clean clean-docs
|
||||
rm -f hledger TAGS tags
|
||||
|
||||
# docs
|
||||
|
||||
DOCS=README NEWS
|
||||
|
||||
# rebuild all docs
|
||||
docs: pdf api-docs
|
||||
|
||||
# rebuild pdf docs
|
||||
pdf:
|
||||
for d in $(DOCS); do rst2pdf $$d -o doc/$$d.pdf; done
|
||||
|
||||
# rebuild api docs
|
||||
# We munge haddock and hoogle into a rough but useful framed layout.
|
||||
# For this to work the hoogle cgi must be built with base target "main".
|
||||
api-docs: haddock hoogleweb
|
||||
echo "Converting api docs to frames" ; \
|
||||
sed -i -e 's%^></HEAD%><base target="main"></HEAD%' api-doc/modules-index.html ; \
|
||||
cp doc/misc/api-doc-frames.html api-doc/index.html ; \
|
||||
cp doc/misc/hoogle-small.html hoogle
|
||||
|
||||
# build and preview the api docs
|
||||
BROWSER=open
|
||||
view-api-docs: api-docs
|
||||
$(BROWSER) api-doc/index.html
|
||||
|
||||
api-doc-dir:
|
||||
mkdir -p api-doc
|
||||
|
||||
MAIN=hledger.hs
|
||||
|
||||
# --ignore-all-exports here means these are actually implementation docs
|
||||
HADDOCK=haddock -B `ghc --print-libdir` --no-warnings --ignore-all-exports $(subst -D,--optghc=-D,$(BUILDFLAGS))
|
||||
haddock: api-doc-dir hscolour $(MAIN)
|
||||
echo "Generating haddock api docs with source" ; \
|
||||
$(HADDOCK) -o api-doc -h --source-module=src-%{MODULE/./-}.html --source-entity=src-%{MODULE/./-}.html#%N $(filter-out %api-doc-dir hscolour,$^) && \
|
||||
cp api-doc/index.html api-doc/modules-index.html
|
||||
|
||||
HSCOLOUR=HsColour -css
|
||||
hscolour: api-doc-dir
|
||||
echo "Generating colourised source" ; \
|
||||
for f in *hs Ledger/*hs; do \
|
||||
$(HSCOLOUR) -anchor $$f -oapi-doc/`echo "src/"$$f | sed -e's%/%-%g' | sed -e's%\.hs$$%.html%'` ; \
|
||||
done ; \
|
||||
cp api-doc/src-hledger.html api-doc/src-Main.html ; \
|
||||
HsColour -print-css >api-doc/hscolour.css
|
||||
|
||||
#set up the hoogle web interface
|
||||
#uses a hoogle source tree configured with --datadir=., patched to fix haddock urls/target frame
|
||||
HOOGLESRC=/usr/local/src/hoogle
|
||||
HOOGLE=$(HOOGLESRC)/dist/build/hoogle/hoogle
|
||||
HOOGLEVER=`$(HOOGLE) --version |tail -n 1 | sed -e 's/Version /hoogle-/'`
|
||||
hoogleweb: hoogleindex
|
||||
echo "Configuring hoogle web interface" ; \
|
||||
if test -f $(HOOGLE) ; then \
|
||||
mkdir -p hoogle && \
|
||||
cd hoogle && \
|
||||
rm -f $(HOOGLEVER) && \
|
||||
ln -s . $(HOOGLEVER) && \
|
||||
cp -r $(HOOGLESRC)/src/res/ . && \
|
||||
cp -p $(HOOGLE) index.cgi && \
|
||||
touch log.txt && chmod 666 log.txt ; \
|
||||
else \
|
||||
echo "Could not find $(HOOGLE) in the hoogle source tree" ; \
|
||||
fi
|
||||
|
||||
#generate a hoogle index
|
||||
hoogleindex: $(MAIN)
|
||||
echo "Generating hoogle index" ; \
|
||||
mkdir -p hoogle && \
|
||||
$(HADDOCK) -o hoogle --hoogle $^ && \
|
||||
cd hoogle && \
|
||||
hoogle --convert=main.txt --output=default.hoo
|
||||
|
||||
cleandocs:
|
||||
rm -rf api-doc hoogle
|
||||
|
||||
# misc
|
||||
|
||||
stats: showlastreleasedate showreleaseauthors showloc showerrors showlocalchanges showreleasechanges bench
|
||||
|
||||
showreleaseauthors:
|
||||
@echo Patch authors since last release:
|
||||
@darcs changes --from-tag . |grep '^\w' |cut -c 31- |sort |uniq
|
||||
|
||||
showloc:
|
||||
@echo Lines of non-test code:
|
||||
@sloccount `ls {,Ledger/}*.hs |grep -v Tests.hs` | grep haskell:
|
||||
@echo Lines of test code:
|
||||
@sloccount Tests.hs | grep haskell:
|
||||
|
||||
showlastreleasedate:
|
||||
@echo Last release date:
|
||||
@darcs changes --from-tag . | tail -2
|
||||
|
||||
showerrors:
|
||||
@echo Known errors:
|
||||
@awk '/^** errors/, /^** / && !/^** errors/' NOTES | grep '^\*\*\* ' | tail +1
|
||||
|
||||
showlocalchanges:
|
||||
@echo Changes in local repo:
|
||||
@-darcs push joyful.com:/repos/hledger --dry-run | grep '*' | tac
|
||||
|
||||
showreleasechanges:
|
||||
@echo "Changes since last release: ("`darcs changes --from-tag . --count`")"
|
||||
@darcs changes --from-tag . | grep '*'
|
||||
|
||||
|
||||
13
bench.tests
13
bench.tests
@ -1,8 +1,7 @@
|
||||
# speed tests for tools/bench.hs and "make bench"
|
||||
# tests for "make bench" - one command per line, without the executable
|
||||
|
||||
-f sample.ledger balance
|
||||
-f 1000.ledger balance
|
||||
-f 10000.ledger balance
|
||||
#-f 100000.ledger balance
|
||||
# user's ledger
|
||||
#balance
|
||||
-f 1000.ledger balance # old
|
||||
-f 100x100x10.ledger balance
|
||||
-f 1000x1000x10.ledger balance
|
||||
-f 10000x1000x10.ledger balance
|
||||
#-f 100000x1000x10.ledger balance
|
||||
|
||||
Loading…
Reference in New Issue
Block a user