mirror of
https://github.com/CatalaLang/catala.git
synced 2024-11-08 07:51:43 +03:00
0f9ee2c72e
- Use separate functions for successive passes in module `Driver.Passes` - Use other functions for end results printing in module `Driver.Commands` As a consequence, it is much more flexible to use by plugins or libs and we no longer need the complex polymorphic variant parameter. This patch leverages previous changes to use Cmdliner subcommands and effectively specialises the flags of each Catala subcommand. Other changes include: - an attempt to normalise the generic options and reduce the number of global references. Some are ok, like `debug` ; some would better be further cleaned up, e.g. the ones used by Proof backend were moved to a `Proof.globals` module and need discussion. The printer no longer relies on the global languages and prints money amounts in an agnostic way. - the plugin directory is automatically guessed and loaded even in dev setups. Plugins are shown by the main `catala` command and listed in `catala --help` - exception catching at the toplevel has been refactored a bit as well; return codes are normalised to follow the manpage and avoid codes >= 128 that are generally reserved for shells. Update tests
417 lines
13 KiB
Makefile
417 lines
13 KiB
Makefile
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 pip
|
|
$(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/
|
|
|
|
##########################################
|
|
# 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
|