Comments only
[ghc.git] / libffi / ghc.mk
index d922410..59e089d 100644 (file)
@@ -5,8 +5,8 @@
 # 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
+#      http://ghc.haskell.org/trac/ghc/wiki/Building/Architecture
+#      http://ghc.haskell.org/trac/ghc/wiki/Building/Modifying
 #
 # -----------------------------------------------------------------------------
 
@@ -35,6 +35,13 @@ libffi_STATIC_LIB  = libffi/build/inst/lib/libffi.a
 libffi_HEADERS     = rts/dist/build/ffi.h \
                      rts/dist/build/ffitarget.h
 
+ifeq "$(HostOS_CPP)" "mingw32"
+LIBFFI_NAME = ffi-6
+else
+LIBFFI_NAME = ffi
+endif
+LIBFFI_DLL = lib$(LIBFFI_NAME).dll
+
 ifeq "$(OSTYPE)" "cygwin"
 LIBFFI_PATH_MANGLE = PATH=$$(cygpath "$(TOP)")/libffi:$$PATH; export PATH;
 endif
@@ -48,41 +55,61 @@ $(libffi_STAMP_CONFIGURE): $(TOUCH_DEP)
        $(call removeFiles,$(libffi_STAMP_STATIC_SHARED_BUILD))
        $(call removeFiles,$(libffi_STAMP_STATIC_SHARED_INSTALL))
        $(call removeTrees,$(LIBFFI_DIR) libffi/build)
-       cat ghc-tarballs/libffi/libffi*.tar.gz | $(GZIP_CMD) -d | { cd libffi && $(TAR_CMD) -xf - ; }
+       cat libffi-tarballs/libffi*.tar.gz | $(GZIP_CMD) -d | { cd libffi && $(TAR_CMD) -xf - ; }
        mv libffi/libffi-* libffi/build
 
+# update config.guess/config.sub
+       $(CP) "$(TOP)/config.guess" libffi/build/config.guess
+       $(CP) "$(TOP)/config.sub"   libffi/build/config.sub
+
 # We have to fake a non-working ln for configure, so that the fallback
 # option (cp -p) gets used instead.  Otherwise the libffi build system
 # will use cygwin symbolic links which cannot be read by mingw gcc.
        chmod +x libffi/ln
 
+       # don't report nonselinux systems as selinux
+       ( cd libffi/build && "$(PATCH_CMD)" -p0 < ../libffi.x86-execstack.patch; )
+
        # We need to use -MMD rather than -MD, as otherwise we get paths
        # like c:/... in the dependency files on Windows, and the extra
        # colons break make
        mv libffi/build/Makefile.in libffi/build/Makefile.in.orig
        sed "s/-MD/-MMD/" < libffi/build/Makefile.in.orig > libffi/build/Makefile.in
 
+       # We attempt to specify the installation directory below with --libdir,
+       # but libffi installs into 'toolexeclibdir' instead, which may differ
+       # on systems where gcc has multilib support. Force libffi to use libdir.
+       # (https://sourceware.org/ml/libffi-discuss/2014/msg00016.html)
+       mv libffi/build/Makefile.in libffi/build/Makefile.in.orig
+       sed 's:@toolexeclibdir@:$$(libdir):g' < libffi/build/Makefile.in.orig > libffi/build/Makefile.in
+
        # Their cmd invocation only works on msys. On cygwin it starts
        # a cmd interactive shell. The replacement works in both environments.
        mv libffi/build/ltmain.sh libffi/build/ltmain.sh.orig
        sed 's#cmd //c echo "\$$1"#cmd /c "echo $$1"#' < libffi/build/ltmain.sh.orig > libffi/build/ltmain.sh
 
-# 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
+# * 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;
+#   hence the -w flags.
+# * We specify --libdir, as we need to know the path to libffi.a, but on
+#   some platforms it defaults to .../lib64/ rather than .../lib/.
        cd libffi && \
            $(LIBFFI_PATH_MANGLE) \
            cd build && \
            CC=$(CC_STAGE1) \
+           CXX=$(CC_STAGE1) \
            LD=$(LD) \
            AR=$(AR_STAGE1) \
            NM=$(NM) \
+           RANLIB=$(REAL_RANLIB_CMD) \
         CFLAGS="$(SRC_CC_OPTS) $(CONF_CC_OPTS_STAGE1) -w" \
-        LDFLAGS="$(SRC_LD_OPTS) $(CONF_GCC_LINKER_OPTS_STAGE1) -w" \
-        "$(SHELL)" configure \
+        LDFLAGS="$(SRC_LD_OPTS) -w" \
+        "$(SHELL)" ./configure \
                  --prefix=$(TOP)/libffi/build/inst \
+                 --libdir=$(TOP)/libffi/build/inst/lib \
                  --enable-static=yes \
                  --enable-shared=$(libffi_EnableShared) \
-                 --host=$(HOSTPLATFORM) --build=$(BUILDPLATFORM)
+                 --host=$(TargetPlatformFull)
 
        # wc on OS X has spaces in its output, which libffi's Makefile
        # doesn't expect, so we tweak it to sed them out