include UtilsFlags.mk

LIBS = $(ULIBS)
FLAGS = $(OPT) 
CXXFLAGS = $(OPT) 
PURIFY = purify
PUREOPT = -chain-length=100 -verbose -windows=no 

LIB_SRC = Dict.cc StringDict.cc String.cc Input.cc Output.cc Managed.cc \
	SymbolTable.cc Generator.cc Mutex.cc ConfigFile.cc Time.cc List.cc \
	cSymbolTable.cc cStringDict.cc cConfigFile.cc Logger.cc \
	Type.cc Base.cc Format.cc FormatAction.cc FormatParser.cc \
	CustomSpec.cc VectorSpec.cc Token.cc Vec3d.cc Linear.cc Player.cc \
	message.cc BinLogger.cc BinPlayer.cc ConfigParser.cc \
	CannedDataRead.cc CannedDataWrite.cc CannedDataIndex.cc \
	CannedDataError.cc
OBJS = $(LIB_SRC:.cc=.o)
ALL_SRC = $(LIB_SRC) dict_test.cc config_test.cc sym_test.cc cdshift.cc \
		blog_test.cc bplay_test.cc cdcrunch.cc cddescribe.cc \
		bvlog_test.cc bvplay_test.cc message_test.cc parse_test.cc \
		cdexcise.cc cdsplit.cc log_time_test.cc
C_SRC = csym_test.c cdict_test.c cconfig_test.c

all: libutils.a $(CONFIG_H_DEST)/$(CONFIG_H) cdcrunch

ConfigParser.cc ConfigParser.h: ConfigParser.y
	$(BISONPP) -o ConfigParser.cc --defines ConfigParser.y

libutils.a: $(OBJS) $(CONFIG_H_DEST)/$(CONFIG_H)
	rm -f libutils.a
	$(AR)  cr libutils.a $(OBJS)
	$(RANLIB) libutils.a

cdcrunch: cdcrunch.o $(OBJS)
	$(CXXLD) $(LDFLAGS) cdcrunch.o $(OBJS) -o cdcrunch $(LIBS)

cdshift: cdshift.o $(OBJS)
	$(CXXLD) $(LDFLAGS) cdshift.o $(OBJS) -o cdshift $(LIBS)

cdexcise: cdexcise.o $(OBJS)
	$(CXXLD) $(LDFLAGS) cdexcise.o $(OBJS) -o cdexcise $(LIBS)

cdsplit: cdsplit.o $(OBJS)
	$(CXXLD) $(LDFLAGS) cdsplit.o $(OBJS) -o cdsplit $(LIBS)

cddescribe: cddescribe.o $(OBJS)
	$(CXXLD) $(LDFLAGS) cddescribe.o $(OBJS) -o cddescribe $(LIBS)

dict_test: dict_test.o $(OBJS)
	$(CXXLD) $(LDFLAGS) dict_test.o $(OBJS) -o dict_test $(LIBS)

parse_test: parse_test.o $(OBJS)
	$(CXXLD) $(LDFLAGS) parse_test.o $(OBJS) -o parse_test $(LIBS)

play_test: play_test.o $(OBJS)
	$(CXXLD) $(LDFLAGS) play_test.o $(OBJS) -o play_test $(LIBS)

log_test: log_test.o $(OBJS)
	$(CXXLD) $(LDFLAGS) log_test.o $(OBJS) -o log_test $(LIBS)

log_time_test: log_time_test.o $(OBJS)
	$(CXXLD) $(LDFLAGS) log_time_test.o $(OBJS) -o log_time_test $(LIBS)

list_test: list_test.o $(OBJS)
	$(CXXLD) $(LDFLAGS) list_test.o $(OBJS) -o list_test $(LIBS)

message_test: message_test.o $(OBJS)
	$(CXXLD) $(LDFLAGS) message_test.o $(OBJS) -o message_test $(LIBS)

blog_test: blog_test.o $(OBJS)
	$(CXXLD) $(LDFLAGS) blog_test.o $(OBJS) -o blog_test $(LIBS)

