# makefile for Gambit-C correctness checks.

# Copyright (C) 1994-1997 by Marc Feeley, All Rights Reserved.

PACKAGE = gambc
VERSION = 30

srcdir = .
srcdirpfx = 

CC_O = gcc -O1 -c $(CC_O_ARGS) -D___SINGLE_HOST
CC_O_SH = gcc -fpic -O1 -c $(CC_O_SH_ARGS) -D___SINGLE_HOST
LINK = gcc -rdynamic \$$OBJECTS ../lib/$(GAMBCLIB) $(CLIBS) -o \$$EXECUTABLE
LINK_SH = gcc -rdynamic \$$OBJECTS -L../lib -lgambc $(CLIBS) -o \$$EXECUTABLE
LINK_SH_INSTALL = gcc -rdynamic \$$OBJECTS -L$(libdir) -lgambc $(CLIBS) -o \$$EXECUTABLE
CLIBS = -lm -ldl -lc
GAMBCLIB = libgambc.a
GAMBCLIB_SH = libgambc.so
MAKE_GAMBCLIB = ar rc $(GAMBCLIB) \$$OBJECTS;ranlib $(GAMBCLIB)
MAKE_GAMBCLIB_SH = gcc -shared -o $(GAMBCLIB_SH) \$$OBJECTS $(CLIBS)
SETDLPATH = LD_LIBRARY_PATH=../lib
INSTALL = ../inst-sh -c
INSTALL_DATA = ../inst-sh -c -m 644
INSTALL_PROGRAM = ../inst-sh -c -m 755
CFLAGS = 
DEFS =  -DPACKAGE=\"gambc\" -DVERSION=\"30\" 

CC_O_ARGS = $(INCLUDES) $(CFLAGS)
CC_O_SH_ARGS = $(INCLUDES) $(CFLAGS) -D___SHARED

INCLUDES = -I$(srcdir)

.SUFFIXES:

DISTFILES = makefile.in \
debug.scm error.scm test.scm mix.scm mem.scm client.c server.scm server.h \
test1.ok test2.ok test3.ok test4.ok test5.ok test6.ok test7.ok \
test8.ok test9.ok

all:
	if [ ! -f debug.scm ]; then \
	  cp $(srcdirpfx)debug.scm .; \
	  touch debug.rm; \
	  cp $(srcdirpfx)error.scm .; \
	  touch error.rm; \
	  cp $(srcdirpfx)test.scm .; \
	  touch test.rm; \
	  cp $(srcdirpfx)mix.scm .; \
	  touch mix.rm; \
	  cp $(srcdirpfx)mem.scm .; \
	  touch mem.rm; \
	  cp $(srcdirpfx)server.scm .; \
	  touch server.rm; \
	fi

check: all test1 test2 test3 test4 test5 test6 test7 test8 test9
	@echo "============ ALL TESTS SUCCESSFUL"
	rm -f mem.c mem_.c mem.o mem.o1 mem_.o mem mem.exe \
	  mix.c mix_.c mix.o mix_.o mix mix.exe \
	  server.c server_.c server.o server_.o client.o \
	  client client.exe gambit.h so_locations *.out tmp*

test1:
	@echo "------------ TEST 1 (debugging support)"
	$(SETDLPATH) ../gsi/gsi -f debug.scm > test1.out
	diff $(srcdirpfx)test1.ok test1.out && rm -f test1.out

test2:
	@echo "------------ TEST 2 (error handling)"
	echo "(load \"error.scm\") 1 2 3" \
	  | $(SETDLPATH) ../gsi/gsi -:h4000 -f > test2.out
	diff $(srcdirpfx)test2.ok test2.out && rm -f test2.out

test3:
	@echo "------------ TEST 3 (interpreter and library functions)"
	$(SETDLPATH) ../gsi/gsi -f test.scm > test3.out
	diff $(srcdirpfx)test3.ok test3.out && rm -f test3.out tmp*

test4:
	@echo "------------ TEST 4 (interpreter running an application)"
	rm -f mix.o
	$(SETDLPATH) ../gsi/gsi -f mix.scm > test4.out
	diff $(srcdirpfx)test4.ok test4.out && rm -f test4.out

test5:
	@echo "------------ TEST 5 (compiler generating C code)"
	rm -f mix.c
	$(SETDLPATH) ../gsc/gsc -f -c mix.scm
	diff $(srcdirpfx)test5.ok mix.c

test6:
	@echo "------------ TEST 6 (link and execute the code generated)"
	rm -f mix_.c mix.o mix_.o mix mix.exe gambit.h
	cp $(srcdirpfx)../lib/gambit.h .
	GAMBCDIR=$(srcdirpfx)../lib $(SETDLPATH) ../gsc/gsc -f mix.c
	if [ -n "$(FORCE_STATIC_LINK)" -o -z "$(CC_O_SH)" ]; then \
	  $(CC_O) mix.c; \
	  $(CC_O) mix_.c; \
	  EXECUTABLE="mix" \
	  OBJECTS="mix.o mix_.o" \
	  OBJECTS_PLUS="+mix.o +mix_.o" \
	  OBJECTS_COMMA="mix.o,mix_.o" \
	  eval $(LINK); \
	else \
	  $(CC_O_SH) mix.c; \
	  $(CC_O_SH) mix_.c; \
	  EXECUTABLE="mix" \
	  OBJECTS="mix.o mix_.o" \
	  OBJECTS_PLUS="+mix.o +mix_.o" \
	  OBJECTS_COMMA="mix.o,mix_.o" \
	  eval $(LINK_SH); \
	fi
	$(SETDLPATH) ./mix > test6.out
	diff $(srcdirpfx)test6.ok test6.out && \
	  rm -f test6.out mix.c mix_.c mix.o mix_.o mix mix.exe

