# makefile for program ltx2x --- LaTeX to X autotagger
# November 1999
#
##################### Change the following for your setup
# The compiler
CC = gcc

# We use flex (or equivalent, but not lex) to generate the lexer
LEX = flex
# and the options
LEXFLAGS = -v

# We use bison (or equivalent) to generate the parser
YACC = bison
# and the options
YACCFLAGS = -y -d -v

# Libraries to be used
LIBS = -ly -ll -lm

# The root directory for the installation (e.g., /usr/local )
ROOTDIR = /opt/GNU/gnu

# Where to place the running code (e.g. /usr/local/bin )
BINDIR = ${ROOTDIR}/bin

# Where to place the manpage (e.g., /usr/local/man/man1 )
MANEXT = 1
MANDIR = ${ROOTDIR}/man/man${MANEXT}

# Just in case you want to change the name of the binary
# (and then you should also change the man page and documentation).
# So, do not change this.
PROG = ltx2x

# Where to place the user documentation (e.g., /usr/local/doc/ltx2x )
DOCDIR = ${ROOTDIR}/doc/${PROG}

# Where to place the example command tables (e.g., /usr/local/lib/config/ltx2x )
CTDIR = ${ROOTDIR}/lib/config/${PROG}

# The code checking program
LINT = lint

# Code checking program options
LINTOPTS = -achqux

# Assume getopt is present on the system
GETOPTC =
GETOPTO =
GETOPTH =
# If you do not have getopt already on your system, uncomment the next three linws
# GETOPTC = getopt.c
# GETOPTO = getopt.o
# GETOPTO = getopt.h


# The file copy command (copy but do not delete original)
COPY = cp

# The file move command (move and delete original)
MOVE = mv

# The file delete command
DELETE = rm

# The make directory (hierarchy) command
MAKEDIR = mkdirhier

# The stream editor command
SED = sed

# Command to write to the terminal (stdout)
ECHO = echo

################### You should not have to change anything after this
################### but read on just in case

# The source modules
L2XSRCS = l2xytab.c l2xlexyy.c l2xlib.c l2xacts.c l2xusrlb.c srchenv.c \
          ${GETOPTC}

INTSRCS = l2xirtne.c l2xistd.c l2xidecl.c l2xistmt.c l2xiexpr.c l2xiscan.c \
          l2xisymt.c l2xierr.c l2xiidbg.c l2xistup.c l2xixutl.c l2xixstm.c \
          l2xixxpr.c l2xixstd.c l2xidbug.c l2xisdcl.c l2xirexp.c listsetc.c

# The object modules
L2XOBJS = l2xytab.o l2xlexyy.o l2xlib.o l2xacts.o l2xusrlb.o srchenv.o \
          ${GETOPTO}

INTOBJS = l2xirtne.o l2xistd.o l2xidecl.o l2xistmt.o l2xiexpr.o l2xiscan.o \
          l2xisymt.o l2xierr.o l2xiidbg.o l2xistup.o l2xixutl.o l2xixstm.o \
          l2xixxpr.o l2xixstd.o l2xidbug.o l2xisdcl.o l2xirexp.o listsetc.o

OBJS = ${L2XOBJS} ${INTOBJS} 

# Link object code together into PROG
ltx2x : ${OBJS}
	${CC} -o ${PROG} ${OBJS} ${LIBS}

# Compile C source code into object code
getopt.o : getopt.c getopt.h
	${CC} -c getopt.c
l2xytab.o : l2xytab.c l2xlib.h l2xusrlb.h  l2xacts.h strtypes.h l2xcom.h
	${CC} -c l2xytab.c
l2xlexyy.o : l2xlexyy.c l2xytab.h l2xlib.h  l2xusrlb.h l2xcom.h
	${CC} -c l2xlexyy.c
l2xlib.o : l2xlib.c l2xytab.h strtypes.h l2xcom.h ${GETOPTH}
	${CC} -c l2xlib.c
l2xusrlb.o : l2xusrlb.c l2xlib.h l2xytab.h strtypes.h l2xcom.h
	${CC} -c l2xusrlb.c
l2xacts.o : l2xacts.c l2xusrlb.h l2xlib.h l2xytab.h strtypes.h l2xcom.h
	${CC} -c l2xacts.c
srchenv.o : srchenv.c srchenv.h
	${CC} -c srchenv.c

# Generate C code for parsing
l2xytab.c l2xytab.h: l2x.y
	@ ${ECHO} "Expect 10 shift/reduce conflicts to be reported"
	${YACC} ${YACCFLAGS} l2x.y
	${MOVE} y.tab.c l2xytab.c
	${MOVE} y.tab.h l2xytab.h

# Generate C code for lexing
l2xlexyy.c : l2x.l
	${LEX} ${LEXFLAGS} l2x.l
	${MOVE} lex.yy.c l2xlexyy.c

# stuff for interpreter modules

# compiler flags for analyze and execute programs
ANLFLAG = -Danalyze
RUNFLAG = -Dtrace

# interpreter commons

SOMEH = l2xicmon.h l2xierr.h l2xiscan.h l2xisymt.h licomsym.h l2xiidbg.h 
MOSTH= ${SOMEH} l2xiprse.h
ALLH = ${MOSTH} l2xicpr.h l2xiexec.h 

# interpreter setup

l2xistup.o : l2xistup.c ${ALLH}
	${CC} -c ${ANLFLAG} ${RUNFLAG} l2xistup.c

# The parser module

