summaryrefslogtreecommitdiff
path: root/libffi
diff options
context:
space:
mode:
authorSimon Marlow <simonmar@microsoft.com>2008-04-08 18:34:34 +0000
committerSimon Marlow <simonmar@microsoft.com>2008-04-08 18:34:34 +0000
commite0fcf61dca4dfac99cb5417e1bc4cbee18822cf2 (patch)
tree32382c35525e71b5f20dea714fb748b0870431e0 /libffi
parent92986843271f2f400ebc0759b30eb11d47eaa193 (diff)
downloadhaskell-e0fcf61dca4dfac99cb5417e1bc4cbee18822cf2.tar.gz
Import libffi-3.0.4, and use it to provide FFI support in GHCi
This replaces the hand-rolled architecture-specific FFI support in GHCi with the standard libffi as used in GCJ, Python and other projects. I've bundled the complete libffi-3.0.4 tarball in the source tree in the same way as we do for GMP, the difference being that we always build and install our own libffi regardless of whether there's one on the system (it's small, and we don't want dependency/versioning headaches). In particular this means that unregisterised builds will now have a fully working GHCi including FFI out of the box, provided libffi supports the platform. There is also code in the RTS to use libffi in place of rts/Adjustor.c, but it is currently not enabled if we already have support in Adjustor.c for the current platform. We need to assess the performance impact before using libffi here too (in GHCi we don't care too much about performance).
Diffstat (limited to 'libffi')
-rw-r--r--libffi/Makefile124
-rw-r--r--libffi/libffi-3.0.4.tar.gzbin0 -> 722782 bytes
2 files changed, 124 insertions, 0 deletions
diff --git a/libffi/Makefile b/libffi/Makefile
new file mode 100644
index 0000000000..3a7cb693f7
--- /dev/null
+++ b/libffi/Makefile
@@ -0,0 +1,124 @@
+
+TOP=..
+
+include $(TOP)/mk/boilerplate.mk
+
+# -----------------------------------------------------------------------------
+# This Makefile is copied from the one we use for GMP in ../gmp.
+#
+# We use libffi's own configuration stuff.
+
+PLATFORM := $(shell echo $(HOSTPLATFORM) | sed 's/i[567]86/i486/g')
+
+# 2007-09-26
+# set -o igncr
+# is not a valid command on non-Cygwin-systems.
+# Let it fail silently instead of aborting the build.
+#
+# 2007-07-05
+# We do
+# set -o igncr; export SHELLOPTS
+# here as otherwise checking the size of limbs
+# makes the build fall over on Cygwin. See the thread
+# http://www.cygwin.com/ml/cygwin/2006-12/msg00011.html
+# for more details.
+
+# 2007-07-05
+# Passing
+# as_ln_s='cp -p'
+# isn't sufficient to stop cygwin using symlinks the mingw gcc can't
+# follow, as it isn't used consistently. Instead we put an ln.bat in
+# path that always fails.
+
+LIBFFI_TARBALL := $(firstword $(wildcard libffi*.tar.gz))
+LIBFFI_DIR := $(subst .tar.gz,,$(LIBFFI_TARBALL))
+
+ifeq "$(findstring dyn, $(GhcRTSWays))" "dyn"
+BUILD_SHARED=yes
+else
+BUILD_SHARED=no
+endif
+
+boot :: stamp.ffi.static
+BINDIST_STAMPS = stamp.ffi.static
+INSTALL_HEADERS += ffi.h
+INSTALL_LIBS += libffi.a
+
+ifeq "$(BUILD_SHARED)" "yes"
+boot :: stamp.ffi.shared
+BINDIST_STAMPS += stamp.ffi.shared
+INSTALL_LIBS += libffi.dll.a
+INSTALL_PROGS += libffi-3.dll
+endif
+
+install all :: $(INSTALL_HEADERS) $(INSTALL_LIBS) $(INSTALL_PROGS)
+
+stamp.ffi.static:
+ $(RM) -rf $(LIBFFI_DIR) build
+ $(TAR) -zxf $(LIBFFI_TARBALL)
+ mv $(LIBFFI_DIR) build
+# chmod +x ln
+ (set -o igncr 2>/dev/null) && set -o igncr; export SHELLOPTS; \
+ PATH=`pwd`:$$PATH; \
+ export PATH; \
+ cd build && \
+ CC=$(WhatGccIsCalled) $(SHELL) configure \
+ --enable-shared=no --host=$(PLATFORM) --build=$(PLATFORM)
+ touch $@
+
+stamp.ffi.shared:
+ $(RM) -rf $(LIBFFI_DIR) build-shared
+ $(TAR) -zxf $(LIBFFI_TARBALL)
+ mv $(LIBFFI_DIR) build-shared
+# chmod +x ln
+ (set -o igncr 2>/dev/null) && set -o igncr; export SHELLOPTS; \
+ PATH=`pwd`:$$PATH; \
+ export PATH; \
+ cd build-shared && \
+ CC=$(WhatGccIsCalled) $(SHELL) configure \
+ --enable-shared=yes --disable-static --host=$(PLATFORM) --build=$(PLATFORM)
+ touch $@
+
+ffi.h: stamp.ffi.static
+ $(CP) build/include/ffi.h .
+
+libffi.a: stamp.ffi.static
+ $(MAKE) -C build MAKEFLAGS=
+ $(CP) build/.libs/libffi.a .
+ $(RANLIB) libffi.a
+
+libffi-3.dll: stamp.ffi.shared
+ $(MAKE) -C build-shared MAKEFLAGS=
+ $(CP) build-shared/.libs/libffi-3.dll .
+
+libffi.dll.a: libffi-3.dll
+ $(CP) build-shared/.libs/libffi.dll.a .
+
+clean distclean maintainer-clean ::
+ $(RM) -f stamp.ffi.static stamp.ffi.shared ffi.h
+ $(RM) -f libffi.a libffi-3.dll libffi.dll.a
+ $(RM) -rf build
+ $(RM) -rf build-shared
+
+#-----------------------------------------------------------------------------
+#
+# binary-dist
+
+include $(TOP)/mk/target.mk
+
+binary-dist:
+ $(INSTALL_DIR) $(BIN_DIST_DIR)/libffi
+ $(INSTALL_DATA) Makefile $(BIN_DIST_DIR)/libffi/
+ifneq "$(HaveLibFFI)" "YES"
+ $(INSTALL_DATA) $(BINDIST_STAMPS) $(BIN_DIST_DIR)/libffi/
+ ifneq "$(INSTALL_PROGS)" ""
+ $(INSTALL_DATA) $(INSTALL_PROGS) $(BIN_DIST_DIR)/libffi/
+ endif
+ ifneq "$(INSTALL_LIBS)" ""
+ $(INSTALL_DATA) $(INSTALL_LIBS) $(BIN_DIST_DIR)/libffi/
+ endif
+ ifneq "$(INSTALL_HEADERS)" ""
+ $(INSTALL_HEADER) $(INSTALL_HEADERS) $(BIN_DIST_DIR)/libffi/
+ endif
+endif
+
diff --git a/libffi/libffi-3.0.4.tar.gz b/libffi/libffi-3.0.4.tar.gz
new file mode 100644
index 0000000000..0b20310aae
--- /dev/null
+++ b/libffi/libffi-3.0.4.tar.gz
Binary files differ