# Locations:
#
PREFIX		= /usr
BIN_DIR		= $(PREFIX)/bin
LIB_DIR		= $(PREFIX)/lib
MAN1_DIR	= $(PREFIX)/man/man1
MAN3_DIR	= $(PREFIX)/man/man3
EDV_ARCH_DIR	= $(PREFIX)/lib/endeavour2
EDV_INCLUDE_DIR	= $(PREFIX)/lib/endeavour2/include
EDV_LIB_DIR	= $(PREFIX)/lib/endeavour2/lib
LIB		= libendeavour2-base.so
LIB_CFG_BIN	= endeavour2-base-config
LIB_CFG_MAN	= endeavour2-base-config.1.bz2


# Compiler Flags:
#
CFLAGS		= -Wall -O2 -g -fPIC
CFLAGS		+= `glib-config --cflags`
CPPFLAGS	= -D__cplusplus -Dc_plusplus


# Include Directories:
#
INC_DIRS	= -I..


# Libraries & Library Directories:
#
LIBS		= `glib-config --libs`
LIB_DIRS	=


# Compilers:
#
CC		= cc
CPP		= c++


# Programs:
#
LS		= ls
LSFLAGS		= -s -h -c --color=auto

RM		= rm
RMFLAGS		= -f

MOVE		= mv
MOVEFLAGS	= -f

MKDIR		= mkdir
MKDIRFLAGS	= -p -m 0755

LINK		= ln
LINKFLAGS	= -s -f

INSTALL		= install
INSTBINFLAGS	= -m 0755 -s
INSTDATFLAGS	= -m 0644
INSTINCFLAGS	= -m 0644
INSTLIBFLAGS	= -m 0755 -s
INSTMANFLAGS	= -m 0644

LDCONFIG	= ldconfig


# Source List:
#
include Makefile.srclist


# Compile Time Information Output:
#
EXPORT_COMPILETIMEINFO_H	= /bin/echo -n -e "\
\#ifndef COMPILETIMEINFO_H\n\
\#define COMPILETIMEINFO_H\n\
\#define COMPILE_COMPILER\t\"`$(CPP) --version | tr '\n' ' '`\"\n\
\#define COMPILE_USER\t\t\"$(USER)\"\n\
\#define COMPILE_LOCATION\t\"`uname -n`\"\n\
\#define COMPILE_DATE\t\t`date +\"%s\"`\n\
\#endif\t/* COMPILETIMEINFO_H */\n"


# Build Rules:
#
OBJ_C	= $(SRC_C:.c=.o)
OBJ_CPP	= $(SRC_CPP:.cpp=.o)
.c.o:
	@echo "Compiling module $*.o"
	@+$(CC) -c $*.c $(INC_DIRS) $(CFLAGS)
.cpp.o:
	@echo "Compiling module $*.o"
	@+$(CPP) -c $*.cpp $(INC_DIRS) $(CFLAGS) $(CPPFLAGS)


$(LIB): prebuild config modules $(LIB_CFG_BIN) postbuild

config:
	@echo "Compiling resources"
	@$(EXPORT_COMPILETIMEINFO_H) > compiletimeinfo.h

modules: $(OBJ_C) $(OBJ_CPP)
	@echo -n "Linking modules..."
	@$(CPP) $(OBJ_C) $(OBJ_CPP) $(OBJ_SO) $(LIB_DIRS) $(LIBS) -shared -o $(LIB)
	@echo -n "   "
	@-$(LS) $(LSFLAGS) $(LIB)

prebuild:
	@echo "Building library \"$(LIB)\"..."

postbuild:
	@echo "Build done."

$(LIB_CFG_BIN):
	@echo -n "Compiling configuration program..."
	@$(CC) -O2 -g -Wall $(LIB_CFG_BIN).c \
	-o $(LIB_CFG_BIN)
	@echo -n "   "
	@-$(LS) $(LSFLAGS) $(LIB_CFG_BIN)

all: $(LIB)


# Install Rules:
#
HR = "-------------------------------------------------------------------------"

install: preinstall install_lib install_data install_devel install_man postinstall

preinstall:
	@-$(RM) $(RMFLAGS) $(EDV_INCLUDE_DIR)/edvcfg.h
	@-$(RM) $(RMFLAGS) $(EDV_INCLUDE_DIR)/edvcfgfio.h
	@-$(MOVE) $(MOVEFLAGS)					\
		$(BIN_DIR)/endeavour2-config			\
		$(BIN_DIR)/$(LIB_CFG_BIN)
	@-$(MOVE) $(MOVEFLAGS)					\
		$(MAN1_DIR)/endeavour2-config.1.bz2		\
		$(MAN1_DIR)/$(LIB_CFG_MAN)
	@-$(MOVE) $(MOVEFLAGS)					\
		$(EDV_LIB_DIR)/libendeavour2.so			\
		$(LIB_DIR)/libendeavour2.so
	@echo "Installing \"$(LIB)\"..."
	@$(MKDIR) $(MKDIRFLAGS) $(EDV_ARCH_DIR)

install_lib:
	@echo "Installing $(LIB) -> $(LIB_DIR)"
	@$(MKDIR) $(MKDIRFLAGS) $(LIB_DIR)
	@$(INSTALL) $(INSTLIBFLAGS) $(LIB) $(LIB_DIR)

install_data:
	@echo "Installing data files to $(EDV_ARCH_DIR)"
	@$(INSTALL) $(INSTDATFLAGS) README $(EDV_ARCH_DIR)
	@$(INSTALL) $(INSTDATFLAGS) LICENSE $(EDV_ARCH_DIR)

install_devel:
	@echo "Installing header files to $(EDV_INCLUDE_DIR)"
	@$(MKDIR) $(MKDIRFLAGS) $(EDV_INCLUDE_DIR)
	@for h_file in $(SRC_H); do \
            $(INSTALL) $(INSTINCFLAGS) $$h_file $(EDV_INCLUDE_DIR); \
        done
	@echo "Installing $(LIB_CFG_BIN) -> $(BIN_DIR)"
	@$(MKDIR) $(MKDIRFLAGS) $(BIN_DIR)
	@$(INSTALL) $(INSTBINFLAGS) $(LIB_CFG_BIN) $(BIN_DIR)

install_man:
	@echo "Installing $(LIB_CFG_MAN) -> $(MAN1_DIR)"
	@$(MKDIR) $(MKDIRFLAGS) $(MAN1_DIR)
	@$(INSTALL) $(INSTMANFLAGS) $(LIB_CFG_MAN) $(MAN1_DIR)

postinstall:
	@$(LDCONFIG) $(LIB_DIR)
	@echo "Install done."
	@echo $(HR)
	@echo "Program $(LIB_CFG_BIN) installed in:"
	@echo " "
	@echo "        $(BIN_DIR)/$(LIB_CFG_BIN)"
	@echo " "
	@echo "Library $(LIB) installed in:"
	@echo " "
	@echo "        $(LIB_DIR)/$(LIB)"
	@echo " "
	@echo "Header files installed in:"
	@echo " "
	@echo "        $(EDV_INCLUDE_DIR)"
	@echo " "
	@echo $(HR)
	@echo " "


# Maintainance and Misc Rules:
#
clean:
	@echo "Cleaning library \"$(LIB)\"..."
	@echo "Deleting all intermediate files..."
	@-$(RM) $(RMFLAGS) a.out core *.o compiletimeinfo.h \
        $(LIB) $(LIB_CFG_BIN)
	@echo "Clean done."
