#-*-Makefile-*-
# ffi/Makefile-fragment

TARGET_DIR = $(AUXDIR)/ffi

# Install the FFI option.
install:
	rm -rf $(DESTDIR)$(TARGET_DIR)
	$(mkinstalldirs) $(DESTDIR)$(TARGET_DIR)
	$(INSTALL_COM) *.com $(DESTDIR)$(TARGET_DIR)/.
	$(INSTALL_DATA) *.bci $(DESTDIR)$(TARGET_DIR)/.
	$(INSTALL_DATA) ffi-*.pkd $(DESTDIR)$(TARGET_DIR)/.
	$(INSTALL_DATA) make.scm $(DESTDIR)$(TARGET_DIR)/.

# Build a test library interface.

# This target is built after everything else (during build-ffis), and
# should use the new machine, runtime, etc.

# This interface is for tests/ffi/test-ffi.scm, which uses its own
# wrapper, so there is no need for the compile-ffi procedure (hint).
build: ffi-test-shim.so ffi-test-types.bin ffi-test-const.bin

ffi-test-shim.so: ffi-test-shim.o ffi-test.o $(SHIM_LOADER)
	$(LINK_SHIM) ffi-test-shim.o ffi-test.o $(SHIM_LIBS)

ffi-test-shim.o: ffi-test-shim.c ffi-test.h
	$(COMPILE_SHIM) -c $*.c

ffi-test-shim.c ffi-test-const.c ffi-test-types.bin: ffi-test.cdecl
	(echo "(load-option 'FFI)"; \
	 echo '(C-generate "ffi-test" "#include \"ffi-test.h\"")') \
	| ../microcode/scheme --library ../lib --batch-mode

ffi-test-const.bin: ffi-test-const.scm
	echo '(sf "ffi-test-const")' \
	| ../microcode/scheme --library ../lib --batch-mode

ffi-test-const.scm: ffi-test-const
	./ffi-test-const

ffi-test-const: ffi-test-const.o
	@rm -f $@
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ ffi-test-const.o

ffi-test-const.o: ffi-test-const.c
	$(CC) $(CFLAGS) -o $@ -c $<

# Finally, the test library itself.

ffi-test.o: ffi-test.c ffi-test.h
	$(COMPILE_SHIM) -o $@ -c $<

ffi-test.c: ffi-test.c.stay
	cp -p ffi-test.c.stay ffi-test.c

.PHONY: build
