# Makefile for ~miro/src/bin/cpc
#
#/*****************************************************************************
#                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	=	pred

# use the gnu C compiler
# CC =		gcc

EXEC =		$(OBJECT_DIR)/cpc
SOURCE =	box-type.c compile.c extract-objs.c hints.c hds.c id-table.c \
		interval.c objs.c parse-pred.c rank.c top.c
OBJ =		$(SOURCE:.c=.o)
OBJECTS =	$(OBJ;.*;$(OBJECT_DIR)/&)
ALL_OBJECTS =	$(OBJECTS) $(OBJECT_DIR)/$(LEXYACC).l.o \
		$(OBJECT_DIR)/$(LEXYACC).y.o
GLOBALS =	parse-pred.g top.g
HEADERS =	$(SOURCE:.c=.h) attr.h var.h
ALL_SOURCE =	$(SOURCE) $(LEXYACC).l $(LEXYACC).y
C_SOURCE =	$(SOURCE) $(LEXYACC).l.c $(LEXYACC).y.c
LINT_SOURCE =	$(SOURCE) $(OBJDIR)/$(LEXYACC).l.c $(OBJDIR)/$(LEXYACC).y.c

MYLIBES =	$(LIB_DIR)/parse.a $(LIB_DIR)/extract.a
LIBES = 	-ll
ALL_LIBES =	$(MYLIBES) $(LIBES)
LINT_LIBES =	$(LIB_DIR)/llib-lparse.ln $(LIB_DIR)/llib-lextract.ln

# Turn on debugging or not
DEBUG = -DDEBUG

# Turn on assertion checking
ASSERT = -DASSERT

# Lint Flags
# LINT_FLAGS = -abchx -I$(OBJDIR)
LINT_FLAGS = -abh -I. -I$(OBJDIR) -I../../include $(DEBUG) $(ASSERT)

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

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

# Use the following def for normal compilation:
# CFLAGS = -I$(INCLUDE_DIR)/ $(DEBUG) $(ASSERT)

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

LDFLAGS = -L$(LIB_DIR)

all: $(EXEC)


$(EXEC): $(ALL_OBJECTS) $(MYLIBES)
	$(CC) -o $(EXEC) $(CFLAGS) $(LDFLAGS) $(ALL_OBJECTS) $(ALL_LIBES)
	chmod ugo+x $(EXEC)