bplay_test: bplay_test.o $(OBJS)
	$(CXXLD) $(LDFLAGS) bplay_test.o $(OBJS) -o bplay_test $(LIBS)

bvlog_test: bvlog_test.o $(OBJS)
	$(CXXLD) $(LDFLAGS) bvlog_test.o $(OBJS) -o bvlog_test $(LIBS)

bvplay_test: bvplay_test.o $(OBJS)
	$(CXXLD) $(LDFLAGS) bvplay_test.o $(OBJS) -o bvplay_test $(LIBS)

bvlog_test.pure: bvlog_test.o $(OBJS)
	$(PURIFY) $(PUREOPT) \
	$(CXXLD) $(LDFLAGS) bvlog_test.o $(OBJS) -o bvlog_test.pure $(LIBS)

bvplay_test.pure: bvplay_test.o $(OBJS)
	$(PURIFY) $(PUREOPT) \
	$(CXXLD) $(LDFLAGS) bvplay_test.o $(OBJS) -o bvplay_test.pure $(LIBS)

blog_test.pure: blog_test.o $(OBJS)
	$(PURIFY) $(PUREOPT) \
	$(CXXLD) $(LDFLAGS) blog_test.o $(OBJS) -o blog_test.pure $(LIBS)

bplay_test.pure: bplay_test.o $(OBJS)
	$(PURIFY) $(PUREOPT) \
	$(CXXLD) $(LDFLAGS) bplay_test.o $(OBJS) -o bplay_test.pure $(LIBS)

sym_test: sym_test.o $(OBJS)
	$(CXXLD) $(LDFLAGS) sym_test.o $(OBJS) -o sym_test $(LIBS)

sym_test.pure: sym_test.o $(OBJS)
	$(PURIFY) $(PUREOPT) \
	$(CXXLD) $(LDFLAGS) sym_test.o $(OBJS) -o sym_test.pure $(LIBS)

csym_test: csym_test.o $(OBJS)
	$(CC) $(LDFLAGS) csym_test.o $(OBJS) -o csym_test $(LIBS) $(CLIBS)

cdict_test: cdict_test.o $(OBJS)
	$(CC) $(LDFLAGS) cdict_test.o $(OBJS) -o cdict_test $(LIBS) $(CLIBS)

config_test: config_test.o $(OBJS)
	$(CXXLD) $(LDFLAGS) config_test.o $(OBJS) -o config_test $(LIBS)

config_test.pure: config_test.o $(OBJS)
	$(PURIFY) $(PUREOPT) \
	$(CXXLD) $(LDFLAGS) config_test.o $(OBJS) -o config_test.pure $(LIBS)

cconfig_test: cconfig_test.o $(OBJS)
	$(CC) $(LDFLAGS) cconfig_test.o $(OBJS) -o cconfig_test $(LIBS) \
		$(CLIBS)

form_test: form_test.o $(OBJS)
	$(CXXLD) $(LDFLAGS) form_test.o $(OBJS) -o form_test $(LIBS)

form_test.pure: form_test.o $(OBJS)
	$(PURIFY) $(PUREOPT) \
	$(CXXLD) $(LDFLAGS) form_test.o $(OBJS) -o form_test.pure $(LIBS)

clean: 
	rm -f *.o *.a *_test *_test.pure cdcrunch cddescribe

distclean: clean
	rm -rf *~ config.cache config.status UtilsFlags.mk \
		config.log include/$(MACHDEP) *.d

%.d: %.cc $(CONFIG_H_DEST)/$(CONFIG_H)
	@echo Generating dependencies for $<
	@$(SHELL) -ec '$(CXX) -M $(CPPFLAGS) $< \
	              | sed '\''s/\($*\.o\)[ :]*/\1 $@ : /g'\'' > $@ '

%.d: %.c $(CONFIG_H_DEST)/$(CONFIG_H)
	@echo Generating dependencies for $<
	@$(SHELL) -ec '$(CC) -M $(CPPFLAGS) $< \
	              | sed '\''s/\($*\.o\)[ :]*/\1 $@ : /g'\'' > $@ '

