Enable shared libs on OpenBSD
[ghc-hetmet.git] / libffi / ghc.mk
index eca8dd2..eaffa3f 100644 (file)
@@ -1,3 +1,15 @@
+# -----------------------------------------------------------------------------
+#
+# (c) 2009 The University of Glasgow
+#
+# This file is part of the GHC build system.
+#
+# To understand how the build system works and how to modify it, see
+#      http://hackage.haskell.org/trac/ghc/wiki/Building/Architecture
+#      http://hackage.haskell.org/trac/ghc/wiki/Building/Modifying
+#
+# -----------------------------------------------------------------------------
+
 
 # We package libffi as Haskell package for two reasons: 
 
 
 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'
@@ -45,32 +44,43 @@ PLATFORM := $(shell echo $(HOSTPLATFORM) | sed 's/i[567]86/i486/g')
 # path that always fails.
 
 ifeq "$(BuildSharedLibs)" "YES"
-libffi_STAMP_BUILD     = libffi/stamp.ffi.build-shared
 libffi_STAMP_CONFIGURE = libffi/stamp.ffi.configure-shared
+libffi_STAMP_BUILD     = libffi/stamp.ffi.build-shared
 else
-libffi_STAMP_BUILD     = libffi/stamp.ffi.build
 libffi_STAMP_CONFIGURE = libffi/stamp.ffi.configure
+libffi_STAMP_BUILD     = libffi/stamp.ffi.build
 endif
 
 BINDIST_STAMPS = libffi/stamp.ffi.build libfii/stamp.ffi.configure
 
-INSTALL_HEADERS   += libffi/ffi.h
-libffi_STATIC_LIB  = libffi/libffi.a
-INSTALL_LIBS      += libffi/libHSffi.a libffi/HSffi.o
+INSTALL_HEADERS   += libffi/dist-install/build/ffi.h \
+                    libffi/dist-install/build/ffitarget.h
+libffi_STATIC_LIB  = libffi/dist-install/build/libffi.a
+INSTALL_LIBS      += libffi/dist-install/build/libHSffi.a \
+                     libffi/dist-install/build/libHSffi_p.a \
+                     libffi/dist-install/build/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
 # other GHC installations.
 
-libffi_HS_DYN_LIB_NAME=libHSffi-ghc$(ProjectVersion)$(soext)
-libffi_HS_DYN_LIB_PATH=libffi/$(libffi_HS_DYN_LIB_NAME)
+libffi_HS_DYN_LIB_NAME = libHSffi$(dyn_libsuf)
+libffi_HS_DYN_LIB      = libffi/dist-install/build/$(libffi_HS_DYN_LIB_NAME)
 
 ifeq "$(Windows)" "YES"
-libffi_DYNAMIC_PROG = $(libffi_HS_DYN_LIB_PATH).a
-libffi_DYNAMIC_LIBS = $(libffi_HS_DYN_LIB_PATH)
+libffi_DYNAMIC_PROG = $(libffi_HS_DYN_LIB).a
+libffi_DYNAMIC_LIBS = $(libffi_HS_DYN_LIB)
 else
 libffi_DYNAMIC_PROG =
-libffi_DYNAMIC_LIBS = libffi/libffi.so libffi/libffi.so.5 libffi/libffi.so.5.0.7
+ifeq "$(darwin_TARGET_OS)" "1"
+libffi_DYNAMIC_LIBS = libffi/dist-install/build/libffi$(soext) \
+                      libffi/dist-install/build/libffi.5$(soext)
+else ifeq "$(openbsd_TARGET_OS)" "1"
+libffi_DYNAMIC_LIBS = libffi/dist-install/build/libffi.so.5.10
+else
+libffi_DYNAMIC_LIBS = libffi/dist-install/build/libffi.so \
+                      libffi/dist-install/build/libffi.so.5
+endif
 endif
 
 ifeq "$(BuildSharedLibs)" "YES"
@@ -80,9 +90,9 @@ libffi_EnableShared=no
 endif
 
 ifeq "$(BuildSharedLibs)" "YES"
-INSTALL_LIBS  += $(libffi_HS_DYN_LIB_PATH)
+INSTALL_LIBS  += $(libffi_HS_DYN_LIB)
 ifeq "$(Windows)" "YES"
-INSTALL_PROGS += $(libffi_HS_DYN_LIB_PATH).a
+INSTALL_PROGS += $(libffi_HS_DYN_LIB).a
 endif
 endif
 
