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
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 lib/install cli/install web/install
35 cabal $(CABAL_FLAGS) update $(CABAL_UPDATE_FLAGS)
36 cabal $(CABAL_FLAGS) install -v $(CABAL_INSTALL_FLAGS) cabal
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 cli/clean web/clean doc/clean
55 (cd lib && cabal clean)
57 (cd cli && cabal clean)
59 (cd web && cabal clean)
64 test: lib/test cli/test web/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 lib/doc cli/doc web/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
111 prof: $(foreach command,$(HCOMPTA_COMMANDS),prof/$(command))
113 prof/commit/$(commit):
116 lib/install/prof: CABAL_INSTALL_FLAGS+=-fprof --enable-library-profiling
117 lib/install/prof: cli/unregister/sandbox lib/install | $(CABAL_SANDBOX)
120 cli/install/prof: CABAL_INSTALL_FLAGS+=-fprof --enable-library-profiling --enable-executable-profiling
121 cli/install/prof: cli/install | $(CABAL_SANDBOX)
123 $(CABAL_SANDBOX)/bin/hcompta-cli \
124 $(CABAL_SANDBOX)/bin/hcompta-cli-prof
128 prof/clean: prof/$(command)/clean
130 prof/%.ledger/$(command)/clean: \
131 $(foreach hC,$(GHC_PROF_CATEGORIES), \
132 prof/%.ledger/$(command)/$(hC)/clean \
135 prof/$$*.ledger.$(command) \
140 define prof/command/hC
142 prof/$(command): prof/$(command)/$(hC)
143 prof/$(command)/clean: prof/$(command)/$(hC)/clean
144 prof/%.ledger/$(command): prof/%.ledger.$(command)/$(hC)
145 prof/%.ledger/$(command)/$(hC): prof/commit/$$(commit)/%.ledger.$(command).$(hC).ps
148 prof/%.ledger.$(command): \
149 prof/commit/$$(commit)/%.ledger.$(command).$(hC).hs
151 prof/commit/$$(commit)/%.ledger.$(command).$(hC).hp \
152 prof/%.ledger.$(command): \
153 $$(HCOMPTA_CLI_PROF) \
155 | prof/commit/$$(commit)
157 -$(hC)$$(GHC_PROF_$(hC)) \
158 -i$$(GHC_PROF_RATE) \
159 -L$$(GHC_PROF_CC_LENGTH) \
160 -N$$(GHC_PROF_CPUS) \
161 -tprof/commit/$(commit)/$$*.ledger.$(command).$(hC).stats \
164 $$(HCOMPTA_CLI_PROF) $$(HCOMPTA_FLAGS) \
165 $(command) $$(HCOMPTA_COMMAND_FLAGS) $$(filter %.ledger,$$^) \
166 >prof/$$*.ledger.$(command)
167 mv $(notdir $(HCOMPTA_CLI_PROF)).hp prof/commit/$(commit)/$$*.ledger.$(command).$(hC).hp
168 mv $(notdir $(HCOMPTA_CLI_PROF)).prof prof/commit/$(commit)/$$*.ledger.$(command).$(hC).prof
170 prof/$(command)/$(hC): \
171 $(addsuffix /$(command)/$(hC),$(wildcard prof/*.ledger))
172 prof/$(command)/$(hC)/clean:
174 prof/commit/$$(commit)/*.ledger.$(command).$(hC).aux \
175 prof/commit/$$(commit)/*.ledger.$(command).$(hC).hp \
176 prof/commit/$$(commit)/*.ledger.$(command).$(hC).prof \
177 prof/commit/$$(commit)/*.ledger.$(command).$(hC).ps \
178 prof/commit/$$(commit)/*.ledger.$(command).$(hC).stats \
180 prof/%.ledger/$(command)/$(hC)/clean:
182 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).aux \
183 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).hp \
184 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).prof \
185 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).ps \
186 prof/commit/$$(commit)/$$*.ledger.$(command).$(hC).stats \
191 prof/%.ledger/clean: \
192 $(foreach command,$(HCOMPTA_COMMANDS), \
193 prof/%.ledger/$(command)/clean )
196 $(foreach command,$(HCOMPTA_COMMANDS), \
197 $(eval $(call prof/command)) \
198 $(foreach hC,$(GHC_PROF_CATEGORIES), \
199 $(eval $(call prof/command/hC)) ))
201 %.hC.hp: $(foreach hC,$(GHC_PROF_CATEGORIES),%.$(hC).hp)
203 %.hC.ps: $(foreach hC,$(GHC_PROF_CATEGORIES),%.$(hC).ps)
206 (cd $(@D) && hp2ps -b -c -e$(GHC_PROF_PS_WIDTH) -g $(notdir $*.hp))
211 %/not-threaded: CABAL_INSTALL_FLAGS+=-f-threaded
218 unregister: $(addsuffix /unregister,web cli lib)
221 if $(GHC_PKG) list hcompta-$* | grep -q '^ * hcompta-$*-' ; \
222 then $(GHC_PKG) unregister hcompta-$* ; \
225 %/unregister/sandbox: GHC_PKG:=cabal sandbox hc-pkg
226 %/unregister/sandbox: .
227 if $(GHC_PKG) list hcompta-$* | grep -q '^ * hcompta-$*-' ; \
228 then $(GHC_PKG) unregister hcompta-$* ; \
235 cabal $(CABAL_FLAGS) sandbox --sandbox="$@" $(CABAL_SANDBOX_FLAGS) init
237 %/sandbox: GHC_PKG:=cabal sandbox hc-pkg