#
# $Id: dynamic_module_makefile.in,v 1.101 2004/05/12 08:08:07 grubba Exp $
#


CC=/usr/lib/pike/7.4.117/include/pike/smartlink gcc
CPP=gcc -E
AR=/usr/bin/ar
LIBGCC=/usr/lib/gcc-lib/i486-linux/3.3.4/libgcc.a
REAL_LDFLAGS= -R/usr/local/lib -L/usr/local/lib -R/usr/X11R6/lib -L/usr/X11R6/lib
REAL_LDSHARED=gcc -shared 
REAL_CFLAGS=
REAL_CPPFLAGS= -I/usr/local/include -I/usr/X11R6/include
LC_REQ=-lc

MODULE_BASE=$(BUILD_BASE)/modules
TMP_MODULE_BASE=$(TMP_LIBDIR)/modules

PREFLAGS=-I. -I$(SRCDIR) -I$(BUILD_BASE) -I$(PIKE_SRC_DIR) $(MODULE_CPPFLAGS) $(DEFINES)
CFLAGS=$(MODULE_CFLAGS) $(PREFLAGS) $(OTHERFLAGS)  -fPIC -DDYNAMIC_MODULE 
NOOPT_CFLAGS=$(PREFLAGS) $(NOOPTFLAGS)  -fPIC -DDYNAMIC_MODULE $(MODULE_CFLAGS)

MAKE_FLAGS = "prefix=$(prefix)" "exec_prefix=$(exec_prefix)" "CC=$(CC)  -fPIC -DDYNAMIC_MODULE" "OTHERFLAGS=$(OTHERFLAGS)" "TMP_BINDIR=$(TMP_BINDIR)" "DEFINES=$(DEFINES)" "TMP_LIBDIR=$(TMP_LIBDIR)" "RUNPIKE=$(RUNPIKE)" "INSTALL=$(INSTALL)" "AR=$(AR)" "NOOPTFLAGS=$(NOOPTFLAGS)" $(MODULE_MAKE_FLAGS)

MODNAME=`pwd|sed -e 's@.*/@@g'`

all: dummy

force:
	@:;

$(MODULE_ARCHIVES) ThisIsAPhonyTargetBlaBlaBla: force
	@a=`echo $@ | sed -e 's@/[^/]*$$@@'` ; \
	 m=`echo $@ | sed -e 's@.*/@@g'`; \
	echo Making $(MODNAME)/$$a/$$m ; \
	( rm $$a/remake >/dev/null 2>&1 ||: ; \
	  cd $$a && ( $(MAKE) $(MAKE_FLAGS) $$m || \
	              ( test -f remake ; $(MAKE) $(MAKE_FLAGS) $$m ) ) \
	) || exit $$?

dummy:	Makefile $(DUMMY) linker_options modlist_headers modlist_segment module.so
	@tmp="$(INSTALL_NAME)" ; \
	if test x$$tmp = x ; then tmp="$(MODNAME)"; else :; fi ;\
	tmp2="___$$tmp" ; \
	if [ -f $(SRCDIR)/module.pmod.in ]; then \
	  sed -e "s/@module@/.$$tmp2/" <$(SRCDIR)/module.pmod.in >$(TMP_MODULE_BASE)/$$tmp.pmod ; \
	else \
	  if [ -f ./module.pmod.in ]; then \
	    sed -e "s/@module@/.$$tmp2/" <./module.pmod.in >$(TMP_MODULE_BASE)/$$tmp.pmod; \
	   else tmp2="$$tmp"; \
	  fi; \
	fi ; \
	$(TMP_BINDIR)/install_module module.so $(TMP_MODULE_BASE)/$$tmp2.so

.SUFFIXES: .c .o .cmod .protos

.cmod.c: $(BUILD_BASE)/precompile.sh-stamp $(TMP_BINDIR)/precompile.pike
	$(BUILD_BASE)/precompile.sh --cache precompile.pike >"$@" "$<" || { rm "$@"; exit 1; }


