]> Git — Sourcephile - comptalang.git/blob - GNUmakefile
Polissage : CLI.Command.Balance : is_worth.
[comptalang.git] / GNUmakefile
1 all: install
2 .PHONY: .
3 .SECONDARY:
4 .SUFFIXES:
5 MAKEFLAGS += -r
6 .SHELLFLAGS += -e
7
8 #
9 ## environment
10 ###
11 CABAL_SANDBOX:=.cabal-sandbox
12 GHC_PKG:=ghc-pkg
13 GHC_PROF_CATEGORIES:=hc hm hd hy hr hb
14 GHC_PROF_CPUS:=
15 GHC_PROF_PS_WIDTH:=11in
16 GHC_PROF_RATE:=0.1
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)
22
23 #
24 ## helpers
25 ###
26 if_arg=$(if $2,$1 $2)
27 rmw=$(call if_arg,rm,$(wildcard $1))
28 rmdirw=$(call if_arg,rmdir -p --ignore-fail-on-non-empty,$(wildcard $1))
29
30 #
31 ## install
32 ###
33 install: cabal/install $(HCOMPTA_INTERFACES:=/install)
34 cabal/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
40 cli cli/install:
41 cabal $(CABAL_FLAGS) install -v $(CABAL_INSTALL_FLAGS) ./cli
42 web web/install:
43 cabal $(CABAL_FLAGS) install -v $(CABAL_INSTALL_FLAGS) alex happy
44 cabal $(CABAL_FLAGS) install -v $(CABAL_INSTALL_FLAGS) ./web
45
46 %/recomp: CABAL_INSTALL_FLAGS+=--ghc-options -fforce-recomp
47 %/recomp: %
48
49
50 #
51 ## clean
52 ###
53 clean: lib/clean $(HCOMPTA_INTERFACES:=/clean)
54 lib/clean:
55 (cd lib && cabal clean)
56 cli/clean:
57 (cd cli && cabal clean)
58 web/clean:
59 (cd web && cabal clean)
60
61 #
62 ## test
63 ###
64 test: $(HCOMPTA_INTERFACES:=/test)
65 lib/test:
66 (cd lib && cabal $(CABAL_FLAGS) test --show-details=always $(CABAL_TEST_FLAGS))
67 cli/test:
68 (cd cli && cabal $(CABAL_FLAGS) test --show-details=always $(CABAL_TEST_FLAGS))
69 web/test:
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
73
74
75 #
76 ## doc
77 ###
78 .PHONY: doc
79 doc: doc/xhtml $(HCOMPTA_INTERFACES:=/doc)
80 %/prof: CABAL_INSTALL_FLAGS+=-fprof --enable-library-profiling --enable-executable-profiling
81 %/prof: $(CABAL_SANDBOX) %
82
83
84 lib/doc:
85 (cd lib && cabal $(CABAL_FLAGS) haddock --hyperlink-source $(CABAL_HADDOCK_FLAGS))
86 cli/doc:
87 (cd cli && cabal $(CABAL_FLAGS) haddock --hyperlink-source $(CABAL_HADDOCK_FLAGS))
88 web/doc:
89 (cd web && cabal $(CABAL_FLAGS) haddock --hyperlink-source $(CABAL_HADDOCK_FLAGS))
90 doc/%: .
91 $(MAKE) -C doc $*
92
93 #
94 ## dev
95 ###
96 %/dev: CABAL_INSTALL_FLAGS+=-fdev
97 %/dev: %
98
99
100 #
101 ## dump
102 ###
103 %/dump: CABAL_INSTALL_FLAGS+=-fdump
104 %/dump: %
105
106
107 #
108 ## hlint
109 ###
110 hlint: $(HCOMPTA_INTERFACES:=/hlint.html)
111 %/hlint.html: .
112 hlint \
113 -i 'Redundant $$' \
114 -i 'Redundant bracket' \
115 -i 'Redundant do' \
116 -i 'Redundant lambda' \
117 -i "Use camelCase" \
118 -i 'Use if' \
119 -i 'Use String' \
120 -i 'Use string literal' \
121 --quiet --report="$@" \
122 "$*"/Hcompta && rm -f "$@"
123
124 #
125 ## prof
126 ###
127 .PHONY: prof
128 prof: $(addprefix prof/,$(HCOMPTA_COMMANDS))
129
130 prof/commit/$(commit):
131 mkdir -p "$@"
132
133 lib/install/prof: CABAL_INSTALL_FLAGS+=-fprof --enable-library-profiling
134 lib/install/prof: cli/unregister/sandbox lib/install | $(CABAL_SANDBOX)
135
136
137 cli/install/prof: CABAL_INSTALL_FLAGS+=-fprof --enable-library-profiling --enable-executable-profiling
138 cli/install/prof: cli/install | $(CABAL_SANDBOX)
139 mv \
140 $(CABAL_SANDBOX)/bin/hcompta-cli \
141 $(CABAL_SANDBOX)/bin/hcompta-cli-prof
142
143 define prof/command
144
145 prof/clean: prof/$(command)/clean
146
147 prof/%.ledger/$(command)/clean: \
148 $(foreach hC,$(GHC_PROF_CATEGORIES), \
149 prof/%.ledger/$(command)/$(hC)/clean \
150 )
151 $$(call rmw, \
152 prof/$$*.ledger.$(command) \
153 )
154
155 endef
156
157 define prof/command/hC
158
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
163
164
165 prof/%.ledger.$(command): \
166 prof/commit/$$(commit)/%.ledger.$(command).$(hC).hs
167
168 prof/commit/$$(commit)/%.ledger.$(command).$(hC).hp \
169 prof/%.ledger.$(command): \
170 $$(HCOMPTA_CLI_PROF) \
171 prof/%.ledger \
172 | prof/commit/$$(commit)
173 GHCRTS=' \
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 \
179 -p \
180 $$(GHCRTS)' \
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
186
187 prof/$(command)/$(hC): \
188 $(addsuffix /$(command)/$(hC),$(wildcard prof/*.ledger))
189 prof/$(command)/$(hC)/clean:
190 $$(call rmw, \
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 \
196 )
197 prof/%.ledger/$(command)/$(hC)/clean:
198 $$(call rmw, \
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 \
204 )
205
206 endef
207
208 prof/%.ledger/clean: \
209 $(foreach command,$(HCOMPTA_COMMANDS), \
210 prof/%.ledger/$(command)/clean )
211
212
213 $(foreach command,$(HCOMPTA_COMMANDS), \
214 $(eval $(call prof/command)) \
215 $(foreach hC,$(GHC_PROF_CATEGORIES), \
216 $(eval $(call prof/command/hC)) ))
217
218 %.hC.hp: $(foreach hC,$(GHC_PROF_CATEGORIES),%.$(hC).hp)
219
220 %.hC.ps: $(foreach hC,$(GHC_PROF_CATEGORIES),%.$(hC).ps)
221
222 %.ps: %.hp
223 (cd $(@D) && hp2ps -b -c -e$(GHC_PROF_PS_WIDTH) -g $(notdir $*.hp))
224
225 #
226 ## not-threaded
227 ###
228 %/not-threaded: CABAL_INSTALL_FLAGS+=-f-threaded
229 %/not-threaded: %
230
231
232 #
233 ## ghc-pkg
234 ###
235 unregister: $(HCOMPTA_INTERFACES:=/unregister)
236
237 %/unregister: .
238 if $(GHC_PKG) list hcompta-$* | grep -q '^ * hcompta-$*-' ; \
239 then $(GHC_PKG) unregister hcompta-$* ; \
240 fi
241
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-$* ; \
246 fi
247
248 #
249 ## sandbox
250 ###
251 $(CABAL_SANDBOX):
252 cabal $(CABAL_FLAGS) sandbox --sandbox="$@" $(CABAL_SANDBOX_FLAGS) init
253
254 %/sandbox: GHC_PKG:=cabal sandbox hc-pkg
255 %/sandbox: %
256
257
258 #
259 ## stats
260 ###
261 .PHONY: stats
262 stats:
263 gitstats . $@