Make Z3 an optional dependency

If Catala is compiled without Z3, trying to run it with the backend `Proof` will
yield:
```
[ERROR] This instance of Catala was compiled without Z3 support.
```
and return 124

Note that this doesn't change the `make depends`, opam file or CI to account for it,
it just enables it at the build-system level.

There are also no hooks at this moment to have Catala self-document the options
whith which it was compiled (e.g. in the `--help` screen). But that could be
added in a more general way later, it's probably not really needed yet.
This commit is contained in:
Louis Gesbert 2022-03-08 18:32:02 +01:00
parent e5e0164fee
commit e7e89873db
3 changed files with 53 additions and 1 deletions

View File

@ -1,7 +1,17 @@
(library
(name verification)
(public_name catala.verification)
(libraries bindlib utils dcalc runtime z3 calendar))
(libraries
bindlib
utils
dcalc
runtime
calendar
(select
z3backend.ml
from
(z3 -> z3backend.real.ml)
(-> z3backend.dummy.ml))))
(documentation
(package catala)

View File

@ -0,0 +1,42 @@
(* This file is part of the Catala compiler, a specification language for tax
and social benefits computation rules. Copyright (C) 2022 Inria, contributor:
Aymeric Fromherz <aymeric.fromherz@inria.fr>
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy of
the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations under
the License. *)
(** Replicating the interface, with no actual implementation for compiling
without the expected backend. All functions print an error message and exit *)
let dummy () =
Utils.Cli.error_print
"This instance of Catala was compiled without Z3 support.";
exit 124
module Io = struct
let init_backend () = dummy ()
type backend_context = unit
let make_context _ _ = dummy ()
type vc_encoding = unit
let translate_expr _ _ = dummy ()
type model = unit
type vc_encoding_result = Success of model * model | Fail of string
let print_positive_result _ = dummy ()
let print_negative_result _ _ _ = dummy ()
let encode_and_check_vc _ _ = dummy ()
end