forked from CatalaLang/catala
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
416 lines (309 loc) · 13.1 KB
/
Makefile
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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
help : Makefile
@sed -n 's/^#> //p' $<
ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
export DUNE_PROFILE ?= dev
# Export all variables to sub-make
export
##########################################
# Dependencies
##########################################
EXECUTABLES = groff python3 colordiff node node npm ninja pandoc
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(warning [WARNING] No "$(exec)" executable found. \
Please install this executable for everything to work smoothly)))
OPAM = opam --cli=2.1
dependencies-ocaml:
$(OPAM) pin . --no-action
OPAMVAR_cataladevmode=1 $(OPAM) install . --with-doc --with-test --update-invariant --depext-only
OPAMVAR_cataladevmode=1 $(OPAM) install . --with-doc --with-test --update-invariant --deps-only
dependencies-ocaml-with-z3:
$(OPAM) pin . --no-action
OPAMVAR_cataladevmode=1 OPAMVAR_catalaz3mode=1 $(OPAM) install . --with-doc --with-test --update-invariant --depext-only
OPAMVAR_cataladevmode=1 OPAMVAR_catalaz3mode=1 $(OPAM) install . --with-doc --with-test --update-invariant --deps-only
dependencies-js:
$(MAKE) -C $(FRENCH_LAW_JS_LIB_DIR) dependencies
PY_VENV_DIR = _python_venv
PY_VENV_ACTIVATE = . $(PY_VENV_DIR)/bin/activate;
# Rebuild when requirements change
$(PY_VENV_DIR): $(PY_VENV_DIR)/stamp
$(PY_VENV_DIR)/stamp: \
runtimes/python/catala/pyproject.toml \
syntax_highlighting/en/pygments/pyproject.toml \
syntax_highlighting/fr/pygments/pyproject.toml \
syntax_highlighting/pl/pygments/pyproject.toml
test -d $(PY_VENV_DIR) || python3 -m venv $(PY_VENV_DIR)
$(PY_VENV_ACTIVATE) python3 -m pip install -U \
-e runtimes/python/catala \
-e syntax_highlighting/en/pygments \
-e syntax_highlighting/fr/pygments \
-e syntax_highlighting/pl/pygments
touch $@
dependencies-python: $(PY_VENV_DIR)
#> dependencies : Install the Catala OCaml, JS and Git dependencies
dependencies: dependencies-ocaml dependencies-js dependencies-python
dependencies-with-z3: dependencies-ocaml-with-z3 dependencies-js dependencies-python
##########################################
# Catala compiler rules
##########################################
COMPILER_DIR=compiler
BUILD_SYSTEM_DIR=build_system
CATALA_LEGIFRANCE_DIR=french_law/catala_legifrance
#> build_dev : Builds the Catala compiler, without formatting code
build_dev: parser-messages
dune build \
$(COMPILER_DIR)/catala.exe \
$(COMPILER_DIR)/plugins/ \
$(BUILD_SYSTEM_DIR)/clerk.exe \
$(CATALA_LEGIFRANCE_DIR)/catala_legifrance.exe
# Just the base compiler as needed to run the tests
compiler: parser-messages
dune build $(COMPILER_DIR)/catala.exe $(COMPILER_DIR)/plugins/ $(BUILD_SYSTEM_DIR)/clerk.exe
#> build : Builds the Catala compiler
build: parser-messages format build_dev
#> js_build : Builds the Web-compatible JS versions of the Catala compiler
js_build:
dune build $(COMPILER_DIR)/catala.bc.js
dune build $(COMPILER_DIR)/catala_web_interpreter.bc.js
#> doc : Generates the HTML OCaml documentation
doc:
dune build @doc
ln -sf $(PWD)/_build/default/_doc/_html/index.html doc/odoc.html
install:
dune build @install
#> runtimes : Builds the OCaml and js_of_ocaml runtimes
runtimes:
dune build runtimes/
#> plugins : Builds the compiler backend plugins
plugins: runtimes
dune build compiler/plugins/
@echo "define CATALA_PLUGINS=_build/default/compiler/plugins to test the plugins"
##########################################
# Rules related to promoted files
##########################################
check-promoted:
dune build @update-parser-messages @fmt
compiler/surface/parser.messages: compiler/surface/tokens.mly compiler/surface/parser.mly
-dune build @update-parser-messages --auto-promote
parser-messages: compiler/surface/parser.messages
format:
-dune build @fmt --auto-promote 2>/dev/null
##########################################
# Syntax highlighting rules
##########################################
SYNTAX_HIGHLIGHTING_FR=${CURDIR}/syntax_highlighting/fr
SYNTAX_HIGHLIGHTING_EN=${CURDIR}/syntax_highlighting/en
SYNTAX_HIGHLIGHTING_PL=${CURDIR}/syntax_highlighting/pl
pygmentize_%: $(PY_VENV_DIR)
$(PY_VENV_ACTIVATE) python3 -m pip install syntax_highlighting/$*/pygments
#> pygments : Extends your pygmentize executable with Catala lexers
pygments: pygmentize_fr pygmentize_en pygmentize_pl
atom_fr: ${CURDIR}/syntax_highlighting/fr/setup_atom.sh
chmod +x $<
$<
atom_en: ${CURDIR}/syntax_highlighting/en/setup_atom.sh
chmod +x $<
$<
atom_pl: ${CURDIR}/syntax_highlighting/pl/setup_atom.sh
chmod +x $<
$<
#> atom : Installs Catala syntax highlighting for Atom
atom: atom_fr atom_en atom_pl
vscode_fr: ${CURDIR}/syntax_highlighting/fr/setup_vscode.sh
chmod +x $<
$<
vscode_en: ${CURDIR}/syntax_highlighting/en/setup_vscode.sh
chmod +x $<
$<
# TODO
# vscode_pl: ${CURDIR}/syntax_highlighting/pl/setup_vscode.sh
# chmod +x $<
# $<
#> vscode : Installs Catala syntax highlighting for VSCode
vscode: vscode_fr vscode_en
##########################################
# Extra documentation
##########################################
syntax:
$(MAKE) -C doc/syntax
##########################################
# Literate programming and examples
##########################################
EXAMPLES_DIR=examples
ALLOCATIONS_FAMILIALES_DIR=$(EXAMPLES_DIR)/allocations_familiales
AIDES_LOGEMENT_DIR=$(EXAMPLES_DIR)/aides_logement
US_TAX_CODE_DIR=$(EXAMPLES_DIR)/us_tax_code
TUTORIAL_EN_DIR=$(EXAMPLES_DIR)/tutorial_en
TUTORIEL_FR_DIR=$(EXAMPLES_DIR)/tutoriel_fr
POLISH_TAXES_DIR=$(EXAMPLES_DIR)/polish_taxes
literate_aides_logement: build $(PY_VENV_DIR)
$(MAKE) -C $(AIDES_LOGEMENT_DIR) aides_logement.tex
$(MAKE) -C $(AIDES_LOGEMENT_DIR) aides_logement.html
literate_allocations_familiales: build
$(MAKE) -C $(ALLOCATIONS_FAMILIALES_DIR) allocations_familiales.tex
$(MAKE) -C $(ALLOCATIONS_FAMILIALES_DIR) allocations_familiales.html
literate_us_tax_code: build
$(MAKE) -C $(US_TAX_CODE_DIR) us_tax_code.tex
$(MAKE) -C $(US_TAX_CODE_DIR) us_tax_code.html
literate_tutorial_en: build
$(MAKE) -C $(TUTORIAL_EN_DIR) tutorial_en.tex
$(MAKE) -C $(TUTORIAL_EN_DIR) tutorial_en.html
literate_tutoriel_fr: build
$(MAKE) -C $(TUTORIEL_FR_DIR) tutoriel_fr.tex
$(MAKE) -C $(TUTORIEL_FR_DIR) tutoriel_fr.html
literate_polish_taxes: build
$(MAKE) -C $(POLISH_TAXES_DIR) polish_taxes.tex
$(MAKE) -C $(POLISH_TAXES_DIR) polish_taxes.html
#> literate_examples : Builds the .tex and .html versions of the examples code. Needs pygments to be installed and patched with Catala.
literate_examples: literate_allocations_familiales \
literate_us_tax_code literate_tutorial_en literate_tutoriel_fr \
literate_polish_taxes literate_aides_logement
##########################################
# French law library
##########################################
#-----------------------------------------
# OCaml
#-----------------------------------------
FRENCH_LAW_OCAML_LIB_DIR = french_law/ocaml
FRENCH_LAW_LIBRARY_OCAML = \
$(FRENCH_LAW_OCAML_LIB_DIR)/law_source/allocations_familiales_api_web.ml \
$(FRENCH_LAW_OCAML_LIB_DIR)/law_source/unit_tests/tests_allocations_familiales.ml \
$(FRENCH_LAW_OCAML_LIB_DIR)/law_source/aides_logement_api_web.ml
$(addprefix _build/default/,$(FRENCH_LAW_LIBRARY_OCAML)) :
dune build $@
#> generate_french_law_library_ocaml : Generates the French law library OCaml sources from Catala
generate_french_law_library_ocaml:
dune build $(FRENCH_LAW_LIBRARY_OCAML)
#> build_french_law_library_ocaml : Builds the OCaml French law library
build_french_law_library_ocaml:
dune build $(FRENCH_LAW_OCAML_LIB_DIR)/api.a
run_french_law_library_benchmark_ocaml:
dune exec $(FRENCH_LAW_OCAML_LIB_DIR)/bench.exe
run_french_law_library_ocaml_tests:
dune exec $(FRENCH_LAW_OCAML_LIB_DIR)/law_source/unit_tests/run_tests.exe
#-----------------------------------------
# JSON schemas
#-----------------------------------------
JSON_SCHEMAS = \
$(AIDES_LOGEMENT_DIR)/aides_logement_schema.json \
$(ALLOCATIONS_FAMILIALES_DIR)/allocations_familiales_schema.json
#> generate_french_law_json_schemas : Generates the French law library JSON schemas
$(addprefix _build/default/,$(JSON_SCHEMAS)):
dune build $@
generate_french_law_json_schemas:
dune build $(JSON_SCHEMAS)
#-----------------------------------------
# JS
#-----------------------------------------
FRENCH_LAW_JS_LIB_DIR=french_law/js
run_french_law_library_benchmark_js: build_french_law_library_js
$(MAKE) -C $(FRENCH_LAW_JS_LIB_DIR) bench
#> build_french_law_library_js : Builds the JS version of the OCaml French law library
build_french_law_library_js:
dune build $(FRENCH_LAW_JS_LIB_DIR)/src/french_law.js
#> build_french_law_library_web_api : Builds the web API of the French law library
build_french_law_library_web_api: build_french_law_library_js generate_french_law_json_schemas
#-----------------------------------------
# Python
#-----------------------------------------
FRENCH_LAW_PYTHON_LIB_DIR=french_law/python
FRENCH_LAW_LIBRARY_PYTHON = \
$(FRENCH_LAW_PYTHON_LIB_DIR)/src/allocations_familiales.py \
$(FRENCH_LAW_PYTHON_LIB_DIR)/src/aides_logement.py
$(FRENCH_LAW_LIBRARY_PYTHON):
dune build $@
#> generate_french_law_library_python : Generates the French law library Python sources from Catala
generate_french_law_library_python:
dune build $(FRENCH_LAW_LIBRARY_PYTHON)
#> type_french_law_library_python : Types the French law library Python sources with mypy
type_french_law_library_python: $(PY_VENV_DIR) generate_french_law_library_python
$(PY_VENV_ACTIVATE) $(MAKE) -C $(FRENCH_LAW_PYTHON_LIB_DIR) type
run_french_law_library_benchmark_python: $(PY_ENV_DIR) type_french_law_library_python
$(PY_VENV_ACTIVATE) $(MAKE) -C $(FRENCH_LAW_PYTHON_LIB_DIR) bench
##########################################
# High-level test and benchmarks commands
##########################################
CATALA_OPTS?=
CLERK_OPTS?=--makeflags="$(MAKEFLAGS)"
CATALA_BIN=_build/default/$(COMPILER_DIR)/catala.exe
CLERK_BIN=_build/default/$(BUILD_SYSTEM_DIR)/clerk.exe
CATALA_LEGIFRANCE_BIN=_build/default/$(CATALA_LEGIFRANCE_DIR)/catala_legifrance.exe
CLERK=$(CLERK_BIN) --exe $(CATALA_BIN) \
$(CLERK_OPTS) $(if $(CATALA_OPTS),--catala-opts=$(CATALA_OPTS),)
.FORCE:
test_suite: .FORCE compiler
@$(MAKE) -C tests pass_all_tests
test_examples: .FORCE compiler
@$(MAKE) -C examples pass_all_tests
#> tests : Run interpreter tests
tests: test_suite test_examples
#> tests_ocaml : Run OCaml unit tests for the Catala-generated code
tests_ocaml: run_french_law_library_ocaml_tests
#> bench_ocaml : Run OCaml benchmarks for the Catala-generated code
bench_ocaml: run_french_law_library_benchmark_ocaml
#> bench_js : Run JS benchmarks for the Catala-generated code
bench_js: run_french_law_library_benchmark_js
#> bench_python : Run Python benchmarks for the Catala-generated code
bench_python: run_french_law_library_benchmark_python
tests/%: .FORCE
@$(MAKE) -C tests $*
##########################################
# Website assets
##########################################
WEBSITE_ASSETS = grammar.html catala.html clerk.html catala_legifrance.html
$(addprefix _build/default/,$(WEBSITE_ASSETS)):
dune build $@
website-assets-base: build_french_law_library_web_api doc literate_examples build
dune build $(WEBSITE_ASSETS)
#> website-assets : Builds all the assets necessary for the Catala website
website-assets:
$(MAKE) DUNE_PROFILE=release website-assets-base
##########################################
# Misceallenous
##########################################
#> all : Run all make commands
all: \
build js_build doc \
tests \
runtimes \
plugins \
generate_french_law_library_ocaml build_french_law_library_ocaml \
tests_ocaml bench_ocaml \
build_french_law_library_js \
bench_js \
generate_french_law_library_python type_french_law_library_python \
bench_python \
website-assets-base
#> clean : Clean build artifacts
clean:
dune clean
rm -rf artifacts
$(MAKE) -C $(ALLOCATIONS_FAMILIALES_DIR) clean
$(MAKE) -C $(US_TAX_CODE_DIR) clean
$(MAKE) -C $(TUTORIEL_FR_DIR) clean
$(MAKE) -C $(TUTORIAL_EN_DIR) clean
$(MAKE) -C $(POLISH_TAXES_DIR) clean
$(MAKE) -C $(CODE_GENERAL_IMPOTS_DIR) clean
inspect:
gitinspector -f ml,mli,mly,iro,tex,catala,catala_en,catala_pl,catala_fr,md,fst,mld --grading
#> help_clerk : Display the clerk man page
help_clerk:
$(CLERK_BIN) --help
#> help_catala : Display the catala man page
help_catala:
$(CATALA_BIN) --help
#> help_catala_legifrance : Display the catala_legifrance man page
help_catala_legifrance:
$(CATALA_LEGIFRANCE_BIN) --help
##########################################
# Special targets
##########################################
.PHONY: inspect clean all literate_examples english allocations_familiales \
pygments install build_dev build doc format dependencies \
dependencies-ocaml catala.html help parser-messages plugins \
generate_french_law_json_schemas generate_french_law_library_python \
generate_french_law_library_ocaml \
run_french_law_library_benchmark_python \
run_french_law_library_benchmark_js run_french_law_library_ocaml_tests \
build_french_law_library_js build_french_law_library_web_api \
build_french_law_library_ocaml \
website-assets website-assets-base