# MAKEFILE FOR (STAND_ALONE) CEM PREPROCESSOR

EMHOME=../..
MODULES=$(EMHOME)/modules
MODULESLIB=$(MODULES)/lib
BIN=$(EMHOME)/lib
MANDIR=$(EMHOME)/man

# Some paths

# Libraries
SYSLIB = $(MODULESLIB)/libsystem.a
STRLIB = $(MODULESLIB)/libstring.a
PRTLIB = $(MODULESLIB)/libprint.a
ALLOCLIB = $(MODULESLIB)/liballoc.a
ASSERTLIB = $(MODULESLIB)/libassert.a
MALLOC = $(MODULESLIB)/malloc.o
LIBS = $(PRTLIB) $(STRLIB) $(ALLOCLIB) $(MALLOC) $(ASSERTLIB) $(SYSLIB)
LIB_INCLUDES = -I$(MODULES)/h -I$(MODULES)/pkg

# Where to install the preprocessor
CEMPP = $(BIN)/cpp

# What C compiler to use and how
CC = cc
COPTIONS =
LDFLAGS = -i

# What parser generator to use and how
GEN = $(EMHOME)/bin/LLgen
GENOPTIONS =

# Special #defines during compilation
CDEFS =	$(LIB_INCLUDES)
CFLAGS = $(CDEFS) $(COPTIONS) -O#	# we cannot pass the COPTIONS to lint!

# Grammar files and their objects
LSRC =	tokenfile.g expression.g
LCSRC = tokenfile.c expression.c Lpars.c
LOBJ =	tokenfile.o expression.o Lpars.o

# Objects of hand-written C files
CSRC =	LLlex.c LLmessage.c ch7bin.c ch7mon.c domacro.c \
	error.c idf.c init.c input.c main.c options.c \
	preprocess.c replace.c scan.c skip.c tokenname.c next.c expr.c
COBJ =	LLlex.o LLmessage.o ch7bin.o ch7mon.o domacro.o \
	error.o idf.o init.o input.o main.o options.o \
	preprocess.o replace.o scan.o skip.o tokenname.o next.o expr.o

PRFILES = Makefile Parameters \
	make.hfiles make.tokcase make.tokfile LLlex.h bits.h file_info.h \
	idf.h input.h interface.h macro.h \
	class.h chtab.c char.tab expression.g $(CSRC)

# Objects of other generated C files
GOBJ =	char.o symbol2str.o

# generated source files
GSRC =	char.c symbol2str.c

# .h files generated by `make hfiles'; PLEASE KEEP THIS UP-TO-DATE!
GHSRC =	errout.h idfsize.h ifdepth.h lapbuf.h \
	nparams.h numsize.h obufsize.h \
	parbufsize.h pathlength.h strsize.h textsize.h \
	botch_free.h debug.h inputtype.h dobits.h line_prefix.h

# Other generated files, for 'make clean' only
GENERATED = tokenfile.g Lpars.h LLfiles LL.output lint.out \
	Xref hfiles cfiles charoffset.h

all:	cc

cc:	hfiles LLfiles
	make "EMHOME="$(EMHOME) cpp

hfiles: Parameters char.c charoffset.h
	./make.hfiles Parameters
	@touch hfiles

charoffset.h char.c:	chtab char.tab
	chtab -fchar.tab > char.c

LLfiles: $(LSRC)
	$(GEN) $(GENOPTIONS) $(LSRC)
	@touch LLfiles

tokenfile.g:	tokenname.c make.tokfile
	<tokenname.c ./make.tokfile >tokenfile.g

symbol2str.c:	tokenname.c make.tokcase
	<tokenname.c ./make.tokcase >symbol2str.c

chtab:	chtab.o
	$(CC) -o chtab chtab.o

# Objects needed for 'cpp'
OBJ =	$(COBJ) $(LOBJ) $(GOBJ)
SRC =	$(CSRC) $(LCSRC) $(GSRC)

cpp:	$(OBJ) Makefile
	$(CC) $(COPTIONS) $(LDFLAGS) $(OBJ) $(LIBS) -o cpp 
	size cpp

cfiles: hfiles LLfiles $(GSRC)
	@touch cfiles

