# Makefile for Speculate
#
# Copyright: (c) 2015-2019 Rudy Matela
# License: 3-Clause BSD (see the file LICENSE)
# Maintainer: Rudy Matela <rudy@matela.com.br>
GHCIMPORTDIRS = src:eg:test
GHCFLAGS = -O2 \
$(shell grep -q "Arch Linux" /etc/lsb-release && echo -dynamic)
# -Wall -Wno-name-shadowing -Wno-orphans -Wno-unused-matches
# -prof -auto-all #-caf-all
# When profiling is enabled, to get the cost centres with more than 6% time:
# $ ./eg/arith +RTS -p -RTS
# $ cat arith.prof | grep -v ' [0-5].[0-9] ......$'
HADDOCKFLAGS = --no-print-missing-docs \
$(shell grep -q "Arch Linux" /etc/lsb-release && echo --optghc=-dynamic)
MAXTESTS = 4000
MAXSIZE = -s4
TESTS = \
test/creason \
test/engine \
test/eval \
test/expr \
test/order \
test/reason \
test/utils \
test/stats
EG = \
eg/arith \
eg/arith-negate-abs \
eg/bool \
eg/binarytree \
eg/binarytree0 \
eg/colour \
eg/digraphs \
eg/fun \
eg/list \
eg/length \
eg/zip \
eg/minus \
eg/insertsort \
eg/insertsort0 \
eg/string \
eg/oddeven \
eg/plus-abs \
eg/pretty \
eg/ratio \
eg/sets \
eg/tauts \
eg/monad \
eg/tuples \
eg/speculate-reason \
bench/arithficial \
bench/nord \
bench/unit
EXTRAEG = \
eg/regexes \
eg/pretty-compact \
eg/algebraic-graphs
# regexes needs regex-tdfa, which may break the build
# speculate-reason output differs in different GHC versions
QUICKTESTS = \
test/engine \
test/eval \
test/expr \
test/order \
test/reason
QUICKEG = \
eg/arith \
eg/bool \
eg/list
LIST_ALL_HSS = find src test eg bench/*.hs -name \*.hs
LIST_LIB_HSS = find src -name \*.hs
LIB_DEPS = base leancheck express cmdargs containers
all: mk/toplibs
quick-test: $(patsubst %,%.run,$(QUICKTESTS)) \
$(patsubst %,%.diff-test,$(QUICKEG))
test: all test-sdist \
$(patsubst %,%.run,$(TESTS)) \
$(patsubst %,%.diff-test,$(EG) $(wildcard bench/*-c))
test-with-extra-deps: all test test-sdist \
$(patsubst %,%.diff-test,$(EXTRAEG) $(wildcard bench/*-c))
test-sdist:
./test/sdist
legacy-test:
make clean && make -j8 GHC=ghc-8.2 && make quick-test -j8 GHC=ghc-8.2
make clean && make -j8 GHC=ghc-8.0 && make quick-test -j8 GHC=ghc-8.0
make clean && make -j8 GHC=ghc-7.10 && make quick-test -j8 GHC=ghc-7.10
make clean && make -j8 GHC=ghc-7.8 && make quick-test -j8 GHC=ghc-7.8
make clean && make -j8 && make slow-test -j8
test-via-cabal:
cabal configure --enable-tests --enable-benchmarks --ghc-options="-dynamic -Werror" && cabal build && cabal test
legacy-test-via-cabal:
cabal clean && cabal-ghc-8.2 configure && cabal-ghc-8.2 test
cabal clean && cabal-ghc-8.0 configure && cabal-ghc-8.0 test
cabal clean && cabal-ghc-7.10 configure && cabal-ghc-7.10 test
cabal clean && cabal-ghc-7.8 configure && cabal-ghc-7.8 test
cabal clean && cabal test
prepare-test:
cabal --ignore-sandbox install regex-tdfa cmdargs leancheck algebraic-graphs pretty-compact
prepare-legacy-test: \
prepare-legacy-test-8.2 \
prepare-legacy-test-8.0 \
prepare-legacy-test-7.10 \
prepare-legacy-test-7.8
prepare-legacy-test-8.2:
cabal-ghc-8.2 update
cabal-ghc-8.2 --ignore-sandbox install cmdargs leancheck
prepare-legacy-test-8.0:
cabal-ghc-8.0 update
cabal-ghc-8.0 --ignore-sandbox install cmdargs leancheck
prepare-legacy-test-7.10:
cabal-ghc-7.10 update
cabal-ghc-7.10 --ignore-sandbox install cmdargs-0.10.17 leancheck
prepare-legacy-test-7.8:
cabal-ghc-7.8 update
cabal-ghc-7.8 --ignore-sandbox install cmdargs-0.10.17 leancheck
slow-test: MAXTESTS =
slow-test: MAXSIZE =
slow-test: test
%.run: %
./$< $(MAXTESTS)
bench/%-c.diff-test: eg/%
./test/diff $(MAXSIZE) bench/$*-c
bench/%-c.update-4-diff-test: %
./test/update-diff -s4 bench/$*-c
bench/%-c.update-slow-diff-test: %
./test/update-diff bench/$*-c
%.diff-test: %
./test/diff $(MAXSIZE) $<
%.update-diff-test: %
./test/update-diff -s4 $<
./test/update-diff $<
%.update-4-diff-test: %
./test/update-diff -s4 $<
%.update-slow-diff-test: %
./test/update-diff $<
%.update-7-diff-test: %
./test/update-diff -s7 $<
update-diff-test: update-4-diff-test update-slow-diff-test
update-4-diff-test: $(patsubst %,%.update-4-diff-test,$(EG) $(wildcard bench/*-c))
update-slow-diff-test: $(patsubst %,%.update-slow-diff-test,$(EG) $(wildcard bench/*-c))
bench: all $(EG)
./test/benchmark-cmp $(EG) bench/*-c
save-bench: all $(EG)
./test/benchmark-save $(EG) bench/*-c
memory-benchmark: all $(EG)
./test/memory-benchmark $(EG) bench/*-c
qs-bench:
make -sC bench/qs1 bench
make -sC bench/qs2 bench
qs-save-bench:
make -sC bench/qs1 save-bench
make -sC bench/qs2 save-bench
update-listable-expr:
cp -rav ../express/test/Test/ListableExpr.hs test/Test/
ghci: test/Test.ghci
clean: clean-hi-o clean-haddock
rm -f $(TESTS) $(EG) eg/*.dot eg/*.pdf TAGS tags mk/toplibs
make clean -C bench/qs1
make clean -C bench/qs2
rm -f doc/*.html doc/*.gif doc/*.css doc/*.js doc/*.png
test/Test.o: src/Test/Speculate.o
# NOTE: (very hacky!) the following target allows parallel compilation (-jN) of
# eg and tests programs so long as they don't share dependencies _not_ stored
# in src/ and test/. Runnable binaries should depend on mk/toplibs instead of
# actual Haskell source files
mk/toplibs: src/Test/Speculate.o test/Test.o
touch mk/toplibs
hlint:
hlint \
--ignore "Use import/export shortcut" \
--ignore "Use first" \
--ignore "Use second" \
--ignore "Use ***" \
src bench tests
include mk/haskell.mk
%-3.dot: %
./$< -gv3 > $@
%.dot: %
./$< -gv2 > $@
%-2.dot: %
./$< -gv2 > $@
%-1.dot: %
./$< -gv1 > $@
%.eps: %.dot
dot -Teps $< > $@
%.pdf: %.eps
epstopdf $<
.PHONY: %.view
%.view: %.pdf
o $<