@@ -93,91 +103,114 @@ endif
 
 ifneq "$(BINDIST)" "YES"
 $(libffi_STAMP_CONFIGURE):
-       $(RM) -rf $(LIBFFI_DIR) libffi/build
-       cd libffi && $(TAR) -zxf tarball/libffi*.tar.gz
+       "$(RM)" $(RM_OPTS_REC) $(LIBFFI_DIR) libffi/build
+       cat ghc-tarballs/libffi/libffi*.tar.gz | $(GZIP_CMD) -d | { cd libffi && $(TAR_CMD) -xf - ; }
        mv libffi/libffi-* libffi/build
        chmod +x libffi/ln
-       cd libffi && $(PATCH) -p0 < libffi.dllize-3.0.6.patch
-
-       # This patch is just the resulting delta from running automake, autoreconf, libtoolize --force --copy
-       cd libffi && $(PATCH) -p0 < libffi.autotools-update.patch
 
+# Because -Werror may be in SRC_CC_OPTS/SRC_LD_OPTS, we need to turn
+# warnings off or the compilation of libffi might fail due to warnings
        cd libffi && \
-         (set -o igncr 2>/dev/null) && set -o igncr; export SHELLOPTS; \
            PATH=`pwd`:$$PATH; \
            export PATH; \
            cd build && \
-           CC=$(WhatGccIsCalled) $(SHELL) configure \
-                 --enable-static=yes \
+           CC=$(WhatGccIsCalled) \
+           LD=$(LD) \
+           AR=$(AR) \
+           NM=$(NM) \
+        CFLAGS="$(SRC_CC_OPTS) $(CONF_CC_OPTS_STAGE1) -w" \
+        LDFLAGS="$(SRC_LD_OPTS) $(CONF_LD_OPTS_STAGE1) -w" \
+        "$(SHELL)" configure \
+                 --enable-static=yes \
                  --enable-shared=$(libffi_EnableShared) \
-                 --host=$(PLATFORM) --build=$(PLATFORM)
+                 --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!
        cd libffi && \
-         $(CP) build/libtool build/libtool.orig; \
+         "$(CP)" build/libtool build/libtool.orig; \
          sed -e s/soname_spec=.*/soname_spec="$(libffi_HS_DYN_LIB_NAME)"/ build/libtool.orig > build/libtool
 
        # We don't want libtool's cygwin hacks
        cd libffi && \
-         $(CP) build/libtool build/libtool.orig; \
+         "$(CP)" build/libtool build/libtool.orig; \
          sed -e s/dlname=\'\$$tdlname\'/dlname=\'\$$dlname\'/ build/libtool.orig > build/libtool
 
        touch $@
 
-libffi/ffi.h: $(libffi_STAMP_CONFIGURE)
-       $(CP) libffi/build/include/ffi.h $@
+libffi/dist-install/build/ffi.h: $(libffi_STAMP_CONFIGURE) | $$(dir $$@)/.
+       "$(CP)" libffi/build/include/ffi.h $@
+
+libffi/dist-install/build/ffitarget.h: $(libffi_STAMP_CONFIGURE) | $$(dir $$@)/.
+       "$(CP)" libffi/build/include/ffitarget.h $@
+
+$(libffi_STAMP_BUILD): $(libffi_STAMP_CONFIGURE) | libffi/dist-install/build/.
+       $(MAKE) -C libffi/build MAKEFLAGS=
+       cd libffi/build && ./libtool --mode=install cp libffi.la $(TOP)/libffi/dist-install/build
+
+       # We actually want both static and dllized libraries, because we build
+       #   the runtime system both ways. libffi_convenience.a is the static version.
+ifeq "$(Windows)" "YES"
+       cp libffi/build/.libs/libffi_convenience.a $(libffi_STATIC_LIB)
+endif
 
-$(libffi_STAMP_BUILD): $(libffi_STAMP_CONFIGURE)
-       cd libffi && \
-         $(MAKE) -C build MAKEFLAGS=; \
-         (cd build; ./libtool --mode=install cp libffi.la $(TOP)/libffi)
-       $(CP) $(libffi_STATIC_LIB) libffi/libHSffi.a
-       $(CP) $(libffi_STATIC_LIB) libffi/libHSffi_p.a
        touch $@
 