test7:
	@echo "------------ TEST 7 (memory management and C-interface)"
	rm -f mem.c mem_.c mem.o mem_.o mem mem.exe gambit.h
	cp $(srcdirpfx)../lib/gambit.h .
	GAMBCDIR=$(srcdirpfx)../lib $(SETDLPATH) ../gsc/gsc -f mem.scm
	if [ -n "$(FORCE_STATIC_LINK)" -o -z "$(CC_O_SH)" ]; then \
	  $(CC_O) mem.c; \
	  $(CC_O) mem_.c; \
	  EXECUTABLE="mem" \
	  OBJECTS="mem.o mem_.o" \
	  OBJECTS_PLUS="+mem.o +mem_.o" \
	  OBJECTS_COMMA="mem.o,mem_.o" \
	  eval $(LINK); \
	else \
	  $(CC_O_SH) mem.c; \
	  $(CC_O_SH) mem_.c; \
	  EXECUTABLE="mem" \
	  OBJECTS="mem.o mem_.o" \
	  OBJECTS_PLUS="+mem.o +mem_.o" \
	  OBJECTS_COMMA="mem.o,mem_.o" \
	  eval $(LINK_SH); \
	fi
	$(SETDLPATH) ./mem -:h4000 > test7.out
	diff $(srcdirpfx)test7.ok test7.out && \
	  rm -f test7.out mem.c mem_.c mem.o mem_.o mem mem.exe

test8:
	@echo "------------ TEST 8 (use C-interface to implement a Scheme server)"
	rm -f server.c server_.c server.o server_.o \
	  client.o client client.exe gambit.h
	cp $(srcdirpfx)../lib/gambit.h .
	GAMBCDIR=$(srcdirpfx)../lib $(SETDLPATH) ../gsc/gsc -f server.scm
	if [ -n "$(FORCE_STATIC_LINK)" -o -z "$(CC_O_SH)" ]; then \
	  $(CC_O) client.c; \
	  $(CC_O) server.c; \
	  $(CC_O) -D___LIBRARY server_.c; \
	  EXECUTABLE="client" \
	  OBJECTS="client.o server.o server_.o" \
	  OBJECTS_PLUS="+client.o +server.o +server_.o" \
	  OBJECTS_COMMA="client.o,server.o,server_.o" \
	  eval $(LINK); \
	else \
	  $(CC_O_SH) client.c; \
	  $(CC_O_SH) server.c; \
	  $(CC_O_SH) -D___LIBRARY server_.c; \
	  EXECUTABLE="client" \
	  OBJECTS="client.o server.o server_.o" \
	  OBJECTS_PLUS="+client.o +server.o +server_.o" \
	  OBJECTS_COMMA="client.o,server.o,server_.o" \
	  eval $(LINK_SH); \
	fi
	$(SETDLPATH) ./client > test8.out
	diff $(srcdirpfx)test8.ok test8.out && \
	  rm -f test8.out server.c server_.c server.o server_.o \
	    client.o client client.exe

test9:
	@echo "------------ TEST 9 (dynamic compilation and loading of a module)"
	rm -f mem.o mem.o1 gambit.h
	cp $(srcdirpfx)../lib/gambit.h .
	echo "(begin(compile-file\"mem.scm\")(load\"mem.o1\"))" \
	  | $(SETDLPATH) ../gsc/gsc -:h4000 -f > test9.out
	diff $(srcdirpfx)test9.ok test9.out && rm -f test9.out mem.o mem.o1

install:

uninstall:

mostlyclean:
	rm -f mem.c mem_.c mem.o mem.o1 mem_.o mem mem.exe \
	  mix.c mix_.c mix.o mix_.o mix mix.exe \
	  server.c server_.c server.o server_.o client.o client \
	  client.exe gambit.h so_locations *.out tmp*

clean: mostlyclean
	test ! -f debug.rm || rm -f debug.rm debug.scm
	test ! -f error.rm || rm -f error.rm error.scm
	test ! -f test.rm || rm -f test.rm test.scm
	test ! -f mix.rm || rm -f mix.rm mix.scm
	test ! -f mem.rm || rm -f mem.rm mem.scm
	test ! -f server.rm || rm -f server.rm server.scm

distclean: clean
	rm -f makefile

realclean: distclean

dist:
	@echo "Copying distribution files"
	@for file in $(DISTFILES); do \
	  ln $(srcdirpfx)$$file ../$(PACKAGE)$(VERSION)/check 2> /dev/null \
	    || cp -p $(srcdirpfx)$$file ../$(PACKAGE)$(VERSION)/check; \
	done

makefile: makefile.in ../config.status
	cd .. && CONFIG_FILES=check/$@ CONFIG_HEADERS= ./config.status

# Tell versions [3.59,3.63) of GNU make not to export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
