# Id

include ../../config/Makefile

SHELL=/bin/sh

INCLUDES=-I ../odyl -I ../../boot
OCAMLCFLAGS=$(INCLUDES)
LINKFLAGS=$(INCLUDES)
INTERFACES=-I $(OLIBDIR) Arg Array Buffer Callback Char Digest Filename Format Gc Genlex Hashtbl Lazy Lexing List Map Marshal Obj Oo Parsing Pervasives Printexc Printf Queue Random Set Sort Stack Stream String Sys Weak -I ../../boot Gramext Grammar Plexer Stdpp Token -I . Ast2pt Asttypes Oconfig Location Longident MLast Parsetree Pcaml Pretty Quotation Warnings
CAMLP4_INTF=ast2pt.cmi asttypes.cmi oconfig.cmi warnings.cmi location.cmi longident.cmi mLast.cmi parsetree.cmi pcaml.cmi pretty.cmi quotation.cmi
CAMLP4_OBJS=../../boot/stdpp.cmo ../../boot/token.cmo ../../boot/plexer.cmo ../../boot/gramext.cmo ../../boot/grammar.cmo oconfig.cmo quotation.cmo ast2pt.cmo pretty.cmo reloc.cmo pcaml.cmo argl.cmo crc.cmo
CAMLP4_XOBJS=../lib/stdpp.cmx ../lib/token.cmx ../lib/plexer.cmx ../lib/gramext.cmx ../lib/grammar.cmx oconfig.cmx quotation.cmx ast2pt.cmx pretty.cmx reloc.cmx pcaml.cmx argl.cmx
OBJS=../odyl/odyl.cma camlp4.cma
XOBJS=camlp4.cmxa
CAMLP4M=

CAMLP4=camlp4$(EXE)
CAMLP4OPT=phony

all: $(CAMLP4)
opt: $(CAMLP4OPT)

$(CAMLP4): $(OBJS) ../odyl/odyl.cmo
	$(OCAMLC) $(OBJS) $(CAMLP4M) ../odyl/odyl.cmo -linkall -o $(CAMLP4)

$(CAMLP4OPT): $(XOBJS) ../odyl/odyl.cmx
	$(OCAMLOPT) $(XOBJS) $(CAMLP4M) ../odyl/odyl.cmx -linkall -o $(CAMLP4OPT)

camlp4.cma: $(CAMLP4_OBJS)
	$(OCAMLC) $(LINKFLAGS) $(CAMLP4_OBJS) -a -o camlp4.cma

camlp4.cmxa: $(CAMLP4_XOBJS)
	$(OCAMLOPT) $(LINKFLAGS) $(CAMLP4_XOBJS) -a -o camlp4.cmxa

crc.cmo: ./extract_crc$(EXE) $(CAMLP4_INTF)
	./extract_crc $(INTERFACES) > crc.ml
	echo "let _ = Dynlink.add_available_units crc_unit_list" >> crc.ml
	$(OCAMLC) $(OCAMLCFLAGS) -c crc.ml

./extract_crc$(EXE): extract_crc.cmo
	$(OCAMLC) dynlink.cma extract_crc.cmo -o ./extract_crc$(EXE)

steal:
	$(MAKE) copy_steal DIR=parsing FILE=asttypes.mli
	$(MAKE) copy_steal DIR=parsing FILE=location.mli
	$(MAKE) copy_steal DIR=parsing FILE=longident.mli
	$(MAKE) copy_steal DIR=parsing FILE=parsetree.mli
	$(MAKE) copy_steal DIR=utils FILE=warnings.mli
	grep ast $(OCAML_SRC)/utils/config.mli > oconfig.mli
	grep ast $(OCAML_SRC)/utils/config.ml | sed "s/^and/let/" > oconfig.ml
	$(MAKE) copy_steal DIR=otherlibs/dynlink FILE=extract_crc.ml
	sed "s/let load_path = ref \[.*\]/let load_path = ref []/" extract_crc.ml | sed 's/$$Id.*\$$/Id/' > t
	mv t extract_crc.ml

copy_steal:
	sed 's/\$$Id.*\$$/Id/' $(OCAML_SRC)/$(DIR)/$(FILE) > $(FILE)

compare_stolen:
	@echo =================================================
	@echo asttypes.mli
	diff asttypes.mli $(OCAML_SRC)/parsing/asttypes.mli; exit 0
	@echo =================================================
	@echo location.mli
	diff location.mli $(OCAML_SRC)/parsing/location.mli; exit 0
	@echo =================================================
	@echo longident.mli
	diff longident.mli $(OCAML_SRC)/parsing/longident.mli; exit 0
	@echo =================================================
	@echo parsetree.mli
	diff parsetree.mli $(OCAML_SRC)/parsing/parsetree.mli; exit 0
	@echo =================================================
	@echo warnings.mli
	diff warnings.mli $(OCAML_SRC)/utils/warnings.mli; exit 0
	@echo =================================================
	@echo config.mli
	diff config.mli $(OCAML_SRC)/utils/config.mli; exit 0
	@echo =================================================
	@echo config.ml
	cat $(OCAML_SRC)/utils/config.ml | diff config.ml -; exit 0
	@echo =================================================
	@echo extract_crc.ml
	sed "s/let load_path = ref \[.*\]/let load_path = ref []/" $(OCAML_SRC)/otherlibs/dynlink/extract_crc.ml | diff extract_crc.ml -; exit 0

clean::
	rm -f *.cm* *.pp[io] *.o *.bak .*.bak *.out *.opt
	rm -f $(CAMLP4) crc.ml extract_crc$(EXE)

depend:
	cp .depend .depend.bak
	> .depend
	@for i in *.mli *.ml; do \
	  ../tools/apply pr_depend.cmo -- $(INCLUDES) $$i >> .depend; \
	done

promote:
	cp $(CAMLP4) ../../boot/.

compare:
	@for j in $(CAMLP4); do \
		if cmp $$j ../../boot/$$j; then :; else exit 1; fi; \
	done

install:
	-$(MKDIR) $(BINDIR)
	cp $(CAMLP4) $(BINDIR)/.
	cp mLast.mli quotation.mli pcaml.mli $(LIBDIR)/.
	cp mLast.cmi quotation.cmi ast2pt.cmi pcaml.cmi $(LIBDIR)/.
	cp extract_crc$(EXE) camlp4.cma $(LIBDIR)/.

include .depend
