# $Id: GNUmakefile,v 1.8 2005/04/27 23:17:39 devel Exp $
# Author:		Jim Brooks <tools@jimbrooks.org>
# License:		GNU GENERAL PUBLIC LICENSE (GPL)
# Notes:
# -----------------------------------------------------------------------------

PROGNAME	= lwlint
SRC			= src
SRCLIB		= $(shell ./getlibdir.sh)
OUT			= out

INSTALL			= install
INSTALL_OWNER	=
INSTALL_BIN_DIR	= /usr/local/bin
INSTALL_MAN_DIR	= /usr/local/man/man1

CC_FLAGS	= -I$(SRC) -I$(SRCLIB) -I$(OUT) -O -Wall -Wshadow -Wuninitialized
CC			= gcc -c -Os
LD			= gcc -s
AR			= ar cru
RANLIB		= ranlib

YACC		= bison -d --file-prefix=y
# problems in hypersrc were encounted with these flex options
#FLEX		= flex -i -Cfa		# (see note above)
#FLEX		= flex -i -B -F		# (see note above)
FLEX		= flex -i -B

all devel release: msg $(OUT)/$(PROGNAME)

msg .NOTPARALLEL:
	@echo "---------------"
	@echo "Building lwlint"
	@echo "---------------"

$(OUT)/$(PROGNAME):  $(OUT)  $(OUT)/$(PROGNAME).o  $(OUT)/libparser.a
	$(LD) -o $@  $(OUT)/$(PROGNAME).o  $(OUT)/libparser.a

$(OUT)/$(PROGNAME).o: $(SRC)/lwlint.c  $(SRC)/lwlint.h
	$(CC) -o $@ $(CC_FLAGS) $(SRC)/lwlint.c

$(OUT)/libparser.a:  $(OUT)/y.tab.c  $(OUT)/lex.yy.c  $(OUT)/y.tab.o  $(OUT)/lex.yy.o  $(OUT)/str_heap.o
	$(AR)  $@  $(OUT)/lex.yy.o  $(OUT)/y.tab.o  $(OUT)/str_heap.o
	$(RANLIB)  $@

$(OUT)/lex.yy.c:  $(SRC)/parser.l  $(SRC)/parser.y  $(SRC)/parser.h  $(SRC)/lwlint.h
	$(FLEX) $(SRC)/parser.l
	mv lex.yy.[co] $(OUT)

$(OUT)/y.tab.c:  $(SRC)/parser.l $(SRC)/parser.y  $(SRC)/parser.h  $(SRC)/lwlint.h
	$(YACC) $(SRC)/parser.y
	mv y.tab.[cho] $(OUT)

$(OUT)/y.tab.o:  $(OUT)/y.tab.c
	$(CC) -o $@ $(CC_FLAGS) $(OUT)/y.tab.c

$(OUT)/lex.yy.o:  $(OUT)/lex.yy.c
	$(CC) -o $@ $(CC_FLAGS) $(OUT)/lex.yy.c

$(OUT)/str_heap.o:  $(SRCLIB)/str_heap.c  $(SRCLIB)/str_heap.h
	$(CC) -o $@ $(CC_FLAGS) $(SRCLIB)/str_heap.c

$(OUT):
	mkdir $(OUT)

install: $(OUT)/$(PROGNAME)
ifeq ($(USER),root)
	@echo "------------------------------------------------------------------"
	@echo "Installing at $(INSTALL_BIN_DIR)"
	@echo "------------------------------------------------------------------"
	$(INSTALL) -d -m 755 $(INSTALL_OWNER) $(INSTALL_BIN_DIR)
	$(INSTALL) -m 755 $(INSTALL_OWNER) $(OUT)/$(PROGNAME) $(INSTALL_BIN_DIR)
	@echo "------------------------------------------------------------------"
	@echo "Installing man page"
	@echo "------------------------------------------------------------------"
	$(INSTALL) -d -m 755 $(INSTALL_OWNER) $(INSTALL_MAN_DIR)
	$(INSTALL) -m 444 $(INSTALL_OWNER) lwlint.1 $(INSTALL_MAN_DIR)
else
	@
endif

uninstall:
ifeq ($(USER),root)
	rm -f $(INSTALL_BIN_DIR)/$(PROGNAME)
	rm -f $(INSTALL_MAN_DIR)/lwlint.1
else
	@
endif

clean: 
# Don't remove C files if SRC and OUT are the same!
ifneq ($(OUT),$(SRC))
ifneq ($(OUT),$(SRCLIB))
	rm -f  $(OUT)/*.[ch]
endif
endif
	rm -f  $(OUT)/*.[oa]  $(OUT)/$(PROGNAME)
	rm -f  $(OUT)/*core* core core.* $(OUT)/*gmon* *.gmon *.gmon
	rm -f  $(OUT)/y.tab.[cho]  $(OUT)/lex.yy.[cho]

distclean realclean clean-all: clean
	rm -f  $(OUT)/*  src/TAGS  makefile  GNUmakefile.config
	rm -f  src/*~   src/.#*
	rm -f  src/h/*~ src/h/.#*
	if [ -d $(OUT) ] ; then rmdir $(OUT); fi
