From: Clemens Fruhwirth Date: Wed, 8 Oct 2008 17:04:43 +0000 (+0000) Subject: Turn libffi into a Haskell package X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=960b35ddc178f6b8af1a8809aecb0a43177abbc8 Turn libffi into a Haskell package --- diff --git a/Makefile b/Makefile index 57a0d5c..7cb3ef1 100644 --- a/Makefile +++ b/Makefile @@ -102,9 +102,9 @@ endif stage1 : $(GCC_LIB_DEP) check-all $(MAKE) -C libraries boot $(MAKE) -C gmp all - $(MAKE) -C libffi all $(MAKE) -C utils/mkdependC boot $(MAKE) -C utils with-bootstrapping-compiler + $(MAKE) -C libffi all @case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \ for i in $(SUBDIRS_BUILD); do \ echo "------------------------------------------------------------------------"; \ diff --git a/libffi/Makefile b/libffi/Makefile index f76c16d..a85372d 100644 --- a/libffi/Makefile +++ b/libffi/Makefile @@ -1,10 +1,31 @@ TOP=.. +DONT_WANT_STD_GHCI_LIB_RULE=YES +DONT_WANT_STD_LIBRARY=YES include $(TOP)/mk/boilerplate.mk +# 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. @@ -50,6 +71,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 @@ -68,7 +91,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.ffi.configure: $(RM) -rf $(LIBFFI_DIR) build $(TAR) -zxf $(LIBFFI_TARBALL) mv $(LIBFFI_DIR) build @@ -81,17 +104,50 @@ 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! + sed -i -e s/soname_spec=.*/soname_spec="$(HS_DYN_LIB_NAME)"/ build/libtool touch $@ -ffi.h: stamp.ffi +ffi.h: stamp.ffi.configure $(CP) build/include/ffi.h . -$(STATIC_LIB) $(DYNAMIC_LIBS) $(DYNAMIC_PROG) : stamp.ffi +stamp.ffi.build: stamp.ffi.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.ffi.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 + ld -r -o HSffi.o /dev/null # this is intentional +# $(RM) -fr unpack +# (mkdir unpack; cd unpack; ar x ../libHSffi.a; ld -r -o ../HSffi.o *.o) +# $(RM) -fr unpack + +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.configure stamp.ffi.build ffi.h $(RM) -f libffi.a libffi.la $(DYNAMIC_PROG) $(DYNAMIC_LIBS) $(ORIG_DYNAMIC_LIBS) $(RM) -rf build diff --git a/libffi/package.conf.in b/libffi/package.conf.in new file mode 100644 index 0000000..2ef060c --- /dev/null +++ b/libffi/package.conf.in @@ -0,0 +1,39 @@ +#include "ghcconfig.h" +#include "RtsConfig.h" + +name: PACKAGE +version: 1.0 +license: BSD3 +maintainer: glasgow-haskell-users@haskell.org +exposed: True + +exposed-modules: +hidden-modules: +import-dirs: + +#ifdef INSTALLING +library-dirs: LIB_DIR +#else /* !INSTALLING */ +library-dirs: FPTOOLS_TOP_ABS"/libffi" +#endif + +hs-libraries: "HSffi" + +extra-libraries: "m" /* for ldexp() */ + +#ifdef INSTALLING +include-dirs: INCLUDE_DIR +#else /* !INSTALLING */ +include-dirs: FPTOOLS_TOP_ABS"/libffi/build/include" +#endif + +depends: +hugs-options: +cc-options: + +framework-dirs: +frameworks: + +haddock-interfaces: +haddock-html: + diff --git a/mk/package.mk b/mk/package.mk index 028600a..079e4f6 100644 --- a/mk/package.mk +++ b/mk/package.mk @@ -140,6 +140,7 @@ ifeq "$(NON_HS_PACKAGE)" "" SRC_HC_OPTS += -XGenerics endif +ifndef DONT_WANT_STD_LIBRARY ifndef LIBRARY ifeq "$(_way:%_dyn=YES)" "YES" LIBRARY = libHS$(PACKAGE)$(_way:%_dyn=%)-ghc$(ProjectVersion)$(soext) @@ -147,11 +148,13 @@ else LIBRARY = libHS$(PACKAGE)$(_way).a endif endif +endif ifeq "$(WAYS)" "" WAYS = $(GhcLibWays) endif +ifdef LIBRARY all :: $(LIBRARY) # POSSIBLE alternative version using --make: @@ -176,6 +179,7 @@ ifeq "$(DLLized)" "YES" INSTALL_PROGS += $(DLL_NAME) INSTALL_LIBS += $(patsubst %.a,%_imp.a, $(LIBRARY)) endif +endif # The interface files are put inside the $(libdir), since they # might (potentially) be platform specific.. diff --git a/rts/package.conf.in b/rts/package.conf.in index 1b274c9..e869d9c 100644 --- a/rts/package.conf.in +++ b/rts/package.conf.in @@ -25,13 +25,11 @@ library-dirs: FPTOOLS_TOP_ABS"/rts" GMP_LIB_DIRS PAPI_LIB_DIR # if !defined(HAVE_LIBGMP) && !defined(HAVE_FRAMEWORK_GMP) , FPTOOLS_TOP_ABS"/gmp" # endif - , FPTOOLS_TOP_ABS"/libffi" #endif hs-libraries: "HSrts" extra-libraries: "m" /* for ldexp() */ - , "ffi" #ifndef HAVE_FRAMEWORK_GMP , "gmp" #ifdef HAVE_LIBDL @@ -69,7 +67,7 @@ include-dirs: FPTOOLS_TOP_ABS"/includes" #endif includes: Stg.h -depends: +depends: ffi-1.0 hugs-options: cc-options: