
# ------------------------------------ Initialization -----------------

ifndef BASTARD_VERSION
BASTARD_VERSION = 0.17
endif

ifndef PROGRAM
PROGRAM = bastard
endif

# -- Programs && Libraries
ifndef CC
CC      = gcc
endif
ifndef AR
AR      = ar
endif
ifndef MAKE
MAKE    = make
endif
ifndef RM
RM      = rm -rf
endif
ifndef CP
CP      = cp -r
endif
ifndef LN
LN      = ln -sf
endif
ifndef MKDIR
MKDIR   = mkdir -p
endif
ifndef TERM
TERM    = -lncurses
endif
ifndef LIBDL
LIBDL   = -ldl
endif
ifndef LSLIST
LSLIST  = `ls -1A | grep -v CVS`
endif
export CC AR MAKE RM CP LN MKDIR TERM LIBDL LSLIST


# -- Directories
ifndef TOP
TOP = ..
endif
ifndef INSTALL_DIR
INSTALL_DIR = /usr/local/bastard
INSTALL_BIN = $(INSTALL_DIR)/bin
INSTALL_LIB = $(INSTALL_DIR)/lib
INSTALL_MAN = $(INSTALL_DIR)/man
INSTALL_INC = $(INSTALL_DIR)/include/bastard
INSTALL_SHARE = $(INSTALL_DIR)/share/bastard
endif
export TOP INSTALL_DIR INSTALL_BIN INSTALL_LIB 
export INSTALL_MAN INSTALL_INC INSTALL_SHARE

BINDIR   = $(TOP)/bin
DOCDIR   = $(TOP)/doc
LIBDIR   = $(TOP)/lib
INCDIR   = $(TOP)/include
SHAREDIR = $(TOP)/share
UTILDIR  = $(TOP)/utils

export BASTARD_VERSION BINDIR DOCDIR LIBDIR INCDIR SHAREDIR UTILDIR


# -- libbastard.so compile flags
LIB_DEFS = 							\
	-DBASTARD_VERSION=$(BASTARD_VERSION)	\
	-DB_DEF_TGTPATH=\"$(B_DEF_TGTPATH)\"	\
	-DB_DEF_TGT=\"$(B_DEF_TGT)\"			\
	-DB_DEF_ARCH=\"$(B_DEF_ARCH)\"		\
	-DB_DEF_ASM=\"$(B_DEF_ASM)\"			\
	-DB_DEF_COMP=\"$(B_DEF_COMP)\"		\
	-DB_DEF_FMT=\"$(B_DEF_FMT)\"			\
	-DB_DEF_LANG=\"$(B_DEF_LANG)\"		\
	-DB_DEF_OS=\"$(B_DEF_OS)\"			\
	-DB_PREF_PAGER=\"$(B_PREF_PAGER)\"		\
	-DB_PREF_EDITOR=\"$(B_PREF_EDITOR)\"	\
	-DB_PREF_DEBUG=\"$(B_PREF_DEBUG)\"
LIB_CFLAGS = -fPIC -I$(INCDIR) -ggdb -I/usr/local/include -O3 $(LIB_DEFS)
LIB_ARFLAGS = -L$(LIBDIR)
LIB_SONAME  = libbastard.so
LIB_SOFLAGS =  -I$(INCDIR) -shared -lc -lm $(LIBDL) -Wl,-soname,$(LIB_SONAME)


# -- libbastard.so source files
LIB_SRCS    =       			\
	 api/api_address.c		\
	 api/api_code.c			\
	 api/api_disasm.c			\
	 api/api_env.c			\
	 api/api_functions.c		\
	 api/api_importexport.c		\
	 api/api_intcode.c		\
	 api/api_loadsave.c		\
	 api/api_macros.c			\
	 api/api_namecomment.c		\
	 api/api_search.c			\
	 api/api_section.c		\
	 api/api_strings.c		\
	 api/api_structconst.c		\
	 api/api_system.c			\
	 api/api_xref.c			\
	 db.c          			\
	 db/db_query.c         		\
	 eic_wrappers.c     		\
	 extension.c            	\
	 macro.c            		\
	 vm.c            			\
	 util.c


# -- libbastard.so object files
LIB_OBJS    =       		\
	api/api_address.o		\
	api/api_code.o		\
	api/api_disasm.o		\
	api/api_env.o		\
	api/api_functions.o	\
	api/api_importexport.o	\
	api/api_intcode.o		\
	api/api_loadsave.o	\
	api/api_macros.o		\
	api/api_namecomment.o	\
	api/api_search.o  	\
	api/api_section.o		\
	api/api_strings.o		\
	api/api_structconst.o	\
	api/api_system.o		\
	api/api_xref.o		\
	db.o          		\
	db/db_query.o     	\
	eic_wrappers.o		\
	extension.o       	\
	macro.o           	\
	vm.o              	\
	util.o            



