Mike Gerwitz

Activist for User Freedom

aboutsummaryrefslogtreecommitdiffstats
blob: 561883306693b3a5a5107f18b594c57f0a419047 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# @configure_input@
#
# Compiles packages written in the Calc DSL.
#
#   Copyright (C) 2018 R-T Specialty, LLC.
#
#   This program is free software: you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Note that this build process is unconventional in order to avoid the startup
# costs that would be associated with executing dslc with each and every package
# (see the other Makefile for more information). Therefore, everything is
# written to .cqueue for later processing by dslc.
#
# The issue of re-building based on timestamps---which Make would normally take
# care of exclusively---must also be given special care now that we are handling
# the building separately from Make. Each enqueued request also touches the
# destination file to update its timestamp, ensuring that it is seen by Make as
# modified (as if it were compiled) and therefore will trigger the building of
# the targets that depend upon it. In the case of the object files (xmlo), a
# temporary file is created when it is enqueued. As part of the queued request
# for compilation is a request to delete this temporary file. In the event that
# the build fails, this temporary file will be seen and will force a rebuild of
# the file, despite its timestamp.
#
# The same issue does not exist for xmle, js, and html files, since they have
# linear dependency trees and dslc will rm the file on failure, which
# obliterates the timestamp.
# #

path_rates       := $(path_suppliers)/rates
path_map         := map
path_c1map       := $(path_map)/c1
path_dsl         := rater
path_ui          := ui
path_suppliers   := suppliers
path_lv          := lovullo
path_srv         := srv

