.PRECIOUS: %.c %.tree %.ac %.c.abox %.bin \
	   %.f1 %.f2 %.f3 %.f4 %.f5 %.f6 %.f7 %.f8 %.f9 %.f10 %.f11 %.f12 %.f13 \
	   %.s1 %.s2 %.s3 %.s4 %.s5 %.s6 %.s7 %.s8 %.s9 %.s10 %.s11 %.s12 %.s13 

CINCLUDES = \
  --C-include "<srts/stratego.h>" \
  --C-include "<stratego-lib/stratego-lib.h>"

# MAKE COPY OF SSL ####################################################

%.rtree : %.str
	$(STRATEGO_FRONT)/bin/parse-stratego -i $< -o $@ \
               --default-syntax Stratego-Sugar.tbl 
#               --desugaring off

# PRETTY-PRINTING ####################################################

#%.txt: % 
#	$(prefix)/bin/pp-stratego -a -i $< -o $@ --annotations

%.txt: % 
	$(prefix)/bin/pretty-stratego -a -i $< -o $@ --verbose 10
#--annotations

%.atxt : %
	$(ATERM)/bin/baffle -wt -i $< -o $@

%.ttxt : %
	$(ATERM_FRONT)/bin/pp-aterm -i $< -o $@ --verbose 0

# FORMATS ###########################################################

formatcheck = $(prefix)/bin/format-check

#STRATEGO_FRONT_SHARE = $(STRATEGO_FRONT)/share/stratego-front

STRATEGO_FRONT_SHARE = $(top_srcdir)/../stratego-front/sig

FC_SUGAR      = $(formatcheck) --fast -b --rtg-nf $(STRATEGO_FRONT_SHARE)/Stratego-Sugar.rtg-nf      -o /dev/null
FC_SUGAR1     = $(formatcheck) --fast -b --rtg-nf $(STRATEGO_FRONT_SHARE)/Stratego-Sugar-1.rtg-nf    -o /dev/null
FC_SUGAR2     = $(formatcheck) --fast -b --rtg-nf $(STRATEGO_FRONT_SHARE)/Stratego-Sugar-2.rtg-nf    -o /dev/null
FC_SUGAR3     = $(formatcheck) --fast -b --rtg-nf $(STRATEGO_FRONT_SHARE)/Stratego-Sugar-3.rtg-nf    -o /dev/null
FC_SUGAR4     = $(formatcheck) --fast -b --rtg-nf $(STRATEGO_FRONT_SHARE)/Stratego-Sugar-4.rtg-nf    -o /dev/null
FC_SUGAR5     = $(formatcheck) --fast -b --rtg-nf $(STRATEGO_FRONT_SHARE)/Stratego-Sugar-5.rtg-nf    -o /dev/null
FC_SUGAR_CONG = $(formatcheck) --fast -b --rtg-nf $(STRATEGO_FRONT_SHARE)/Stratego-Sugar-Cong.rtg-nf -o /dev/null
FC_SUGAR_HL   = $(formatcheck) --fast -b --rtg-nf $(STRATEGO_FRONT_SHARE)/Stratego-Sugar-HL.rtg-nf   -o /dev/null
FC_CORE       = $(formatcheck) --fast -b --rtg-nf $(STRATEGO_FRONT_SHARE)/Stratego-Core.rtg-nf       -o /dev/null
FC_CORE_CONG  = $(formatcheck) --fast -b --rtg-nf $(STRATEGO_FRONT_SHARE)/Stratego-Core-Cong.rtg-nf  -o /dev/null
FC_C          = $(formatcheck) --fast -b --rtg-nf $(C_TOOLS)/share/c-tools/C.rtg-nf -o /dev/null

# FRONT-END ###########################################################

%.tree : %.str 
	XTC_REPOSITORY=$(BUILD_REPOSITORY) ../pack/pack-stratego $(SINCLUDES) -i $< -o $@ --verbose 6 --desugaring off 

%.tree : %.rtree 
	XTC_REPOSITORY=$(BUILD_REPOSITORY) ../pack/pack-stratego $(SINCLUDES) -i $< -o $@ 

%.tree : %.itree 
	cp $< $@ 

%.f0 : %.tree
	$(FC_SUGAR_CONG) -i $<
	../front/repair-types -i $< -o $@

%.f1 : %.f0
	$(FC_SUGAR_CONG) -i $<
	../front/pre-desugar -i $< -o $@ -b

