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-cli-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)
114 -i 'Redundant bracket' \
116 -i 'Redundant lambda' \
120 -i 'Use string literal' \
121 --quiet --report="$@" \
122 "$*"/Hcompta && rm -f "$@"
128 prof: $(addprefix prof/,$(HCOMPTA_COMMANDS))
130 prof/commit/$(commit):
133 lib/install/prof: CABAL_INSTALL_FLAGS+=-fprof --enable-library-profiling
134 lib/install/prof: cli/unregister/sandbox lib/install | $(CABAL_SANDBOX)
137 cli/install/prof: CABAL_INSTALL_FLAGS+=-fprof --enable-library-profiling --enable-executable-profiling
138 cli/install/prof: cli/install | $(CABAL_SANDBOX)
140 $(CABAL_SANDBOX)/bin/hcompta-cli \
141 $(CABAL_SANDBOX)/bin/hcompta-cli-prof
145 prof/clean: prof/$(command)/clean
147 prof/%.ledger/$(command)/clean: \
148 $(foreach hC,$(GHC_PROF_CATEGORIES), \
149 prof/%.ledger/$(command)/$(hC)/clean \
152 prof/$$*.ledger.$(command) \
157 define prof/command/hC
159 prof/$(command): prof/$(command)/$(hC)
160 prof/$(command)/clean: prof/$(command)/$(hC)/clean
161 prof/%.ledger/$(command): prof/%.ledger.$(command)/$(hC)
162 prof/%.ledger/$(command)/$(hC): prof/commit/$$(commit)/%.ledger.$(command).$(hC).ps
165 prof/%.ledger.$(command): \
166 prof/commit/$$(commit)/%.ledger.$(command).$(hC).hs
168 prof/commit/$$(commit)/%.ledger.$(command).$(hC).hp \
169 prof/%.ledger.$(command): \
170 $$(HCOMPTA_CLI_PROF) \
172 | prof/commit/$$(commit)
174 -$(hC)$$(GHC_PROF_$(hC)) \
175 -i$$(GHC_PROF_RATE) \
176 -L$$(GHC_PROF_CC_LENGTH) \
177 -N$$(GHC_PROF_CPUS) \
178 -tprof/commit/$(commit)/$$*.ledger.$(command).$(hC).stats \
181 $$(HCOMPTA_CLI_PROF) $$(HCOMPTA_FLAGS) \
182 $(command) $$(HCOMPTA_COMMAND_FLAGS) $$(filter %.ledger,$$^) \
183 >prof/$$*.ledger.$(command)
184 mv $(notdir $(HCOMPTA_CLI_PROF)).hp prof/commit/$(commit)/$$*.ledger.$(command).$(hC).hp
185 mv $(notdir $(HCOMPTA_CLI_PROF)).prof prof/commit/$(commit)/$$*.ledger.$(command).$(hC).prof
187 prof/$(command)/$(hC): \
188 $(addsuffix /$(command)/$(hC),$(wildcard prof/*.ledger))
189 prof/$(command)/$(hC)/clean:
191 prof/commit/$$(commit)/*.ledger.$(command).$(hC).aux \
192 prof/commit/$$(commit)/*.ledger.$(command).$(hC).hp \
193 prof/commit/$$(commit)/*.ledger.$(command).$(hC).prof \
194 prof/commit/$$(commit)/*.ledger.$(command).$(hC).ps \
195 prof/commit/$$(commit)/*.ledger.$(command).$(hC).stats \
197 prof/%.ledger/$(command)/$(hC)/clean:
199 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).aux \
200 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).hp \
201 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).prof \
202 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).ps \
203 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).stats \
208 prof/%.ledger/clean: \
209 $(foreach command,$(HCOMPTA_COMMANDS), \
210 prof/%.ledger/$(command)/clean )
213 $(foreach command,$(HCOMPTA_COMMANDS), \
214 $(eval $(call prof/command)) \
215 $(foreach hC,$(GHC_PROF_CATEGORIES), \
216 $(eval $(call prof/command/hC)) ))
218 %.hC.hp: $(foreach hC,$(GHC_PROF_CATEGORIES),%.$(hC).hp)
220 %.hC.ps: $(foreach hC,$(GHC_PROF_CATEGORIES),%.$(hC).ps)
223 (cd $(@D) && hp2ps -b -c -e$(GHC_PROF_PS_WIDTH) -g $(notdir $*.hp))
228 %/not-threaded: CABAL_INSTALL_FLAGS+=-f-threaded
235 unregister: $(HCOMPTA_INTERFACES:=/unregister)
238 if $(GHC_PKG) list hcompta-$* | grep -q '^ * hcompta-$*-' ; \
239 then $(GHC_PKG) unregister hcompta-$* ; \
242 %/unregister/sandbox: GHC_PKG:=cabal sandbox hc-pkg
243 %/unregister/sandbox: .
244 if $(GHC_PKG) list hcompta-$* | grep -q '^ * hcompta-$*-' ; \
245 then $(GHC_PKG) unregister hcompta-$* ; \
252 cabal $(CABAL_FLAGS) sandbox --sandbox="$@" $(CABAL_SANDBOX_FLAGS) init
254 %/sandbox: GHC_PKG:=cabal sandbox hc-pkg