(env
 (dev
  (flags
   (:standard -w -33 -w -27)))
 (release
  (flags
   (:standard -w -33 -w -27))))

(rule
 (target jib.ml)
 (deps
  (:jib_ott ../../language/jib.ott)
  value2.ml)
 (action
  (run
   ott
   -sort
   false
   -generate_aux_rules
   true
   -o
   %{target}
   -picky_multiple_parses
   true
   %{jib_ott})))

(rule
 (target corelib_sail.ml)
 (deps
  (:corelib_sail ../../lib/core/corelib.sail))
 (action
  (with-stdout-to
   corelib_sail.ml
   (run
    sail_maker
    embed
    --file
    %{corelib_sail}
    --virtual-file
    "corelib.sail"))))

(rule
 (target corelib_project.ml)
 (deps
  (:corelib_project ../../lib/core/corelib.sail_project))
 (action
  (with-stdout-to
   corelib_project.ml
   (run
    sail_maker
    embed
    --file
    %{corelib_project}
    --virtual-file
    "corelib.sail_project"))))

(include_subdirs qualified)

(copy_files ../gen_lib/*.lem)

(rule
 (targets
  value2.ml
  sail2_values.ml
  sail2_prompt.ml
  sail2_instr_kinds.ml
  sail2_prompt_monad.ml
  sail2_operators.ml
  sail2_operators_bitlists.ml)
 (deps
  value2.lem
  sail2_prompt.lem
  sail2_values.lem
  sail2_instr_kinds.lem
  sail2_prompt_monad.lem
  sail2_operators.lem
  sail2_operators_bitlists.lem)
 (action
  (run
   lem
   -wl_rename
   ign
   -wl_pat_comp
   ign
   -wl_comp_message
   ign
   -ocaml
   %{deps})))

(menhir
 (modules parser)
 (flags --external-tokens Token))

(menhir
 (modules infix_parser)
 (flags --table --external-tokens Infix_parser_token))

(menhir
 (modules project_parser)
 (flags --external-tokens Project_token))

(ocamllex lexer project_lexer)

(generate_sites_module
 (module libsail_sites)
 (sites libsail))

; The parallel implementation of map uses effect handlers and matching
; syntax, which is only available from OCaml 5.3.0 onwards. On older
; compilers fall back to a sequential implementation.

(rule
 (target parmap.ml)
 (enabled_if
  (>= %{ocaml_version} 5.3.0))
 (deps parmap.par.ml)
 (action
  (copy parmap.par.ml parmap.ml)))

(rule
 (target parmap.ml)
 (enabled_if
  (< %{ocaml_version} 5.3.0))
 (deps parmap.seq.ml)
 (action
  (copy parmap.seq.ml parmap.ml)))

(library
 (name libsail)
 (public_name libsail)
 (libraries lem linksem pprint dune-site yojson menhirLib)
 (modes byte native)
 (instrumentation
  (backend bisect_ppx --exclusions src/lib/bisect.exclude)
  (deps bisect.exclude)))