-libffi/libHSffi.a libffi/libHSffi_p.a: $(libffi_STAMP_BUILD)
+$(libffi_STATIC_LIB): $(libffi_STAMP_BUILD)
+       @test -f $@ || { echo "$< exits, but $@ does not."; echo "Suggest removing $<."; exit 1; }
+
+# Rename libffi.a to libHSffi.a
+libffi/dist-install/build/libHSffi.a libffi/dist-install/build/libHSffi_p.a: $(libffi_STATIC_LIB)
+       "$(CP)" $(libffi_STATIC_LIB) libffi/dist-install/build/libHSffi.a
+       "$(CP)" $(libffi_STATIC_LIB) libffi/dist-install/build/libHSffi_p.a
 
-all_libffi : libffi/libHSffi.a libffi/libHSffi_p.a
+$(eval $(call all-target,libffi,$(INSTALL_HEADERS) $(INSTALL_LIBS)))
 
 # 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
 
-libffi/HSffi.o: libffi/libHSffi.a
-       cd libffi && \
-         touch empty.c; \
-         $(CC) -c empty.c -o HSffi.o
+libffi/dist-install/build/HSffi.o: libffi/dist-install/build/libHSffi.a
+       cd libffi/dist-install/build && \
+         touch empty.c && \
+         "$(CC)" $(SRC_CC_OPTS) $(CONF_CC_OPTS_STAGE1) -c empty.c -o HSffi.o
 
-all_libffi : libffi/HSffi.o
+$(eval $(call all-target,libffi,libffi/dist-install/build/HSffi.o))
 
 ifeq "$(BuildSharedLibs)" "YES"
 ifeq "$(Windows)" "YES"
+libffi/libffi.dll.a $(libffi_HS_DYN_LIB): $(libffi_STAMP_BUILD)
+       @test -f $@ || { echo "$< exits, but $@ does not."; echo "Suggest removing $<."; exit 1; }
+
 # Windows libtool creates <soname>.dll, and as we already patched that
 # there is no need to copy from libffi.dll to libHSffi...dll.
 # However, the renaming is still required for the import library
 # libffi.dll.a.
-$(libffi_HS_DYN_LIB_PATH).a: $(libffi_STAMP_BUILD)
-       $(CP) libffi/libffi.dll.a $(libffi_HS_DYN_LIB_PATH).a
-all_libffi : $(libffi_HS_DYN_LIB_PATH).a
+$(libffi_HS_DYN_LIB).a: libffi/dist-install/build/libffi.dll.a | $$(dir $$@)/.
+       "$(CP)" $< $@
+
+$(eval $(call all-target,libffi,$(libffi_HS_DYN_LIB).a))
 
 else
+$(libffi_DYNAMIC_LIBS): $(libffi_STAMP_BUILD)
+       @test -f $@ || { echo "$< exits, but $@ does not."; echo "Suggest removing $<."; exit 1; }
+
 # Rename libffi.so to libHSffi...so
-$(libffi_HS_DYN_LIB_PATH): $(libffi_DYNAMIC_LIBS)
-       $(CP) $(word 1,$(libffi_DYNAMIC_LIBS)) $(libffi_HS_DYN_LIB_PATH)
+$(libffi_HS_DYN_LIB): $(libffi_DYNAMIC_LIBS) | $$(dir $$@)/.
+       "$(CP)" $(word 1,$(libffi_DYNAMIC_LIBS)) $(libffi_HS_DYN_LIB)
+ifeq "$(darwin_TARGET_OS)" "1"
+       # Ensure library's install name is correct before anyone links with it.
+       install_name_tool -id $(ghclibdir)/$(libffi_HS_DYN_LIB_NAME) $(libffi_HS_DYN_LIB)
+endif
 
-all_libffi : $(libffi_HS_DYN_LIB_PATH)
+$(eval $(call all-target,libffi,$(libffi_HS_DYN_LIB)))
 endif
 endif
 
 $(eval $(call clean-target,libffi,, \
-   libffi/build libffi/stamp.ffi.* libffi/ffi.h libffi/empty.c \
-   libffi/libffi.a libffi/libffi.la \
-   libffi/HSffi.o libffi/libHSffi.a libffi/libHSffi_p.a \
-   $(libffi_DYNAMIC_PROG) $(libffi_DYNAMIC_LIBS) \
-   $(libffi_HS_DYN_LIB_NAME) $(libffi_HS_DYN_LIB_NAME).a))
+   libffi/build libffi/stamp.ffi.* libffi/dist-install))
 endif
 
 #-----------------------------------------------------------------------------