$(CONFIG_H_DEST)/$(CONFIG_H): $(CONFIG_H)
	cp $(CONFIG_H) $(CONFIG_H_DEST)/$(CONFIG_H)

$(LIB_DEST_DIR)/libutils.a: libutils.a
	@if test ! -d $(LIB_DEST_DIR); then \
		echo "Creating directory $(LIB_DEST_DIR)"; \
		mkdir -p $(LIB_DEST_DIR); \
		chmod $(DIRMODE) $(LIB_DEST_DIR); \
	fi
	$(INSTALL_DATA) libutils.a $(LIB_DEST_DIR)
	$(RANLIB) -t $(LIB_DEST_DIR)/libutils.a

libinstall: $(INSTALL_LIB) 

INCLUDE_DIR = $(INSTALL_DIR)/include/utils
TOOL_DIR = $(INSTALL_DIR)/include/maketools
INSTALL_DIRS = $(INSTALL_DIR)/include $(INCLUDE_DIR) \
		$(INCLUDE_DIR)/formatting $(INSTALL_DIR)/include/$(MACHDEP) \
		$(INSTALL_DIR)/lib $(INSTALL_DIR)/bin
CONFIG_DIR = $(INSTALL_DIR)/include/$(MACHDEP)
FLAG_FILE = $(CONFIG_DIR)/libutils.mk

dirinstall:
	@for i in $(INSTALL_DIRS); \
	do \
		if test ! -d $$i; then \
			echo "Creating directory $$i"; \
			mkdir $$i; \
			chmod $(DIRMODE) $$i; \
		else	true; \
		fi; \
	done

incinstall:
	@echo "UTILS_LIB_FLAGS = -L$(LIB_DEST_DIR)" > $(FLAG_FILE)
	@echo "UTILS_LIBS = -lutils $(LIBS)" >> $(FLAG_FILE)
	@for i in $(srcdir)/include/utils/*.h; \
	do \
		echo $(INSTALL_DATA) $$i $(INCLUDE_DIR); \
		$(INSTALL_DATA) $$i $(INCLUDE_DIR); \
	done
	@for i in $(srcdir)/include/utils/formatting/*.h; \
	do \
		echo $(INSTALL_DATA) $$i $(INCLUDE_DIR); \
		$(INSTALL_DATA) $$i $(INCLUDE_DIR)/formatting; \
	done
	$(INSTALL_DATA) $(CONFIG_H_DEST)/$(CONFIG_H) $(CONFIG_DIR)
	@if test $(srcdir) = "."; then \
		echo $(INSTALL_DATA) $(CONFIG_H_DEST)/$(CONFIG_H) \
			$(INSTALL_DIR)/include; \
		$(INSTALL_DATA) $(CONFIG_H_DEST)/$(CONFIG_H) \
			$(INSTALL_DIR)/include; \
	fi
	$(INSTALL_DATA) $(srcdir)/Makefile.intf.in  $(TOOL_DIR)/Makefile.in
	$(INSTALL_DATA) $(srcdir)/config.cc.in  $(TOOL_DIR)
	$(INSTALL_PROGRAM) $(srcdir)/makesetup  $(TOOL_DIR)
	$(INSTALL_DATA) UtilsFlags.mk $(CONFIG_DIR)

bininstall: cdcrunch cddescribe cdsplit
	$(INSTALL_PROGRAM) cdcrunch $(INSTALL_DIR)/bin
	$(INSTALL_PROGRAM) cddescribe $(INSTALL_DIR)/bin
	$(INSTALL_PROGRAM) cdsplit $(INSTALL_DIR)/bin
	$(INSTALL_PROGRAM) reconfigure $(INSTALL_DIR)/bin
	$(INSTALL_PROGRAM) ../configaux/config.guess $(INSTALL_DIR)/bin

install: dirinstall libinstall incinstall bininstall

-include $(ALL_SRC:.cc=.d)
-include $(C_SRC:.c=.d)