# -- Extensions
ARCHDIR   = arch
ASMDIR    = asm
COMPDIR   = comp
ENGINEDIR = engines
FORMATDIR = formats
LANGDIR   = lang
OSDIR     = os
PLUGINDIR = plugins




# ------------------------------------ Actual Makefile Rulesets ------
all:            third_party $(LIBDIR)/$(LIB_SONAME) $(BINDIR)/$(PROGRAM) extras

install: $(BINDIR)/$(PROGRAM) extras-install
	@echo Installing bastardly binaries...
	@[ -d $(INSTALL_BIN) ] || mkdir $(INSTALL_BIN)
	@cp $(BINDIR)/$(PROGRAM) $(INSTALL_BIN)
	@echo Installing bastardly libraries...
	@[ -d $(INSTALL_LIB) ] || mkdir $(INSTALL_LIB)
	@cp $(LIBDIR)/libbastard.a $(LIBDIR)/$(LIB_SONAME) $(INSTALL_LIB)

uninstall: extras-uninstall
	@echo Removing vital binaries...
	@$(RM) $(INSTALL_BIN)/$(PROGRAM) 
	@echo Removing vital libraries...
	@$(RM) $(INSTALL_LIB)/libbastard.a \
	       $(INSTALL_LIB)/$(LIB_SONAME)

clean: eic-clean typhoon-clean ext-clean extras-clean
	@echo Cleaning directories...
	@cd cli && $(MAKE) clean || [ 1 ]
	@($(RM) *~ *core $(LIBDIR)/$(LIB_SONAME)) || [ 1 ]
	@($(RM) $(LIB_OBJS)) || [ 1 ]
	@echo _____________________________________________________________
	@echo Done.

distclean:
	@cd typhoon; $(MAKE) distclean


# -- Rules to make "extra" binaries and utilities
extras: 
	@(cd bdbdump && $(MAKE) all) ||  [ 1 ]
	@(cd bobjdump && $(MAKE) all) || [ 1 ]
	@(cd lgb && $(MAKE) all) || [ 1 ]
	@#cd libbsql && $(MAKE) all
	@#cd bdbview && $(MAKE) all
	@#cd bda && $(MAKE) all

extras-install: 
	@cd bdbdump && $(MAKE) install
	@cd bobjdump && $(MAKE) install
	@cd lgb && $(MAKE) install
	@#cd libbsql && $(MAKE) install
	@#cd bdbview && $(MAKE) install
	@#cd bda && $(MAKE) install

extras-uninstall: 
	@cd bdbdump && $(MAKE) uninstall
	@cd bobjdump && $(MAKE) uninstall
	@cd lgb && $(MAKE) uninstall
	@#cd libbsql && $(MAKE) uninstall
	@#cd bdbview && $(MAKE) uninstall
	@#cd bda && $(MAKE) uninstall

extras-clean: 
	@cd bdbdump && $(MAKE) clean
	@cd bobjdump && $(MAKE) clean
	@cd lgb && $(MAKE) clean
	@#cd libbsql && $(MAKE) clean
	@#cd bdbview && $(MAKE) clean
	@#cd bda && $(MAKE) clean

$(BINDIR)/sob:
	@echo _____________________________________________________________
	@echo Attempting to make SOB...
	@cd sob && $(MAKE) install
	@echo Done with SOB

sob: $(BINDIR)/sob

