# Constantin Knizhnik
# Moscow Software Center
# Pascal to C/C++ compiler.
#

.SUFFIXES: .cxx .c .h .o .a

default : all

#
# Install path
#
INSTALL_LIB_DIR = /usr/lib
INSTALL_BIN_DIR = /usr/bin

#
# Target.
#

BINS =	ptoc cganal 
LIBS =  libptoc.a libXbgi.a 

#
# Chose compiler You prefer.
#

#CC =	cxx
CC =	gcc
CCFLAGS = -O5 -g -Wall -c
#CCFLAGS = -fno-exceptions -O5 -g -Wall -c

DEFINES = 
INCLUDES =	-I.

YACC =		bison -d -p zz 
LEX =		flex -i -F -8

#
# Chose linker You prefer.
#

LD =		$(CC)
#LDFLAGS =	-non_shared
LDFLAGS =	-static


AR =            ar
ARFLAGS =       -ru

#
# File lists.
#

INCS =		main.h token.h token.dpp nmtbl.h bring.h tpexpr.h trnod.h util.h

SRCS =		trnod.cxx nmtbl.cxx bring.cxx tpexpr.cxx util.cxx main.cxx parser.cxx lex.cxx token.cxx dprintf.cxx 

LIB_SRCS =      set.c paslib.c io.c

OBJS =		$(SRCS:.cxx=.o)

LIB_OBJS =      $(LIB_SRCS:.c=.o)

#
# Default way in which source files should be compiled.
#

.cxx.o : 
		$(CC) $(CCFLAGS) $(DEFINES) $(INCLUDES) -o $@ $<

.c.o : 
		$(CC) $(CCFLAGS) $(DEFINES) $(INCLUDES) -o $@ $<

#
# Custom targets.
#


$(OBJS) : $(INCS)

parser.cxx parser.h : parser.y 
		$(YACC) parser.y 
		mv parser.tab.c parser.cxx
		mv parser.tab.h parser.h

lex.cxx : lex.l 
		$(LEX) lex.l
		mv lex.yy.c lex.cxx

lex.o: lex.cxx token.h token.dpp
set.o: set.h ptoc.h 
array.o: array.h ptoc.h 
paslib.o: paslib.h ptoc.h
io.o: io.h ptoc.h 
analyse.o: analyse.cxx main.h

libptoc.a: $(LIB_OBJS)
	rm -f $@
	$(AR) $(ARFLAGS) $@ $(LIB_OBJS)
	ranlib $@

cganal : analyse.o
	$(LD) $(LDFLAGS) -o $@ analyse.o

ptoc : $(OBJS)
	$(LD) $(LDFLAGS) -o $@ $(OBJS)

libXbgi.a: 
	(cd Xbgi; make)

all : $(BINS) $(LIBS) 

clean:
	rm -f $(BINS) *.a a.out *.exe *.pdb *.lib *.tgz *.zip *.o lex.yy.c \
		parser.tab.* WinBGI/*.pdb yy.log core y.output parser.output *~
	(cd examples; make clean)
	(cd Xbgi; make clean)

tgz: clean
	(cd ..; tar cvzf ptoc.tgz ptoc)

copytgz: tgz
	mcopy -o ../ptoc.tgz a:

install: $(BINS) $(LIBS)
	cp $(BINS) $(INSTALL_BIN_DIR)	
	cp $(LIBS) $(INSTALL_LIB_DIR)