install: all
	rm -f $(CEMPP)
	cp cpp $(CEMPP)
	rm -f $(MANDIR)/cpp.6
	cp cpp.6 $(MANDIR)/cpp.6

cmp:	all
	-cmp cpp $(CEMPP)
	-cmp cpp.6 $(MANDIR)/cpp.6

pr: 
	@pr $(PRFILES)

opr:
	make pr | opr

tags:	cfiles
	ctags $(SRC)

depend:	cfiles
	sed '/^#AUTOAUTO/,$$d' Makefile >Makefile.new
	echo '#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO' >>Makefile.new
	$(EMHOME)/bin/mkdep $(SRC) | \
		sed 's/\.c:/.o:/' >>Makefile.new
	mv Makefile Makefile.old
	mv Makefile.new Makefile
	
xref:
	ctags -x `grep "\.[ch]" Files`|sed "s/).*/)/">Xref
	
lint:	cfiles
	lint -bx $(CDEFS) $(SRC) >lint.out

clean:
	rm -f $(LCSRC) $(OBJ) $(GENERATED) $(GSRC) $(GHSRC) chtab.o chtab cpp Out

#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO
LLlex.o: LLlex.h
LLlex.o: Lpars.h
LLlex.o: bits.h
LLlex.o: charoffset.h
LLlex.o: class.h
LLlex.o: dobits.h
LLlex.o: file_info.h
LLlex.o: idf.h
LLlex.o: idfsize.h
LLlex.o: input.h
LLlex.o: inputtype.h
LLlex.o: numsize.h
LLlex.o: strsize.h
LLmessage.o: LLlex.h
LLmessage.o: Lpars.h
LLmessage.o: file_info.h
ch7bin.o: Lpars.h
ch7mon.o: Lpars.h
domacro.o: LLlex.h
domacro.o: Lpars.h
domacro.o: bits.h
domacro.o: botch_free.h
domacro.o: charoffset.h
domacro.o: class.h
domacro.o: debug.h
domacro.o: dobits.h
domacro.o: file_info.h
domacro.o: idf.h
domacro.o: idfsize.h
domacro.o: ifdepth.h
domacro.o: input.h
domacro.o: inputtype.h
domacro.o: interface.h
domacro.o: macro.h
domacro.o: nparams.h
domacro.o: parbufsize.h
domacro.o: textsize.h
error.o: LLlex.h
error.o: errout.h
error.o: file_info.h
idf.o: idf.h
init.o: charoffset.h
init.o: class.h
init.o: idf.h
init.o: interface.h
init.o: macro.h
input.o: file_info.h
input.o: input.h
input.o: inputtype.h
main.o: file_info.h
main.o: idfsize.h
options.o: charoffset.h
options.o: class.h
options.o: idf.h
options.o: idfsize.h
options.o: macro.h
preprocess.o: LLlex.h
preprocess.o: bits.h
preprocess.o: charoffset.h
preprocess.o: class.h
preprocess.o: dobits.h
preprocess.o: file_info.h
preprocess.o: idf.h
preprocess.o: idfsize.h
preprocess.o: input.h
preprocess.o: inputtype.h
preprocess.o: line_prefix.h
preprocess.o: obufsize.h
replace.o: LLlex.h
replace.o: charoffset.h
replace.o: class.h
replace.o: debug.h
replace.o: file_info.h
replace.o: idf.h
replace.o: input.h
replace.o: inputtype.h
replace.o: interface.h
replace.o: macro.h
replace.o: pathlength.h
replace.o: textsize.h
scan.o: charoffset.h
scan.o: class.h
scan.o: idf.h
scan.o: input.h
scan.o: inputtype.h
scan.o: interface.h
scan.o: lapbuf.h
scan.o: macro.h
scan.o: nparams.h
skip.o: LLlex.h
skip.o: charoffset.h
skip.o: class.h
skip.o: file_info.h
skip.o: input.h
skip.o: inputtype.h
tokenname.o: LLlex.h
tokenname.o: Lpars.h
tokenname.o: file_info.h
tokenname.o: idf.h
next.o: debug.h
expr.o: Lpars.h
tokenfile.o: Lpars.h
expression.o: LLlex.h
expression.o: Lpars.h
expression.o: file_info.h
Lpars.o: Lpars.h
char.o: charoffset.h
char.o: class.h
symbol2str.o: Lpars.h