11 CABAL_SANDBOX:=.cabal-sandbox
13 GHC_PROF_CATEGORIES:=hc hm hd hy hr hb
15 GHC_PROF_PS_WIDTH:=11in
17 GHC_PROF_CC_LENGTH:=50
18 HCOMPTA_CLI_PROF:=$(CABAL_SANDBOX)/bin/hcompta-prof
19 HCOMPTA_COMMANDS:=balance gl journal
20 HCOMPTA_INTERFACES:=lib cli web
21 commit:=$(shell if which git >/dev/null; then git describe --long; else echo COMMIT; fi)
27 rmw=$(call if_arg,rm,$(wildcard $1))
28 rmdirw=$(call if_arg,rmdir -p --ignore-fail-on-non-empty,$(wildcard $1))
33 install: cabal/install $(HCOMPTA_INTERFACES:=/install)
35 cabal $(CABAL_FLAGS) update $(CABAL_UPDATE_FLAGS)
36 cabal $(CABAL_FLAGS) install -v $(CABAL_INSTALL_FLAGS) cabal
37 .PHONY: $(HCOMPTA_INTERFACES)
38 lib lib/install: cli/unregister web/unregister cli/unregister/sandbox web/unregister/sandbox
39 cabal $(CABAL_FLAGS) install -v $(CABAL_INSTALL_FLAGS) ./lib
41 cabal $(CABAL_FLAGS) install -v $(CABAL_INSTALL_FLAGS) ./cli
43 cabal $(CABAL_FLAGS) install -v $(CABAL_INSTALL_FLAGS) alex happy
44 cabal $(CABAL_FLAGS) install -v $(CABAL_INSTALL_FLAGS) ./web
46 %/recomp: CABAL_INSTALL_FLAGS+=--ghc-options -fforce-recomp
53 clean: lib/clean $(HCOMPTA_INTERFACES:=/clean)
55 (cd lib && cabal clean)
57 (cd cli && cabal clean)
59 (cd web && cabal clean)
64 test: $(HCOMPTA_INTERFACES:=/test)
66 (cd lib && cabal $(CABAL_FLAGS) test --show-details=always $(CABAL_TEST_FLAGS))
68 (cd cli && cabal $(CABAL_FLAGS) test --show-details=always $(CABAL_TEST_FLAGS))
70 (cd web && cabal $(CABAL_FLAGS) test --show-details=always $(CABAL_TEST_FLAGS))
71 %/install/test: CABAL_INSTALL_FLAGS+=--enable-tests
72 %/install/test: %/install
79 doc: doc/xhtml $(HCOMPTA_INTERFACES:=/doc)
80 %/prof: CABAL_INSTALL_FLAGS+=-fprof --enable-library-profiling --enable-executable-profiling
81 %/prof: $(CABAL_SANDBOX) %
85 (cd lib && cabal $(CABAL_FLAGS) haddock --hyperlink-source $(CABAL_HADDOCK_FLAGS))
87 (cd cli && cabal $(CABAL_FLAGS) haddock --hyperlink-source $(CABAL_HADDOCK_FLAGS))
89 (cd web && cabal $(CABAL_FLAGS) haddock --hyperlink-source $(CABAL_HADDOCK_FLAGS))
96 %/dev: CABAL_INSTALL_FLAGS+=-fdev
103 %/dump: CABAL_INSTALL_FLAGS+=-fdump
110 hlint: $(HCOMPTA_INTERFACES:=/hlint.html)
111 %/hlint: %/hlint.html
116 -i 'Redundant bracket' \
118 -i 'Redundant lambda' \
122 -i 'Use string literal' \
123 --quiet --report="$@" \
126 else echo; echo "BROWSE REPORT AT: file://$(abspath $@)"; fi
132 prof: $(addprefix prof/,$(HCOMPTA_COMMANDS))
134 prof/commit/$(commit):
137 lib/install/prof: CABAL_INSTALL_FLAGS+=-fprof --enable-library-profiling
138 lib/install/prof: cli/unregister/sandbox lib/install | $(CABAL_SANDBOX)
141 cli/install/prof: CABAL_INSTALL_FLAGS+=-fprof --enable-library-profiling --enable-executable-profiling
142 cli/install/prof: cli/install | $(CABAL_SANDBOX)
144 $(CABAL_SANDBOX)/bin/hcompta \
145 $(CABAL_SANDBOX)/bin/hcompta-prof
149 prof/clean: prof/$(command)/clean
151 prof/%.ledger/$(command)/clean: \
152 $(foreach hC,$(GHC_PROF_CATEGORIES), \
153 prof/%.ledger/$(command)/$(hC)/clean \
156 prof/$$*.ledger.$(command) \
161 define prof/command/hC
163 prof/$(command): prof/$(command)/$(hC)
164 prof/$(command)/clean: prof/$(command)/$(hC)/clean
165 prof/%.ledger/$(command): prof/%.ledger.$(command)/$(hC)
166 prof/%.ledger/$(command)/$(hC): prof/commit/$$(commit)/%.ledger.$(command).$(hC).ps
169 prof/%.ledger.$(command): \
170 prof/commit/$$(commit)/%.ledger.$(command).$(hC).hs
172 prof/commit/$$(commit)/%.ledger.$(command).$(hC).hp \
173 prof/%.ledger.$(command): \
174 $$(HCOMPTA_CLI_PROF) \
176 | prof/commit/$$(commit)
178 -$(hC)$$(GHC_PROF_$(hC)) \
179 -i$$(GHC_PROF_RATE) \
180 -L$$(GHC_PROF_CC_LENGTH) \
181 -N$$(GHC_PROF_CPUS) \
182 -tprof/commit/$(commit)/$$*.ledger.$(command).$(hC).stats \
185 $$(HCOMPTA_CLI_PROF) $$(HCOMPTA_FLAGS) \
186 $(command) $$(HCOMPTA_COMMAND_FLAGS) $$(filter %.ledger,$$^) \
187 >prof/$$*.ledger.$(command)
188 mv $(notdir $(HCOMPTA_CLI_PROF)).hp prof/commit/$(commit)/$$*.ledger.$(command).$(hC).hp
189 mv $(notdir $(HCOMPTA_CLI_PROF)).prof prof/commit/$(commit)/$$*.ledger.$(command).$(hC).prof
191 prof/$(command)/$(hC): \
192 $(addsuffix /$(command)/$(hC),$(wildcard prof/*.ledger))
193 prof/$(command)/$(hC)/clean:
195 prof/commit/$$(commit)/*.ledger.$(command).$(hC).aux \
196 prof/commit/$$(commit)/*.ledger.$(command).$(hC).hp \
197 prof/commit/$$(commit)/*.ledger.$(command).$(hC).prof \
198 prof/commit/$$(commit)/*.ledger.$(command).$(hC).ps \
199 prof/commit/$$(commit)/*.ledger.$(command).$(hC).stats \
201 prof/%.ledger/$(command)/$(hC)/clean:
203 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).aux \
204 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).hp \
205 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).prof \
206 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).ps \
207 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).stats \
212 prof/%.ledger/clean: \
213 $(foreach command,$(HCOMPTA_COMMANDS), \
214 prof/%.ledger/$(command)/clean )
217 $(foreach command,$(HCOMPTA_COMMANDS), \
218 $(eval $(call prof/command)) \
219 $(foreach hC,$(GHC_PROF_CATEGORIES), \
220 $(eval $(call prof/command/hC)) ))
222 %.hC.hp: $(foreach hC,$(GHC_PROF_CATEGORIES),%.$(hC).hp)
224 %.hC.ps: $(foreach hC,$(GHC_PROF_CATEGORIES),%.$(hC).ps)
227 (cd $(@D) && hp2ps -b -c -e$(GHC_PROF_PS_WIDTH) -g $(notdir $*.hp))
232 %/not-threaded: CABAL_INSTALL_FLAGS+=-f-threaded
239 unregister: $(HCOMPTA_INTERFACES:=/unregister)
242 if $(GHC_PKG) list hcompta-$* | grep -q '^ * hcompta-$*-' ; \
243 then $(GHC_PKG) unregister hcompta-$* ; \
246 %/unregister/sandbox: GHC_PKG:=cabal sandbox hc-pkg
247 %/unregister/sandbox: .
248 if $(GHC_PKG) list hcompta-$* | grep -q '^ * hcompta-$*-' ; \
249 then $(GHC_PKG) unregister hcompta-$* ; \
256 cabal $(CABAL_FLAGS) sandbox --sandbox="$@" $(CABAL_SANDBOX_FLAGS) init
258 %/sandbox: GHC_PKG:=cabal sandbox hc-pkg