SYNTAX_DIR = $(ROOT)/src
OCAMLINCLUDES += $(SYNTAX_DIR) +camlp4

PP_SYNTAX = $(CAMLP4) -parser oq -printer a -I $(SYNTAX_DIR) pa_do.cmo \
  pa_infix.cmo nums.cma pa_do_nums.cmo

# All the syntax extensions here depend on src/:
.SCANNER: scan-ocaml-%.ml: $(addprefix $(SYNTAX_DIR)/, \
  pa_do.cmo pa_infix.cmo pa_do_nums.cmo)

public.SyntaxExtension(syntax) =
  section
    PP = $(CAMLP4) -parser oq -parser pa_extend.cmo \
       -printer a -I $(SYNTAX_DIR) \
       pa_do.cmo pa_infix.cmo
    OCAMLPPFLAGS = -pp "$(PP)"
    OCAMLDEPFLAGS = -pp "$(PP)"
    # override the rules for the extension(s): preprocessing and do not care 
    # about $(BYTE_ENABLED)
    foreach(e, $(syntax))
      $(e).cmo $(e).cmi: $(e).ml :scanner: scan-ocaml-$(e).ml
        $(OCamlC) -c $<
    .DEFAULT: $(addsuffix .cmo, $(syntax))

# Tell the fact that the syntax extensions are needed even for the
# scanner for "p".
public.NeedCamlp4Extension(p, syntax) =
  private.syntax_cmo = $(addsuffix .cmo, $(syntax))
  .SCANNER: scan-ocaml-$(p).ml: $(syntax_cmo)
  .SCANNER: scan-ocaml-$(p).mli: $(syntax_cmo)
  SyntaxExtension($(syntax))

.SUBDIRS: length add_vec ray_tracer first_order_logic comp_assit_proof

OCAMLDEPFLAGS += -pp "$(PP_SYNTAX)"
OCAMLPPFLAGS += -pp "$(PP_SYNTAX)"
OCAMLOPTFLAGS += -inline 3
OCAML_OTHER_LIBS += nums graphics

SYNTAX[] =
  pa_compos
  pa_int63

# Programs using the concrete syntax or standard overloadings
CONCRETE[] =
  ad_hoc_newton
  comp_diff
  pi_digits
  rk4
  newton_basin
  newton_basin_base
  newton_cotes

COMPILED_PGM =
  foreach(p, $(CONCRETE))
    value $(OCamlProgram $(p), $(p))

SyntaxExtension($(SYNTAX))
.DEFAULT: $(COMPILED_PGM)


clean:
  rm -f $(glob *~ *.annot *.cmi *.cmo *.cma *.cmx *.o  *.omc) $(COMPILED_PGM)