sob-install: $(BINDIR)/sob
	@echo _____________________________________________________________
	@echo  Installing SOB
	@[ -d $(INSTALL_BIN) ] || mkdir $(INSTALL_BIN)
	@[ -f sob/src/sob ] && cp sob/src/sob $(INSTALL_BIN)
	@[ -d $(INSTALL_DIR)/share/sob/pixmaps ] || \
	      mkdir -p $(INSTALL_DIR)/share/sob/pixmaps
	@cp -r sob/pixmaps/*.xpm $(INSTALL_DIR)/share/sob/pixmaps
	@echo Done installing SOB

sob-uninstall: 
	@echo _____________________________________________________________
	@echo  Uninstalling SOB
	@[ -f $(INSTALL_BIN)/sob ] && rm -f $(INSTALL_BIN)/sob
	@[ -d $(INSTALL_DIR)/share/sob ] && rm -rf $(INSTALL_DIR)/share/sob
	@echo Done uninstalling SOB

sob-clean:
	@echo _____________________________________________________________
	@echo Cleaning SOB
	@$(RM) $(BINDIR)/sob
	@cd sob && $(MAKE) clean



# -- Rules to make Typhoon and EiC
third_party: typhoon eic

# ---- Typhoon:
typhoon: $(LIBDIR)/libtyphoon.a $(DOCDIR)/typhoon.txt

$(TOP)/doc/typhoon.txt:
	@cp typhoon/man/manual.asc $(LIBDIR)/typhoon.txt
	@cp typhoon/man/*.1 $(LIBDIR)/man

$(LIBDIR)/libtyphoon.a:
	@echo _____________________________________________________________
	@echo "   Compiling Typhoon embedded relational database..."
	@cd typhoon; ./configure; $(MAKE) install
	@cp typhoon/util/dbdview  $(UTILDIR)
	@cp typhoon/util/ddlp $(UTILDIR)
	@cp typhoon/util/tyexport $(UTILDIR)
	@cp typhoon/util/tyimport $(UTILDIR)
	@echo _____________________________________________________________
	@echo Done with Typhoon

typhoon-clean:
	@$(RM) $(LIBDIR)/libtyphoon.a
	@$(RM) $(UTILDIR)/dbdview $(UTILDIR)/ddlp
	@$(RM) $(UTILDIR)/tyexport $(UTILDIR)/tyimport
	@#cd    typhoon; $(MAKE) clean

# ---- EiC:
eic: $(LIBDIR)/libeic.a $(LIBDIR)/libstdClib.a $(DOCDIR)/EiC.ps
	@cp EiC/eic.man* $(DOCDIR)/man/eic.1

$(TOP)/doc/EiC.ps: 
	@([ -f "`which latex`" ] && cd EiC/doc && $(MAKE) EiC.dvi) || [ 1 ]
	@([ -f EiC/doc/EiC.ps ] && cp EiC/doc/EiC.ps $(DOCDIR)/EiC.ps) || [ 1 ]
	@([ -f "`which pstotext`" ] && pstotext EiC/doc/EiC.ps > \
		$(DOCDIR)/EiC.txt ) || [ 1 ]

$(TOP)/include/script/eic:
	@$(MKDIR) $(TOP)/include/script/eic

$(TOP)/lib/libeic.a:  $(TOP)/include/script/eic
	@echo _____________________________________________________________
	@echo "   Compiling EiC embedded interpreter..."
	@cd EiC; config/makeconfig; $(MAKE); $(MAKE) install
	@cp EiC/lib/libeic.a $(LIBDIR)
	@cp EiC/include/eic* $(INCDIR)/script/
	@cp -r  EiC/include/* $(INCDIR)/script/eic/
	@#touch EiC/module/stdClib/src/instH EiC/module/stdClib/src/instSysH
	@echo _____________________________________________________________
	@echo Done with EiC
	

$(LIBDIR)/libstdClib.a: $(LIBDIR)/libeic.a 
	@cp EiC/lib/libstdClib.a $(LIBDIR)

eic-clean:
	@$(RM) $(LIBDIR)/libeic.a  $(LIBDIR)/libstdClib.a 
	@$(RM) -r $(INCDIR)/script/eic
	@(cd EiC && rm -f lib/*.a && $(MAKE) clobber) ||  [ 1 ]


# -- Rules to make Extensions
extensions:
	@cd $(ARCHDIR) && $(MAKE)
	@cd $(ASMDIR) && $(MAKE) 
	@cd $(COMPDIR) && $(MAKE) 
	@cd $(ENGINEDIR) && $(MAKE) 
	@cd $(FORMATDIR) && $(MAKE) 
	@cd $(LANGDIR) && $(MAKE) 
	@cd $(OSDIR) && $(MAKE) 
	@cd $(PLUGINDIR) && $(MAKE) 

ext-clean:
	@cd $(ARCHDIR) && $(MAKE) clean
	@cd $(ASMDIR) && $(MAKE) clean
	@cd $(COMPDIR) && $(MAKE) clean
	@cd $(ENGINEDIR) && $(MAKE) clean
	@cd $(FORMATDIR) && $(MAKE) clean
	@cd $(LANGDIR) && $(MAKE) clean
	@cd $(OSDIR) && $(MAKE) clean
	@cd $(PLUGINDIR) && $(MAKE) clean


# -- Rules to make libbastard
$(LIBDIR)/libbastard.a: $(LIB_OBJS)
	$(AR) rcs $@ $^ 
	
$(LIBDIR)/$(LIB_SONAME): $(LIB_OBJS) $(LIBDIR)/libbastard.a \
                          $(LIBDIR)/libeic.a $(LIBDIR)/libstdClib.a \
				  $(LIBDIR)/libtyphoon.a
	@echo _____________________________________________________________
	@echo Compiling libbastard.so...
	$(CC) $(LIB_SOFLAGS) -o $@ $^
	@echo Done with libbastard.so

.c.o: $(SRCS) 
	$(CC) $(LIB_CFLAGS) -o $@ -c $<


# -- Rules to make the bastard
$(BINDIR)/$(PROGRAM):  $(LIBDIR)/$(LIB_SONAME) extensions 
	@cd cli && $(MAKE)
	@ [ -f /etc/debian_version ]  || echo "Real Bastards use Debian!"
	