%.f2 : %.f1
	$(FC_SUGAR1) -i $<
	../front/combine-sections -i $< -o $@ -b

%.f3 : %.f2
	$(FC_SUGAR1) -i $<
	../front/variables-to-constructors -i $< -o $@ -b

%.f4 : %.f3
	$(FC_SUGAR1) -i $<
	../front/raise-annotations -i $< -o $@ -b

%.f5 : %.f4
	$(FC_SUGAR2) -i $<
	../front/define-lrules -i $< -o $@ -b 

%.f6 : %.f5
	$(FC_SUGAR2) -i $<
	../front/lift-dynamic-rules -i $< -o $@ -b

%.f6a : %.f6
	../front/stratego-desugar -i $< -o $@ -b

%.f7 : %.f6a
	../front/raise-annotations -i $< -o $@ -b


%.f8 : %.f7
	$(FC_SUGAR3) -i $<
	../front/use-def -i $< -o $@ -b 

%.f9 : %.f8
	../front/check-constructors -i $< -o $@ -b 

%.f10 : %.f9
	$(FC_SUGAR3) -i $<
	../front/expand-overlays -i $< -o $@ -b 

%.f11 : %.f10
	$(FC_SUGAR3) -i $<
	../front/rules-to-sdefs -i $< -o $@ -b 

%.f12 : %.f11
	$(FC_SUGAR3) -i $<
	../front/desugar-list-matching -i $< -o $@ -b 

%.f13 : %.f12
	$(FC_SUGAR4) -i $<
	../front/desugar-default-vardec -i $< -o $@ -b 

%.f14 : %.f13
	$(FC_SUGAR4) -i $<
	../front/introduce-congdefs -i $< -o $@ -b 

%.f15 : %.f14
	$(FC_SUGAR4) -i $<
	../lib/rename-vars -i $< -o $@ -b 

%.f16 : %.f15
	$(FC_SUGAR4) -i $<
	../front/desugar -i $< -o $@ -b 

%.f17 : %.f16
	$(FC_SUGAR5) -i $<
	../front/extract -i $< -o $@ -b

%.lib.f17 : %.f16
	$(FC_SUGAR5) -i $<
	../front/extract-all -i $< -o $@ -b

%.f18 : %.f17
	$(FC_SUGAR5) -i $<
	../front/stratego-warnings -i $< -o $@ -b -W all

%.f19 : %.f18
	$(FC_SUGAR5) -i $<
	../front/rename-defs -i $< -o $@ -b

## Simplification

%.f20 : %.f19
	$(FC_SUGAR5) -i $<
	../opt/simplify1 -i $< -o $@ -b

%.f21 : %.f20
	$(FC_CORE_CONG) -i $<
	../opt/define-congruences -i $< -o $@ -b

%.ff : %.tree
	$(FC_SUGAR_CONG) -i $<
	../front/frontend -i $< -o $@

%.lff : %.tree
	$(FC_SUGAR_CONG) -i $<
	../front/frontend --library -i $< -o $@

# OPTIMIZE ###########################################################

#%.s2.buv : %.s2
#	../opt/bound-unbound-vars -i $< -o $@ -b

#%.s2.ea : %.s2.buv
#	../opt/effects-analysis -i $< -o $@ -b

## Innermost fusion

#%.opt0: %.f21

%.opt0: %.ff
	$(FC_CORE) -i $<
	../opt/fusion  -i $< -o $@ -b --verbose 5

# Inlining

%.opt1 : %.opt0
	$(FC_CORE) -i $<
	../opt/worker-wrapper -i $< -o $@ -b

%.opt2 : %.opt1
	$(FC_CORE) -i $<
	../opt/inline -i $< -o $@ -b

%.opt3 : %.opt2
	$(FC_CORE) -i $<
	../opt/dead-def-elim -i $< -o $@ -b

%.opt4 : %.opt3
	$(FC_CORE) -i $<
	../opt/simplify1 -i $< -o $@ -b

## Pattern match compilation

%.opt5 : %.opt4
	$(FC_CORE) -i $<
	../match/compile-match -i $< -o $@ -b

%.opt6 : %.opt5
	../match/desugar-case -i $< -o $@ -b

## Cleaning up

%.opt7 : %.opt6
	../opt/const-prop -i $< -o $@ -b

%.opt8 : %.opt7
	../opt/bound-unbound-vars -i $< -o $@ -b

%.opt9 : %.opt8
	../opt/dead-var-elim -i $< -o $@ -b

