PROGRAMS = cpp cc1
o	 = .o
LDOBJS   = _object$o Object$o Object-imp$o Object-lib$o token$o scan$o eval$o preprocess$o
LDLIBS   = -lstdc++ -lreadline
SHOBJS	 = 

#IDC  = idc -v -k -p -I..
IDC  = idc -Wc,-pipe -I..

all : $(PROGRAMS)

.SUFFIXES :
.PRECIOUS : %.o

%.so : %.st
	$(IDC) -s $<

%.o : %.st
	$(IDC) -c $<

%.o : ../%.st
	$(IDC) -o $@ -c $<

cpp.o : cpp.st
	$(IDC) -c -m $<

cc1.o : cc1.st
	$(IDC) -c -m $<

%  : %.o $(LDOBJS)
	$(IDC) -o $@ $< $(LDOBJS) $(LDLIBS)

run : cptests c1tests

CPTESTS_C = $(wildcard test/cp*.c)
CPTESTS_R = $(CPTESTS_C:.c=.c.ref)

cptests : cpp $(CPTESTS_R)
	for i in $(CPTESTS_C); do \
	  ./cpp -E -P $$i >$$i.out ;\
	  diff -qs -Bbd $$i.ref $$i.out || diff -Bbd $$i.ref $$i.out ;\
	done

C1TESTS_C = $(wildcard test/c1*.c)

c1tests : cc1
	for i in $(C1TESTS_C); do \
	  ./cc1 -E -P $$i >$$i.out ;\
	  diff -qs -Bbd $$i.ref $$i.out || diff -Bbd $$i.ref $$i.out ;\
	done

### GCC fails to produce correct output for some of the examples in the standard

%.c.ref : %.c.std
	cp $< $@

%.c.ref : %.c
	gcc -E -P $< >$@ 2>/dev/null

stats : .FORCE
	sort -u $(LDOBJS:$o=.st) | wc -l

tidy: .FORCE
	rm -f *~

clean : tidy .FORCE
	rm -f $(PROGRAMS) $(LIBS) *.exe *.so.c *.so *.o.c *.o .gdb* *.a test/*.out test/*.ref

spotless : clean .FORCE

.FORCE :
