# =============================================================================
# $Id: Makefile,v 1.59 2001/02/19 21:48:12 jimb Exp $
# Author		: Jim Brooks	<jim@jimbrooks.org>
# Description	: Makefile for "hypersrc".
# =============================================================================

# Where to install.
#
ifeq ($(USER),root)
		INSTALL_DIR=/usr/local/bin
else
		INSTALL_DIR=$(HOME)/bin
endif

C_SRCS_		=	main.c		\
				widgets.c	\
                handlers.c	\
				list.c		\
                history.c   \
			    text.c		\
			    hilite.c	\
                notebook.c  \
                prefs.c     \
				find.c		\
		        popup.c		\
                statusbar.c \
                focusbar.c  \
		        tags.c		\
		        menu.c      \
		        toolbar.c   \
		        file.c		\
		        module.c	\
		        treefunc.c	\
		        utils.c		\
		        sort.c		\
                sys_unix.c

# Define SPEED to disable extra checks (or use "make speed").
#
#SPEED = y
ifdef SPEED
C_OPTS += -DHYPERSRC_SPEED
endif

# For releases.
#
ifndef DEBUG
RELEASE = y
endif

# This directory holds the output of compilation.
#
OUT			= out

# Optimization must be enabled to inline functions.
#
ifdef SPEED
C_OPTIMIZE = -O3 -finline-functions
else

ifndef DEBUG
C_OPTIMIZE = -O2 -finline-functions
else
C_OPTIMIZE = -O
endif

endif

# *** DEPRECATED *** -- threaded code was removed (but could be reinstated)
# Define THREADS to enable multi-threading.
#
#THREADS = y
#ifdef THREADS
#LIBS		+= -lpthread -lgthread
#C_OPTS		+= -D_REENTRANT -DHYPERSRC_THREADS
#endif

# For debugging.
#
ifdef DEBUG
C_DEBUG		= -g
C_OPTS		+= -DHYPERSRC_DEBUG
C_SRCS_		+= debug.c
endif

# This will compile pedantic self-checks (at expense of speed).
# Though, a few critical self-checks are always compiled.
#
ifndef SPEED
C_OPTS		+= -DHYPERSRC_PEDANTIC
endif

# This will enable profiling (for gprof).
#
ifdef PROFILE
PROF_OPTS	= -pg
endif

# Controls whether g_assert() will be compiled.
# Without g_assert(), program will run faster but skips checks.
#
ifdef SPEED
C_OPTS		+= -DG_DISABLE_ASSERT
endif

# Compiler warnings.
#
C_WARNINGS	= -Wall
ifdef DEBUG
C_WARNINGS	+= -Wshadow
endif

# -----	editing the rest should usually be unnecessary ------------------------

CC			= gcc -c
CC_FLAGS	= $(PROF_OPTS) $(C_DEBUG) $(C_OPTIMIZE) $(C_OPTS) $(C_WARNINGS) -ansi -pipe `gtk-config --cflags` `gnome-config --cflags gnomeui` -Isrc
LD			= gcc
LD_FLAGS	= $(PROF_OPTS) -pipe `gtk-config --libs` `gnome-config --libs gnomeui`
C_SRCS		= $(addprefix src/,$(C_SRCS_))
C_OBJS_		= $(C_SRCS_:.c=.o)
C_OBJS		= $(addprefix $(OUT)/,$(C_OBJS_))

all:		$(OUT)  $(OUT)/hypersrc

release:
		@$(MAKE) RELEASE=y

speed:
		@$(MAKE) SPEED=y

debug:
		@$(MAKE) DEBUG=y

profile:
		@$(MAKE) PROFILE=y

profile_speed:
		@$(MAKE) PROFILE=y SPEED=y

$(OUT):
		mkdir $(OUT)

$(OUT)/hypersrc:  $(C_OBJS)  $(OUT)/libparser.a
		$(LD) -o $(OUT)/hypersrc $(C_OBJS) $(LD_FLAGS) $(LIBS) $(OUT)/libparser.a

$(OUT)/%.o:     src/%.c
		$(CC) -o $@ $(CC_FLAGS) $(subst $(OUT)/,src/,$<)

