#-----------------------------------------------------------------------------#
# Copyright (C) 1997 The University of Melbourne.
# This file may only be copied under the terms of the GNU General
# Public License - see the file COPYING in the Mercury distribution.
#-----------------------------------------------------------------------------#

# Mmake - Mmake file for the Mercury runtime library

MAIN_TARGET=lib

MERCURY_DIR=..
include $(MERCURY_DIR)/Mmake.common

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

CFLAGS		= -I$(MERCURY_DIR)/runtime -I$(MERCURY_DIR)/boehm_gc -g \
		  $(DLL_CFLAGS) $(EXTRA_CFLAGS)
MGNUC		= MERCURY_C_INCL_DIR=. $(SCRIPTS_DIR)/mgnuc
MGNUCFLAGS	= --no-ansi $(CFLAGS)
MOD2C		= $(SCRIPTS_DIR)/mod2c

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

#		  keep this list in alphabetical order, please
HDRS		= calls.h conf.h context.h \
		  deep_copy.h dlist.h debug.h dummy.h \
		  engine.h getopt.h goto.h heap.h imp.h init.h label.h \
		  memory.h mercury_float.h mercury_grade.h \
		  mercury_string.h mercury_trace.h mercury_trail.h \
		  mercury_types.h misc.h \
		  overflow.h prof.h prof_mem.h regorder.h regs.h \
		  spinlock.h std.h stacks.h \
		  table.h tags.h timing.h type_info.h wrapper.h \
		  $(LIBMER_DLL_H)
# Note that `libmer_globals.h' cannot be part of $(HDR),
# since it depends on libmer_def.a, and $(OBJ) : $(HDR) would create a
# circular dependency.


MACHHDRS	= machdeps/no_regs.h machdeps/i386_regs.h \
		  machdeps/mips_regs.h machdeps/sparc_regs.h \
		  machdeps/alpha_regs.h machdeps/pa_regs.h \
		  machdeps/rs6000_regs.h
MODS		= engine.mod wrapper.mod call.mod context.mod type_info.mod
MOD_CS		= engine.c wrapper.c call.c context.c type_info.c
MOD_OS		= $(MOD_CS:.c=.o)
ORIG_CS		= deep_copy.c dlist.c dummy.c label.c \
		  memory.c misc.c regs.c table.c timing.c prof.c prof_mem.c \
		  spinlock.c mercury_float.c mercury_grade.c mercury_trace.c \
		  mercury_trail.c
ORIG_OS		= $(ORIG_CS:.c=.o)
OBJS		= $(MOD_OS) $(ORIG_OS)
PIC_OBJS	= $(OBJS:.o=.$(EXT_FOR_PIC_OBJECTS))

LDFLAGS		= -L$(BOEHM_GC_DIR)
LDLIBS		= \
		` case "$(GRADE)" in 					\
		    *.gc*.prof)	echo "-lgc_prof" ;;			\
		    *.gc*)	echo "-lgc" ;;				\
		  esac							\
		`

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

# Stuff for Windows DLLs

ifeq ($(USE_DLLS),yes)

DLL_CFLAGS	= -Dlibmer_DEFINE_DLL

LIBMER_DLL_H	 = libmer_dll.h
LIBMER_GLOBALS_H = libmer_globals.h

include $(MERCURY_DIR)/Makefile.DLLs

endif

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

$(OBJS) $(PIC_OBJS): $(HDRS) $(MACHHDRS)

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

.PHONY: lib
lib: libmer.a libmer.$(EXT_FOR_SHARED_LIB) runtime.init \
	$(LIBMER_DLL_H) $(LIBMER_GLOBALS_H)

libmer$(DLL_DEF_LIB).a: $(OBJS)
	rm -f libmer$(DLL_DEF_LIB).a
	ar cr libmer$(DLL_DEF_LIB).a $(OBJS)
	$(RANLIB) libmer$(DLL_DEF_LIB).a

libmer.so: $(PIC_OBJS)
	$(LINK_SHARED_OBJ) -o libmer.so $(PIC_OBJS)			\
		$(SHLIB_RPATH_OPT)$(FINAL_INSTALL_MERC_GC_LIB_DIR)	\
		$(LDFLAGS) $(LDLIBS)					\
		$(SHARED_LIBS)

runtime.init: $(MOD_CS)
	cat `vpath_find $(MOD_CS)` | grep '^INIT ' > runtime.init

conf.h.date: $(MERCURY_DIR)/config.status conf.h.in
	CONFIG_FILES= CONFIG_HEADERS=conf.h $(MERCURY_DIR)/config.status
	echo datestamp > conf.h.date

conf.h: conf.h.date
	@true

.PHONY: cs
cs: $(MOD_CS)

tags: $(MODS) $(ORIG_CS)
	ctags $(MODS) $(ORIG_CS) $(HDRS)

.PHONY: check_headers
check_headers:
	for file in $(HDRS); do \
		echo "$$file"; \
		echo "#include \"$$file\"" > tmp.c; \
		$(MGNUC) $(MGNUCFLAGS) -c tmp.c || exit 1; \
	done
	rm -f tmp.c

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

# installation rules

.PHONY: install
install: install_headers install_init install_lib

.PHONY: install_headers
install_headers: $(HDRS) $(MACHHDRS) $(LIBMER_GLOBALS_H)
	-[ -d $(INSTALL_INC_DIR)/machdeps ] || \
		mkdir -p $(INSTALL_INC_DIR)/machdeps
	cp `vpath_find $(HDRS) $(LIBMER_GLOBALS_H)` $(INSTALL_INC_DIR)
	chmod u+w $(INSTALL_INC_DIR)/conf.h
	cp `vpath_find $(MACHHDRS)` $(INSTALL_INC_DIR)/machdeps

.PHONY: install_init
install_init: runtime.init
	-[ -d $(INSTALL_MODULE_DIR) ] || mkdir -p $(INSTALL_MODULE_DIR)
	cp `vpath_find runtime.init` $(INSTALL_MODULE_DIR)

.PHONY: install_lib
install_lib: libmer.a libmer.$(EXT_FOR_SHARED_LIB)
	-[ -d $(INSTALL_MERC_LIB_DIR) ] || mkdir -p $(INSTALL_MERC_LIB_DIR)
	cp `vpath_find libmer.a libmer.$(EXT_FOR_SHARED_LIB)` \
		$(INSTALL_MERC_LIB_DIR)

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

# prevent GNU make from removing these intermediate files
dont_remove: engine.c wrapper.c call.c 

# prevent Mmake from removing C files
RM_C=:

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

clean: clean_o clean_mod_c

.PHONY: clean_o
clean_o:
	rm -f *.o *.pic_o

.PHONY: clean_mod_c
clean_mod_c:
	for file in *.mod; do \
		rm -f `basename $$file .mod`.c; \
	done

realclean:
	rm -f libmer.a libmer.so runtime.init
	rm -f conf.h conf.h.date

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