$(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 ;\
	sed -f $(OBJ_SOURCE_DIR)/$(LEXYACC).y.sed < y.tab.h > $(LEXYACC).y.h ;\
	sed -f $(OBJ_SOURCE_DIR)/$(LEXYACC).y.sed < y.tab.c > $(LEXYACC).y.c ;\
	rm -f y.tab.h ; rm -f y.tab.c

$(OBJECT_DIR)/$(LEXYACC).l.c: $(LEXYACC).l
	cd $(OBJECT_DIR) ; lex  $(OBJ_SOURCE_DIR)/$(LEXYACC).l ;\
	sed -f $(OBJ_SOURCE_DIR)/$(LEXYACC).l.sed < lex.yy.c > \
	       $(LEXYACC).l.c ; rm -f lex.yy.c

ENUM_STRIP = enum.egrep

lint:
	lint $(LINT_FLAGS) $(LINT_SOURCE) $(LINT_LIBES)\
	  | egrep -v -f $(ENUM_STRIP)

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

clean:
	rm -f $(ALL_OBJECTS)

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

# Header File Dependencies
COMPILE_H	= compile.h
EXTRACT_OBJS_H  = extract-objs.h
PARSE_PRED_H	= parse-pred.h
PARSE_PRED_G	= parse-pred.g
RANK_H		= rank.h
TOP_H		= top.h
TOP_G		= top.g

ATTR_H		= $(PARSE_PRED_H) attr.h
HINTS_H		= $(PARSE_PRED_H) hints.h
BOX_TYPE_H	= $(ATTR_H) box-type.h
INTERVAL_H	= $(BOX_TYPE_H) interval.h
HDS_H		= $(HINTS_H) $(INTERVAL_H) hds.h
VAR_H		= $(INTERVAL_H) var.h
ID_TABLE_H	= $(ATTR_H) $(BOX_TYPE_H) $(VAR_H) id-table.h
OBJS_H          = $(PARSE_PRED_H) $(BOX_TYPE_H) $(HINTS_H) $(INTERVAL_H)\
		    $(HDS_H) $(VAR_H) $(ID_TABLE_H) objs.h

$(OBJECT_DIR)/$(LEXYACC).l.o	: $(MEM_H) $(PARSE_PRED_H) $(PARSE_PRED_G) \
				  $(OBJECT_DIR)/$(LEXYACC).y.h
$(OBJECT_DIR)/$(LEXYACC).y.o	: $(MEM_H) $(PARSE_H)

$(OBJECT_DIR)/box-type.o	: $(MEM_H) $(ERROR_H) $(ATTR_H) $(OBJS_H) \
				  $(BOX_TYPE_H) box-type.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/box-type.o box-type.c

$(OBJECT_DIR)/compile.o	: $(MEM_H) $(ERROR_H) $(RANK_H) $(COMPILE_H) $(TOP_G) \
			  $(PARSE_PRED_H) $(BOX_TYPE_H) $(INTERVAL_H) \
			  $(VAR_H) $(ID_TABLE_H) $(OBJS_H) compile.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/compile.o compile.c

$(OBJECT_DIR)/extract-objs.o	: $(MEM_H) $(ERROR_H) $(ID_HASH_H) \
				  $(PARSER_H) $(PARSER_G) $(EXTRACT_H) \
				  $(EXTRACT_OBJS_H) $(ATTR_H) $(BOX_TYPE_H) \
				  $(ID_TABLE_H) $(OBJS_H) extract-objs.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/extract-objs.o extract-objs.c

$(OBJECT_DIR)/hds.o		: $(MEM_H) $(ATTR_H) $(HINTS_H) $(HDS_H) \
				  $(ID_TABLE_H) $(OBJS_H) hds.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/hds.o hds.c

$(OBJECT_DIR)/hints.o		: $(MEM_H) $(ERROR_H) $(TOP_G) $(RANK_H) \
				  $(HINTS_H) $(ID_TABLE_H) $(OBJS_H) hints.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/hints.o hints.c

$(OBJECT_DIR)/id-table.o	: $(MEM_H) $(ATTR_H) $(BOX_TYPE_H) $(VAR_H) \
				  $(ID_TABLE_H) $(OBJS_H) id-table.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/id-table.o id-table.c

$(OBJECT_DIR)/interval.o	: $(MEM_H) $(TOP_G) $(PARSE_PRED_H) \
				  $(INTERVAL_H) $(ID_TABLE_H) $(OBJS_H) \
				  interval.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/interval.o interval.c

$(OBJECT_DIR)/objs.o		: $(MEM_H) $(ERROR_H) $(BOX_TYPE_H) \
				  $(INTERVAL_H) $(VAR_H) $(ID_TABLE_H) \
				  $(OBJS_H) objs.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/objs.o objs.c

$(OBJECT_DIR)/parse-pred.o	: $(MEM_H) $(OBJECT_DIR)/$(LEXYACC).y.h \
				  $(PARSE_PRED_H) $(PARSE_PRED_G) parse-pred.c
	$(CC) $(CFLAGS) -I$(OBJECT_DIR) -c -o $(OBJECT_DIR)/parse-pred.o \
	      parse-pred.c

$(OBJECT_DIR)/rank.o		: $(MEM_H) $(RANK_H) $(ATTR_H) $(HINTS_H) \
				  $(INTERVAL_H) $(VAR_H) $(OBJS_H) rank.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/rank.o rank.c

$(OBJECT_DIR)/top.o		: $(MEM_H) $(ID_HASH_H) $(PARSER_H) \
				  $(PARSER_G) $(PARSE_PRED_H) $(HINTS_H) \
				  $(ID_TABLE_H) $(OBJS_H) $(EXTRACT_OBJS_H) \
				  $(COMPILE_H) $(TOP_H) top.c
	$(CC) $(CFLAGS) -c -o $(OBJECT_DIR)/top.o top.c

