X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=libffi%2FMakefile;h=3f674c4106aa99ccffbf9f48c324d78ce1a78123;hb=c0ea0df71af0e3d1b6e210171876a806cfcda7f4;hp=f76c16d17cbf1df33d15eb9937fe12ac82a45ebf;hpb=a5605c305ff873306ba0c495216736949fbf497b;p=ghc-hetmet.git diff --git a/libffi/Makefile b/libffi/Makefile index f76c16d..3f674c4 100644 --- a/libffi/Makefile +++ b/libffi/Makefile @@ -1,10 +1,33 @@ TOP=.. +DONT_WANT_STD_GHCI_LIB_RULE=YES +DONT_WANT_STD_LIBRARY=YES include $(TOP)/mk/boilerplate.mk - +# Override haddock generation for this package +HADDOCK_DOCS=NO + +# We package libffi as Haskell package for two reasons: + +# 1) GHC uses different names for shared and static libs, so it can +# choose the lib variant to link with on its own. With regular +# libtool styled shared lib names, the linker would interfer and +# link against the shared lib variant even when GHC runs in -static +# mode. +# 2) The first issue isn't a problem when a shared lib of libffi would +# be installed in system locations, but we do not assume that. So, +# when running in -dynamic mode, we must either install libffi to +# system locations ourselves, or we must add its location to +# respective environment variable, (DY)LD_LIBRARY_PATH etc...before +# we call dynamically linked binaries. Especially, the latter is +# necessary as GHC calls binary it produced before its installation +# phase. However, both mechanism, installing to system locations or +# modifying (DY)LD_LIBRARY_PATH, are already in place for Haskell +# packages so with packaging libffi as Haskell package we reuse +# them naturally. + +PACKAGE=ffi # ----------------------------------------------------------------------------- -# This Makefile is copied from the one we use for GMP in ../gmp. # # We use libffi's own configuration stuff. @@ -34,9 +57,18 @@ LIBFFI_TARBALL := $(firstword $(wildcard libffi*.tar.gz)) LIBFFI_DIR := $(subst .tar.gz,,$(LIBFFI_TARBALL)) BINDIST_STAMPS = stamp.ffi + +ifeq "$(BuildSharedLibs)" "YES" +STAMP_BUILD = stamp.ffi.build-shared +STAMP_CONFIGURE = stamp.ffi.configure-shared +else +STAMP_BUILD = stamp.ffi.build +STAMP_CONFIGURE = stamp.ffi.configure +endif + INSTALL_HEADERS += ffi.h STATIC_LIB = libffi.a -INSTALL_LIBS += $(STATIC_LIB) +INSTALL_LIBS += libHSffi.a HSffi.o # We have to add the GHC version to the name of our dynamic libs, because # they will be residing in the system location along with dynamic libs from @@ -50,6 +82,8 @@ DYNAMIC_PROG = DYNAMIC_LIBS = libffi.so libffi.so.5 libffi.so.5.0.5 endif +HS_DYN_LIB_NAME=libHSffi-ghc$(ProjectVersion)$(soext) + ifeq "$(BuildSharedLibs)" "YES" EnableShared=yes else @@ -57,8 +91,10 @@ EnableShared=no endif ifeq "$(BuildSharedLibs)" "YES" -INSTALL_LIBS += $(DYNAMIC_LIBS) -INSTALL_PROGS += $(DYNAMIC_PROGS) +INSTALL_LIBS += $(HS_DYN_LIB_NAME) +ifeq "$(Windows)" "YES" +INSTALL_PROGS += $(HS_DYN_LIB_NAME).a +endif endif install all :: $(INSTALL_HEADERS) $(INSTALL_LIBS) $(INSTALL_PROGS) @@ -68,7 +104,7 @@ install all :: $(INSTALL_HEADERS) $(INSTALL_LIBS) $(INSTALL_PROGS) # will use cygwin symbolic linkks which cannot be read by mingw gcc. # The same trick is played by the GMP build in ../gmp. -stamp.ffi: +$(STAMP_CONFIGURE): $(RM) -rf $(LIBFFI_DIR) build $(TAR) -zxf $(LIBFFI_TARBALL) mv $(LIBFFI_DIR) build @@ -81,17 +117,49 @@ stamp.ffi: --enable-static=yes \ --enable-shared=$(EnableShared) \ --host=$(PLATFORM) --build=$(PLATFORM) + + # libffi.so needs to be built with the correct soname. + # NOTE: this builds libffi_convience.so with the incorrect + # soname, but we don't need that anyway! + $(CP) build/libtool build/libtool.orig + sed -e s/soname_spec=.*/soname_spec="$(HS_DYN_LIB_NAME)"/ build/libtool.orig > build/libtool touch $@ -ffi.h: stamp.ffi +ffi.h: $(STAMP_CONFIGURE) $(CP) build/include/ffi.h . -$(STATIC_LIB) $(DYNAMIC_LIBS) $(DYNAMIC_PROG) : stamp.ffi +$(STAMP_BUILD): $(STAMP_CONFIGURE) $(MAKE) -C build MAKEFLAGS= (cd build; ./libtool --mode=install cp libffi.la $(FPTOOLS_TOP_ABS)/libffi) + touch $@ + +$(STATIC_LIB) $(DYNAMIC_LIBS) $(DYNAMIC_PROG): $(STAMP_BUILD) + +libHSffi.a libHSffi_p.a: $(STATIC_LIB) + $(CP) $(STATIC_LIB) $@ + +all :: libHSffi.a libHSffi_p.a + +# The GHCi import lib isn't needed as compiler/ghci/Linker.lhs + rts/Linker.c +# link the interpreted references to FFI to the compiled FFI. +# Instead of adding libffi to the list preloaded packages (see +# compiler/ghci/Linker.lhs:emptyPLS) we generate an empty HSffi.o + +HSffi.o: libHSffi.a + touch empty.c + $(CC) -c empty.c -o HSffi.o + +all :: HSffi.o + +ifeq "$(BuildSharedLibs)" "YES" +$(HS_DYN_LIB_NAME): $(DYNAMIC_LIBS) + $(CP) $(word 1,$(DYNAMIC_LIBS)) $(HS_DYN_LIB_NAME) + +all :: $(HS_DYN_LIB_NAME) +endif clean distclean maintainer-clean :: - $(RM) -f stamp.ffi ffi.h + $(RM) -f stamp.ffi.* ffi.h empty.c $(RM) -f libffi.a libffi.la $(DYNAMIC_PROG) $(DYNAMIC_LIBS) $(ORIG_DYNAMIC_LIBS) $(RM) -rf build