# GCC dumps core on some files @ OSF1
# This kluge should work around that...
.c.o:
	@echo "Compiling $<" ;\
	rm -f $@.fail >/dev/null 2>&1; \
	if $(CC) $(CFLAGS) -c $< -o $@ ; then : ; else \
	  status=$$?; \
	  if test x"yes" = xyes ; then \
	    echo "WARNING: Compiler failure! Trying without optimization!" >&2;\
	    echo "$(CC) $(PREFLAGS) $(CFLAGS) -c $< -o $@" >$@.fail ;\
	    if NO_ULIMIT=yes $(CC) $(PREFLAGS) $(NOOPTFLAGS) -c $< -o $@ ; then : ; else \
	      status=$$?; \
	      echo "Compilation command was:" >&2;\
	      echo "$(CC) $(PREFLAGS) $(NOOPTFLAGS) -c $< -o $@" >&2 ;\
	      exit $$status; \
	    fi; \
	  else \
	    echo "Compilation command was:" >&2;\
	    echo "$(CC) $(PREFLAGS) $(CFLAGS) -c $< -o $@" >&2 ;\
	    exit $$status; \
	  fi; \
	fi

.c.protos: $(BUILD_BASE)/precompile.sh-stamp
	./precompile.sh --cache fake_dynamic_load.pike >"$@" --cpp --protos \
	  $(CPP) $(PREFLAGS) -DPMOD_EXPORT=PMOD_EXPORT \
	    -DPMOD_PROTO=PMOD_PROTO -DPIKE_PRECOMPILER=1 "$<" || \
	  { rm "$@"; exit 1; }


linker_options: Makefile
	@if test "x$(LINKER_OPTIONS)" != x ; then echo "LINKER_OPTIONS+=$(LINKER_OPTIONS)" ; else : ; fi ; echo "$(LINKER_OPTIONS)" >linker_options

modlist_headers: Makefile
	@echo "" >modlist_headers

modlist_segment: Makefile
	@echo "" >modlist_segment

make_variables: $(make_variables_in) config.status
	CONFIG_FILES="make_variables:$(make_variables_in)" CONFIG_HEADERS="" ./config.status

# Can't depend on $(SRC_DIR)/$(CONFIG_HEADERS).in since
# $(CONFIG_HEADERS) isn't always used.
Makefile: $(MODULE_BASE)/dynamic_module_makefile $(SRCDIR)/Makefile.in $(SRCDIR)/dependencies make_variables config.status
	CONFIG_FILES=Makefile CONFIG_HEADERS="$(CONFIG_HEADERS)" ./config.status
	touch remake
	@echo "Run make again" >&2
	@exit 1

$(SRCDIR)/configure: $(SRCDIR)/configure.in $(PIKE_SRC_DIR)/aclocal.m4
	cd $(SRCDIR) && autoconf --localdir=$(PIKE_SRC_DIR)
	if [ -f $(SRCDIR)/acconfig.h ]; then \
	  cd $(SRCDIR) && autoheader; \
	else :; fi

config.status: $(SRCDIR)/configure
	CFLAGS="$(REAL_CFLAGS)" LDFLAGS="$(REAL_LDFLAGS)" LDSHARED="$(REAL_LDSHARED)" CPPFLAGS="$(REAL_CPPFLAGS)" BUILDDIR="$(TMP_BUILDDIR)" BINDIR="$(TMP_BINDIR)" PIKE_SRC_DIR="$(PIKE_SRC_DIR)" BUILD_BASE="$(BUILD_BASE)" ./config.status --recheck