l2xirtne.o : l2xirtne.c ${ALLH}
	${CC} -c ${ANLFLAG} l2xirtne.c

l2xistd.o : l2xistd.c ${MOSTH}
	${CC} -c l2xistd.c

l2xidecl.o : l2xidecl.c ${MOSTH} l2xicpr.h
	${CC} -c ${ANLFLAG} l2xidecl.c

l2xistmt.o : l2xistmt.c ${ALLH}
	${CC} -c ${ANLFLAG} l2xistmt.c

l2xiexpr.o : l2xiexpr.c ${MOSTH} l2xicpr.h
	${CC} -c ${ANLFLAG} l2xiexpr.c

# scanner module

l2xiscan.o : l2xiscan.c ${SOME} l2xicpr.h
	${CC} -c ${ANLFLAG} l2xiscan.c

# symbol table module

l2xisymt.o : l2xisymt.c l2xicmon.h l2xierr.h l2xisymt.h licomsym.h l2xiidbg.h 
	${CC} -c l2xisymt.c

# executor module

l2xixutl.o : l2xixutl.c ${MOSTH} l2xiexec.h listsetc.h
	${CC} -c ${RUNFLAG} l2xixutl.c

l2xixstm.o : l2xixstm.c ${MOSTH} l2xiexec.h listsetc.h
	${CC} -c ${RUNFLAG} l2xixstm.c

l2xixxpr.o : l2xixxpr.c ${MOSTH} l2xiexec.h listsetc.h
	${CC} -c ${RUNFLAG} l2xixxpr.c

l2xixstd.o : l2xixstd.c ${MOSTH} l2xiexec.h listsetc.h
	${CC} -c ${RUNFLAG} l2xixstd.c

l2xidbug.o : l2xidbug.c ${SOMEH} l2xiexec.h listsetc.h
	${CC} -c ${RUNFLAG} l2xidbug.c

# error and miscellaneous module

l2xisdcl.o : l2xisdcl.c ${SOMEH} 
	${CC} -c ${ANLFLAG} ${RUNFLAG} l2xisdcl.c

l2xiidbg.o : l2xiidbg.c ${SOMEH} l2xiexec.h
	${CC} -c l2xiidbg.c

l2xirexp.o : l2xirexp.c l2xirexp.h 
	${CC} -c l2xirexp.c

listsetc.o : listsetc.c listsetc.h
	${CC} -c listsetc.c


# Checking the sources

# Original ltx2x
checkl2x :
	${LINT} ${LINTOPTS} -o l2x.lint ${L2XSRCS}
# Interpreter
checkinterp :
	${LINT} ${LINTOPTS} -o interp.lint ${INTSRCS}
# The lot!
checkall :
	${LINT} ${LINTOPTS} -o ltx2x.lint ${L2XSRCS} ${INTSRCS}


# only call make install if BINDIR has been set
install : ltx2x
	${MAKEDIR} ${BINDIR}
	${COPY} ${PROG} ${BINDIR}

# Edit the file man to replace DOCUMENTDIR by the actual directory
# where the user manual is to be placed, and CTDIR by the location
# of the example command table files.
# Then copy the manpage to the proper place
manpage :
	${SED} 's!DOCUMENTDIR!${DOCDIR}!; s!CTDIR!${CTDIR}!' man > tman
	${MAKEDIR} ${MANDIR}
	${COPY} tman ${MANDIR}/${PROG}.${MANEXT}

# Copy the user manuals to the proper place
doc :
	${MAKEDIR} ${DOCDIR}
	${COPY} ltx2x.tex ${DOCDIR}/${PROG}.tex
	${COPY} ltx2x.ps ${DOCDIR}/${PROG}.ps
	${COPY} ltx2x.txt ${DOCDIR}/${PROG}.txt
	${COPY} ltx2x.html ${DOCDIR}/${PROG}.html

# Copy the example command tables to their final location
ctables :
	${MAKEDIR} ${CTDIR}
	${COPY} ltx2x.ct ${CTDIR}/ltx2x.ct
	${COPY} detex.ct ${CTDIR}/detex.ct
	${COPY} remcom.ct ${CTDIR}/remcom.ct
	${COPY} l2h.ct ${CTDIR}/l2h.ct
	${COPY} bye.ct ${CTDIR}/bye.ct

# Do almost everything except clean up
all : ltx2x install manpage doc ctables

# call make clean to remove the compiled program, the object files, 
# info from YACC, and the edited version of the manpage
clean :
	- ${DELETE} ${PROG}
	- ${DELETE}  *.o
	- ${DELETE} y.output
	- ${DELETE} tman


#### For the printct program (best to do this after the ltx2x program)

# compile the printct program
# printct : printct.o getopt.o srchenv.o
#	${CC} -o printct printct.o getopt.o srchenv.o 
printct : printct.o srchenv.o ${GETOPTO}
	${CC} -o printct printct.o srchenv.o ${GETOPTO}

printct.o : printct.c strtypes.h l2xcom.h ${GETOPTH}
	${CC} -c printct.c

# call make installprintct to move the printct binary to its final location
installprintct :
	${COPY} printct ${BINDIR}

# call make cleanprintct to remove the compiled program and its object file
cleanprintct :
	- ${DELETE} printct
	- ${DELETE} printct.o
	- ${DELETE} srchenv.o
	- ${DELETE} getopt.o

testlist : testlist.o listsetc.o 
	${CC} -o testlist testlist.o listsetc.o -lm

testlist.o : testlist.c listsetc.h
	${CC} -c testlist.c