src_suppliers := $(wildcard $(path_suppliers)/*.xml)
src_map       := $(wildcard $(path_map)/*.xml)
src_c1map     := $(wildcard $(path_c1map)/*.xml)

dest_summary_html := $(patsubst \
	$(path_suppliers)/%.xml, \
	$(path_suppliers)/%.html, \
	$(src_suppliers))
dest_standalone := $(patsubst \
	$(path_suppliers)/%.xml, \
	$(path_suppliers)/%.js, \
	$(src_suppliers))
dest_map := $(patsubst \
	$(path_map)/%.xml, \
	$(path_map)/%.xmle, \
	$(src_map))
dest_c1map := $(patsubst \
	$(path_c1map)/%.xml, \
	$(path_c1map)/%.php, \
	$(src_c1map))

compiled_suppliers := $(src_suppliers:.xml=.xmlo)
linked_suppliers   := $(src_suppliers:.xml=.xmle)

comma := ,
extless_supp_delim := $(subst .xml,,$(subst .xml ,$(comma),$(src_suppliers)))

cqueue=.cqueue

ant = @ANT@ -e

.DELETE_ON_ERROR:

.PHONY: default clean \
  interp-rate-tables summary-html c1map \
  standalones program-ui program-ui-immediate program-data-copy \
  do-build version FORCE

# these files will never be deleted when Make considers them to be intermediate
# (e.g. when building summary pages), since they are still needed or take a
# while to build
.PRECIOUS: %.js %.xml %.xmle %.xmlo

SHELL = /bin/bash -O extglob

default: program-ui c1map FORCE

program-ui: standalones ui/package.js ui/Program.js program-ui-immediate
program-ui-immediate: ui/html/index.phtml

include suppliers.mk

# starts with a fresh cqueue
prexmlo:
	@>$(cqueue)

summary-html: $(dest_summary_html) ;

%.html: %.js
	@echo "summary $*.xmle $@" >>.cqueue
	@touch $@

standalones: $(dest_standalone)
%.xmle: %.xmlo
	@echo "link $< $@" >>.cqueue
	@touch $@
%.js: %.xmle
	@echo "standalone $< $@" >>.cqueue
	@touch $@

# C1 XML (specific recipes are in suppliers.mk)
c1map: $(dest_c1map)

%.dot: %.xmlo
	@echo "dot $< $@" >> .cqueue
%.dote: %.xmle
	@echo "dot $< $@" >> .cqueue

%.svg: %.dote
	dot -Tsvg "$<" > "$@"
%.svg: %.dot
	dot -Tsvg "$<" > "$@"

%.xml: %.dat
	rater/tools/tdat2xml $< > $@

%.xml: %.typelist
	rater/tame/build-aux/list2typedef $(*F) < $< > $@

%.csvo: %.csvm
	rater/tools/csvm2csv $< > $@
%.csvo: %.csvi
	rater/tools/csvi $< > $@
%.csvo: %.csv
	cp $< $@

%.xml: %.csvo
	rater/tools/csv2xml $< > $@

version: .version.xml
.version.xml: FORCE
	git log HEAD^.. -1 --pretty=format:'<version>%h</version>' > .version.xml

ui/program.expanded.xml: ui/program.xml | .version.xml
	@echo "progui-expand $< $@" >> .cqueue
ui/Program.js: ui/program.expanded.xml ui/package.js
	@echo "progui-class $< $@ include-path=../../../ui/" >> .cqueue
ui/html/index.phtml: ui/program.expanded.xml
	@echo "progui-html $< $@ out-path=./" >> .cqueue
ui/package-dfns.xmlo: ui/package-dfns.xml
ui/package-dfns.xml: ui/program.expanded.xml
	@echo "progui-pkg $< $@" >> .cqueue
ui/package-map.xmlo: ui/package-map.xml
ui/package-map.xml: ui/program.expanded.xml ui/package-dfns.xml
	@echo "progui-pkg-map $< $@" >> .cqueue

# for the time being, this does not depend on clean-rate-tables because $(ant) will
specs:
	$(MAKE) -C doc/specs
	#
# this will eventually go away once we don't have X-repo klugery

# for the time being, this does not depend on clean-rate-tables because ant will
# run it
clean:
	find $(path_suppliers) $(path_map) $(path_c1map) common/ rater/core rater/lv \( \
		-name '*.xmlo' \
		-o -name '*.xmle' \
		-o -name '*.js' \
		-o -name '*.html' \
		-o -name '*.dep' \
		-o -name '*.tmp' \
	\) -exec rm -v {} \;
	rm -rf $(path_ui)/package-dfns.* \
		$(path_ui)/package-map.* \
		$(path_ui)/program.expanded.xml \
		$(path_ui)/include.js \
		$(path_ui)/Program.js \
		$(path_ui)/html
	find . -path '*/tables/*.csvm' -o -path '*/territories/*.dat' \
		| sed 's/\.csvm$$/\.xml/; s/\.dat$$/\.xml/' \
		| xargs rm -fv

# generates a Makefile that will properly build all package dependencies; note
# that territory and rate packages also have includes; see top of this file for
# an explanation
suppliers.mk:
	$(ant) pkg-dep \
		&& mv $(path_ui)/program.dep $(path_ui)/package-dfns.dep
	xmlo_cmd='@echo "validate $$(patsubst %.tmp,%.xml,$$<) $$@" >> .cqueue \
		&& echo "compile $$(patsubst %.tmp,%.xml,$$<) $$@" >> .cqueue \
		&& echo "rm $$(patsubst %.xmlo,%.tmp,$$@)" >> .cqueue \
		&& touch $$@ \
		&& touch -d +1sec $$(patsubst %.xmlo,%.tmp,$$@) >> .cqueue' \
	    ./rater/tame/build-aux/gen-make common/ $(path_suppliers)/ $(path_dsl)/ $(path_map)/ $(path_ui)/ >$@ \
		&& ./rater/tame/build-aux/gen-c1make $(path_c1map)/*.xml >>$@

me-a-sandwich:
	@test $$EUID -eq 0 \
	  && echo 'You actually ran me as root? Are you insane!?' \
	  || echo 'Make it yourself.'

# simply forces a job to run, thereby forcing the invocation of the secondary
# Makefile (this is not explicitly required, because of prepare, but signifies
# intent and is self-documenting)
FORCE: ;