module.so: $(MODULE_ARCHIVES) $(OBJS)
	@echo "Linking $(MODNAME)" ;\
	if $(TMP_BINDIR)/smartlink "$(LDSHARED)" $(LDFLAGS) -o module.so $(OBJS) $(MODULE_ARCHIVES) $(MODULE_LDFLAGS) $(LIBGCC) $(LC_REQ) $(LIBGCC) ; then \
	  if test so != so ; then mv module.so module.so ; else :; fi ;\
	else \
	  echo "Linking failed:" >&2; \
	  echo $(TMP_BINDIR)/smartlink "$(LDSHARED)" $(LDFLAGS) -o module.so $(OBJS) $(MODULE_ARCHIVES) $(MODULE_LDFLAGS) $(LIBGCC) $(LC_REQ) $(LIBGCC) >&2 ;\
	  exit 1; \
	fi

$(OBJS) : $(MODULE_BASE)/dynamic_module_makefile

clean:
	-rm -f *.o *.fail *.obj *.a *.so module.so linker_options modlist_headers modlist_segment module_testsuite $(MODULE_CLEAN_EXTRA)
	@for a in '' $(MODULE_SUBDIRS) ; do if test "x$$a" = "x"; then :; else echo cleaning $$a ; ( cd $$a ; $(MAKE) $(MAKE_FLAGS) clean ) ; fi ; done


depend: $(SRC_TARGETS) $(PMOD_TARGETS) Makefile
	-@echo Fixing dependencies for $(SRCDIR)/\*.c
	@gcc -MM -MG $(PREFLAGS) $(SRCDIR)/*.c | $(TMP_BINDIR)/fixdepends.sh "$(SRCDIR)" "$(PIKE_SRC_DIR)" "$(BUILD_BASE)"
	@CONFIG_FILES=Makefile CONFIG_HEADERS="" ./config.status
	@for a in '' $(MODULE_SUBDIRS) ; do \
	  if test "x$$a" = "x"; then :; else \
	    echo making depend in $$a; \
	    ( cd $$a && { \
	      rm -f remake; \
	      $(MAKE) $(MAKE_FLAGS) MODNAME=$$a depend || \
		if test -f remake; then $(MAKE) $(MAKE_FLAGS) MODNAME=$$a depend; \
		else exit $$?; fi; \
	    }); \
	  fi; \
	done

#verify / debug
module_testsuite: $(SRCDIR)/testsuite.in $(REAL_TESTSUITE) $(TMP_BINDIR)/mktestsuite
	@if test "x$(REAL_TESTSUITE)" != x ; then \
	  cp $(SRCDIR)/$(REAL_TESTSUITE) module_testsuite; \
	else \
	  if test "$$PIKE_PATH_TRANSLATE" = ""; then \
	    $(TMP_BINDIR)/mktestsuite $(SRCDIR)/testsuite.in >module_testsuite \
	      -DSRCDIR=$(SRCDIR); \
	  else \
	    $(TMP_BINDIR)/mktestsuite $(SRCDIR)/testsuite.in >module_testsuite \
	      -DSRCDIR="`echo $(SRCDIR)|sed -e $$PIKE_PATH_TRANSLATE`"; \
	  fi; \
	fi

extra_tests: $(MODULE_TESTS)

verify: module_testsuite  $(MODULE_TESTS)
	$(RUNPIKE) $(TMP_BINDIR)/test_pike.pike module_testsuite

verbose_verify: module_testsuite  $(MODULE_TESTS)
	$(RUNPIKE) $(TMP_BINDIR)/test_pike.pike module_testsuite --verbose

gdb_verify: module_testsuite
	@echo >.gdbinit handle SIGUSR1 nostop noprint pass
	@echo >>.gdbinit run -DNOT_INSTALLED -m $(TMP_BUILDDIR)/master.pike $(PIKEOPTS) $(TMP_BINDIR)/test_pike.pike module_testsuite -v -v -f
	gdb $(TMP_BUILDDIR)/pike
	@rm .gdbinit


install: $(MODULE_INSTALL)
	$(TMP_BINDIR)/install_module module.so /usr/lib/pike/modules/$(MODNAME).so

