# Makefile for ~miro/src/lib/parse

#
#/*****************************************************************************
#                Copyright Carnegie Mellon University 1992
#
#                      All Rights Reserved
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
# provided that the above copyright notice appear in all copies and that
# both that copyright notice and this permission notice appear in
# supporting documentation, and that the name of CMU not be
# used in advertising or publicity pertaining to distribution of the
# software without specific, written prior permission.
#
# CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
# CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
# SOFTWARE.
#*****************************************************************************/
#

include $(TOPLEVEL)/Makefile.include

# prefix for lex and yacc files
LEXYACC		= iff

LIB_NAME =	parse
OUTPUT_LIB =	$(OBJECT_DIR)/$(LIB_NAME).a
LINT_LIB =	$(OBJECT_DIR)/llib-l$(LIB_NAME).ln
SOURCE =	id-hash.c error.c mem.c parser.c
HEADERS =	$(SOURCE:.c=.h)
OBJ =		$(SOURCE:.c=.o)
OBJECTS =	$(OBJ;.*;$(OBJECT_DIR)/&)
ALL_OBJECTS =	$(OBJECTS) $(OBJECT_DIR)/$(LEXYACC).l.o \
		$(OBJECT_DIR)/$(LEXYACC).y.o
GLOBALS =	parser.g
ALL_SOURCE =	$(SOURCE) $(LEXYACC).l $(LEXYACC).y
OBJ_SOURCE =	$(SOURCE;.*;$(OBJ_SOURCE_DIR)/&)
C_SOURCE =	$(OBJ_SOURCE) $(LEXYACC).l.c $(LEXYACC).y.c
LINT_SOURCE =	$(SOURCE) $(OBJECT_DIR)/$(LEXYACC).l.c \
		$(OBJECT_DIR)/$(LEXYACC).y.c

# Lint Flags
# LINT_FLAGS = -abchx
LINT_FLAGS = -abh -I$(OBJECT_DIR)

# Use the following def for debugging:
# CFLAGS = -g -I$(INCLUDE_DIR)/ -DDEBUG

# Use the following defs for profiling execution:
# CFLAGS = -g -I$(INCLUDE_DIR)/
# LDFLAGS = -p

# Use the following defs for optimization:
CFLAGS = -O2 -I$(INCLUDE_DIR)/
# LDFLAGS = -s

LDFLAGS = -L$(TOPLEVEL)/../lib/

all: $(OUTPUT_LIB)

$(OUTPUT_LIB): $(ALL_OBJECTS)
	ar ruc $(OUTPUT_LIB) $>
	ranlib $(OUTPUT_LIB)

$(LINT_LIB) lintlib: $(ALL_SOURCE) $(HEADERS) $(GLOBALS)
	cd $(OBJECT_DIR) ; lint -C$(LIB_NAME) $(C_SOURCE)

$(OBJECT_DIR)/$(LEXYACC).y.o: $(OBJECT_DIR)/$(LEXYACC).y.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/$(LEXYACC).y.o \
	      $(OBJECT_DIR)/$(LEXYACC).y.c

$(OBJECT_DIR)/$(LEXYACC).l.o: $(OBJECT_DIR)/$(LEXYACC).l.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/$(LEXYACC).l.o \
	      $(OBJECT_DIR)/$(LEXYACC).l.c

$(OBJECT_DIR)/$(LEXYACC).y.c $(OBJECT_DIR)/$(LEXYACC).y.h: $(LEXYACC).y
	cd $(OBJECT_DIR) ; yacc -d $(OBJ_SOURCE_DIR)/$(LEXYACC).y ; \
	mv y.tab.c $(LEXYACC).y.c ; mv y.tab.h $(LEXYACC).y.h

$(OBJECT_DIR)/$(LEXYACC).l.c: $(LEXYACC).l
	cd $(OBJECT_DIR) ; lex $(OBJ_SOURCE_DIR)/$(LEXYACC).l ; \
	mv lex.yy.c $(LEXYACC).l.c

# override the 'foo.c -> foo' rule so it does nothing
.c:

# .SUFFIXES: .out .u .s .c .f .e .r .y .l .p
# 
# .c.u:
#	cc -j $(CFLAGS) $*.c

lint:
	lint $(LINT_FLAGS) $(LINT_SOURCE)

wc:
	wc $(GLOBALS) $(HEADERS) $(ALL_SOURCE)

clean:
	rm -f $(ALL_OBJECTS)

FOURCE:

# Header File Dependencies
include $(TOPLEVEL)/../libi/make/parse-headers

# Object files depending on header files
$(OBJECT_DIR)/$(LEXYACC).l.o	: $(MEM_H) $(PARSER_H) $(PARSER_G) \
				  $(OBJECT_DIR)/$(LEXYACC).y.h

$(OBJECT_DIR)/$(LEXYACC).y.o	: $(ID_HASH_H) $(PARSER_H) $(PARSER_G) \
				  $(MEM_H) $(ERROR_H)

$(OBJECT_DIR)/id-hash.o	: $(MEM_H) $(ID_HASH_H) id-hash.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/id-hash.o id-hash.c

$(OBJECT_DIR)/error.o		: $(ERROR_H) $(MEM_H) $(PARSER_H) $(PARSER_G) \
				  error.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/error.o error.c

$(OBJECT_DIR)/mem.o		: $(MEM_H) mem.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/mem.o mem.c

$(OBJECT_DIR)/parser.o	: $(PARSER_H) $(EXTRACT_H) $(MEM_H) \
			  $(OBJECT_DIR)/$(LEXYACC).y.h parser.c
	$(CC) $(CFLAGS) -I$(OBJECT_DIR) -c -o $(OBJECT_DIR)/parser.o parser.c