%.opt10 : %.opt9
	../opt/simplify3 -i $< -o $@ -b

# Inlining
#
#%.s10 : %.s9 
#	../opt/inline -i $< -o $@ -b
#
#%.s11 : %.s10 
#	../opt/dead-def-elim -i $< -o $@ -b
#
### Second optimization
#
#%.s11.opt1 : %.s11 
#	../opt/simplify2 -i $< -o $@ -b
#
#%.s11.opt2 : %.s11.opt1 
#	../opt/const-prop -i $< -o $@ -b
#
#%.s11.opt3 : %.s11.opt2 
#	../opt/bound-unbound-vars -i $< -o $@ -b
#
#%.s11.opt4 : %.s11.opt3 
#	../opt/dead-var-elim -i $< -o $@ -b
#
#%.s11.opt : %.s11.opt4 
#	../opt/simplify3 -i $< -o $@ -b
#
#%.s11.check: %.s11.opt
#	../sig/Stratego-Optimized-Format -i $< -o $@ -b
#
#
#
# OLD BACK-END ###########################################################
# 
# %.b1 : %.opt6
# 	$(FC_CORE) -i $<
# 	../opt/canonicalize -i $< -o $@ -b
# 
# %.b2 : %.b1
# 	$(FC_CORE) -i $<
# 	../opt/lift-definitions -i $< -o $@ -b
# 
# %.b3 : %.b2
# 	$(FC_CORE) -i $<
# 	../opt/simplify1 -i $< -o $@ -b
# 
# %.b4 : %.b3
# 	$(FC_CORE) -i $<
# 	../opt/bound-unbound-vars -i $< -o $@ -b
# 
# %.ac : %.b4
# 	$(FC_CORE) -i $<
# 	../c/s2c -i $< -o $@  $(CINCLUDES) -b
# 
# %.c.abox : %.ac
# 	$(FC_C) -i $<
# 	$(GPP)/bin/ast2abox -p $(C_TOOLS)/share/c-tools/C-pretty.pp -i $< -o $@
# 
# %.c.abox.check : %.c.abox
# 	abox-format -i $< 
# 
# %.c : %.c.abox 
# 	$(GPP)/bin/abox2text -i $< -o $@
# 
# BACK-END ###########################################################


%.b1 : %.opt6
	$(FC_CORE) -i $<
	../opt/lift-definitions -i $< -o $@ -b

%.b2 : %.b1
	$(FC_CORE) -i $<
	../opt/canonicalize-ng -i $< -o $@ -b

%.b3 : %.b2
	$(FC_CORE) -i $<
	../opt/simplify1 -i $< -o $@ -b

%.b4 : %.b3
	$(FC_CORE) -i $<
	../opt/bound-unbound-vars -i $< -o $@ -b

%.b5 : %.b4
	$(FC_CORE) -i $<
	../c/escaping-variables -i $< -o $@ -b

%.ac : %.b5
	$(FC_CORE) -i $<
	../c/s2c-ng -i $< -o $@  $(CINCLUDES) -b

%.c.abox : %.ac
	$(FC_C) -i $<
	$(GPP)/bin/ast2abox -p $(C_TOOLS)/share/c-tools/C-pretty.pp -i $< -o $@

%.fcc : %
	$(formatcheck)  -b --rtg-nf $(C_TOOLS)/share/c-tools/C.rtg-nf -o /dev/null -i $<

%.c.abox.check : %.c.abox
	abox-format -i $< 

%.ccc : %.c.abox 
	$(GPP)/bin/abox2text -i $< -o $@

# USING INSTALLED STRC ###############################################

%.c: %.str
	../../tools/strc $(SINCLUDES) $(SCFLAGS) -i $< -c -o $@ --verbose 3
#--keep 10

%.io: %.ic
	$(CC) $(DEFS) $(CINCL) -g -c $*.c -O4
	cp $*.o $@

%.ibin : %.io $($*OBJECTS)
	-$(MAKE) $< $($*OBJECTS)
	$(LINK) $*.o $($*OBJECTS) $(SCLibs)

#$(CC) -o $@ -g $*.o $($*OBJECTS) $(SCLibs)

%.ilib: %.str
	../../tools/strc $(SINCLUDES) $(SCFLAGS) -i $< -o $@ --verbose 3 --library

lib%.c : %.str
	../../tools/strc $(SINCLUDES) $(SCFLAGS) -i $< -c -o $@ --verbose 3 --library

%.irun: %.ibin
	./$<