# -----------------------------------------------------------------------------
# parser (lex/yacc code that builds func graph/tree)
#
# The faster flex options are commented-out because on flex 2.5.4 the options
# cause a hang (-F causes a crash) when /usr/src/sys/dev/si/si2_z280.c
# (a large table in FreeBSD 4.2) is browsed.
# -----------------------------------------------------------------------------

PARSER_H_FILES	= src/parser.h  src/str_heap.h  src/treefunc.h

YACC			= bison -d --file-prefix=y
#FLEX			= flex -i -Cfa		# (see note above)
#FLEX			= flex -i -B -F		# (see note above)
FLEX			= flex -i -B
AR				= ar cru

ifndef SPEED
C_OPTS_PARSER	= -DHYPERSRC_PEDANTIC
endif
CC_FLAGS_PARSER	= $(PROF_OPTS) $(C_DEBUG) $(C_OPTIMIZE) $(C_OPTS_PARSER) $(C_WARNINGS) -pipe -Isrc -I$(OUT)

$(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)/libparser.a  $(OUT)/lex.yy.o  $(OUT)/y.tab.o  $(OUT)/str_heap.o

$(OUT)/lex.yy.c:  src/parser.l  src/parser.y  $(PARSER_H_FILES)
		$(FLEX) src/parser.l
		mv lex.yy.[co]  $(OUT)

$(OUT)/y.tab.c:  src/parser.l src/parser.y  $(PARSER_H_FILES)
		$(YACC) src/parser.y
		mv  y.tab.[cho] $(OUT)

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

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

$(OUT)/str_heap.o:  src/str_heap.c  src/str_heap.h
		$(CC) -o $@ $(CC_FLAGS_PARSER) src/str_heap.c

# -----------------------------------------------------------------------------

depend:		$(OUT)
		touch $(OUT)/Makefile.depend-tmp
		makedepend  -Isrc  -Y -f$(OUT)/Makefile.depend-tmp  $(C_SRCS)  >/dev/null 2>/dev/null
		cat  $(OUT)/Makefile.depend-tmp  |  sed 's/src\//$(OUT)\//'  >  $(OUT)/Makefile.depend
		rm -f  $(OUT)/Makefile.depend-tmp.bak  $(OUT)/Makefile.depend-tmp

install:	$(INSTALL_DIR) uninstall
		@echo "------------------------------------------------------------------"
		@echo "Installing at $(INSTALL_DIR)"
		@echo "------------------------------------------------------------------"
		@
		@# Change paths in the script Hypersrc.pl according to install dir.
		@
		cat  Hypersrc.pl  \
		| sed 's|\$hypersrc = "hypersrc"|\$hypersrc = "${INSTALL_DIR}/hypersrc"|'  \
		| sed 's|\$ctags_pl = "ctags.pl"|\$ctags_pl = "${INSTALL_DIR}/ctags.pl"|'  >  $(INSTALL_DIR)/Hypersrc.pl
		chmod  +x  $(INSTALL_DIR)/Hypersrc.pl
		@
		cp  $(OUT)/hypersrc  $(INSTALL_DIR)
		cp  ctags.pl  $(INSTALL_DIR)

$(INSTALL_DIR):
		mkdir -p $(INSTALL_DIR)

# For DEVELOPMENT.
#
install_symlinks: uninstall
		@echo "------------------------------------------------------------------"
		@echo "Installing symlinks at $(INSTALL_DIR)"
		@echo "------------------------------------------------------------------"
		ln -s $${PWD}/$(OUT)/hypersrc $(INSTALL_DIR)/hypersrc
		ln -s $${PWD}/Hypersrc.pl     $(INSTALL_DIR)/Hypersrc.pl
		ln -s $${PWD}/ctags.pl        $(INSTALL_DIR)/ctags.pl

uninstall:
		rm -f $(INSTALL_DIR)/hypersrc
		rm -f $(INSTALL_DIR)/Hypersrc.pl
		rm -f $(INSTALL_DIR)/ctags.pl

clean: 
		rm -f  $(OUT)/*.[oach]  $(OUT)/hypersrc  $(OUT)/core  core  gmon.out
		rm -f  $(OUT)/y.tab.[cho]  $(OUT)/lex.yy.[cho]

clean-all realclean: clean
		rm -f  $(OUT)/*  src/TAGS
		if [ -d $(OUT) ] ; then rmdir $(OUT); fi

-include $(OUT)/Makefile.depend
