#   Prolog Interface to Postgresql
#   Copyright (C) 1999-2003 Alexander Diemand
# 

# load platform dependent settings (compiler, flags, libs...)
ARCH = $(shell uname -s)
ifeq ($(ARCH), IRIX64)
ARCH=IRIX
endif
include $(ARCH).def

# load project include and library settings
include Makefile.inc

INC = $(PROJECT_INC) $(ARCH_INC)
CFLAGS = $(DEF) $(OPT) $(INC) $(DEBUG) $(WARN)
PFLAGS = 

LDFLAGS = $(ARCH_LDFLAGS)
LDLIBS = $(ARCH_LIB) $(PROJECT_LIB)

# application name
APP = pgsql-$(ARCH)

# static library
STATIC_LIB = libgp_pgsql-$(ARCH).a

# shared library
SHARED_LIB = gp_pgsql-$(ARCH).so
SHLIB_MAJOR = 0
SHLIB_MINOR = 1
SHLIB_VERSION = $(SHLIB_MAJOR).$(SHLIB_MINOR)

SRCDIR = src
OBJDIR = obj-$(ARCH)

# object files
OBJS = $(patsubst %.pl, $(OBJDIR)/%.pl.o, $(filter %.pl, $(PL_source)))
OBJS += $(patsubst %.c, $(OBJDIR)/%.c.o, $(filter %.c, $(C_source)))
SHOBJS += $(patsubst $(OBJDIR)/%.o, $(OBJDIR)/%.osh, $(OBJS))

.SUFFIXES: .pl .c

# implicit rules for *.o files from Prolog
$(OBJDIR)/%.pl.o : $(SRCDIR)/%.pl
	@echo "compiling $<"
	@$(GPLC) -c $(PFLAGS) -o $@ $<

# implicit rules for *.osh files from Prolog
$(OBJDIR)/%.pl.osh : $(SRCDIR)/%.pl
	@echo "compiling $<"
	@$(GPLC) -c $(PFLAGS) -o $@ $<

# other implicit rules
$(OBJDIR)/%.c.o : $(SRCDIR)/%.c
	@echo "compiling $<"
	@$(GPLC) -c -C '$(CFLAGS)' -o $@ $<

$(OBJDIR)/%.c.osh : $(SRCDIR)/%.c
	@echo "compiling $<"
	@$(GPLC) -c -C '$(CFLAGS)' -C $(PIC) -o $@ $<

# default rule
default: $(STATIC_LIB) $(APP)

# rule to make it all
all: $(STATIC_LIB) $(APP)

# builds the executable
$(APP): $(OBJDIR) $(OBJS) $(STATIC_LIB)
	@echo "Building executable $(APP)"
	@$(LINK) -L '$(LDFLAGS)' -o $(APP) $(OBJS) -L '$(LDLIBS)'
	@#$(LINK) -La '$(LDFLAGS)' -o $(APP) -Lz '$(STATIC_LIB)' -Lz '$(LDLIBS)'

app_all: $(APP)
	$(foreach DIR, $(MAKE_DIRS), (cd $(DIR) && $(MAKE) app_all);)

# builds the static library from object files
$(STATIC_LIB): $(OBJDIR) $(OBJS)
	@echo "Linking static library $(STATIC_LIB)"
	@$(AR) $(ARFLAGS) $(STATIC_LIB) $(OBJS) > /dev/null
	@$(RANLIB) $(STATIC_LIB)

# builds the shared library from object files
$(SHARED_LIB): $(OBJDIR) $(SHOBJS)
	@echo "Linking shared library $(SHARED_LIB)"
	@$(SHARED_LINK) -o $(SHARED_LIB).$(SHLIB_VERSION) $(PL_OBJ_BEGIN) $(SHOBJS) $(PL_OBJ_END) $(LDLIBS)
	@chmod a+x $(SHARED_LIB).$(SHLIB_VERSION)
	@ln -f -s $(SHARED_LIB).$(SHLIB_VERSION) $(SHARED_LIB)

clean:
	@echo "Cleaning away everything."
	@test -d $(OBJDIR) && rm -r $(OBJDIR); true
	@test -f $(SHARED_LIB) && rm $(SHARED_LIB); true
	@test -f $(SHARED_LIB).$(SHLIB_VERSION) && rm $(SHARED_LIB).$(SHLIB_VERSION); true
	@test -f $(STATIC_LIB) && rm $(STATIC_LIB); true
	@test -f $(APP) && rm $(APP); true

clean_all: clean
	$(foreach DIR, $(MAKE_DIRS), (cd $(DIR) && $(MAKE) clean_all);)

depend:
	@echo "Building dependencies"
	@$(CC) -MM $(CFLAGS) $(patsubst %.c, $(SRCDIR)/%.c, $(filter %.c, $(C_source))) > temp.dep
	@sed -e "s/\([-A-Za-z0-9_,]*\)\.o/\$$(OBJDIR)\/\1.c.o/" temp.dep > Makefile.dep
	@sed -e "s/\([-A-Za-z0-9_,]*\)\.o/\$$(OBJDIR)\/\1.c.osh/" temp.dep >> Makefile.dep
	@rm -f temp.dep

$(OBJDIR):
	@mkdir $(OBJDIR)

-include Makefile.dep
