Normalise EmptyCase types using the constraint solver
[ghc.git] / libffi / ghc.mk
index 85a2822..6bc8897 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
 #
 # -----------------------------------------------------------------------------
 
@@ -32,11 +32,15 @@ libffi_EnableShared    = no
 endif
 
 libffi_STATIC_LIB  = libffi/build/inst/lib/libffi.a
-ffi_HEADER         = rts/dist/build/ffi.h
+libffi_HEADERS     = rts/dist/build/ffi.h \
+                     rts/dist/build/ffitarget.h
 
-ifeq "$(OSTYPE)" "cygwin"
-LIBFFI_PATH_MANGLE = PATH=$$(cygpath "$(TOP)")/libffi:$$PATH; export PATH;
+ifeq "$(HostOS_CPP)" "mingw32"
+LIBFFI_NAME = ffi-6
+else
+LIBFFI_NAME = ffi
 endif
+LIBFFI_DLL = lib$(LIBFFI_NAME).dll
 
 ifneq "$(BINDIST)" "YES"
 $(libffi_STAMP_CONFIGURE): $(TOUCH_DEP)
@@ -47,9 +51,13 @@ $(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.
@@ -61,27 +69,40 @@ $(libffi_STAMP_CONFIGURE): $(TOUCH_DEP)
        mv libffi/build/Makefile.in libffi/build/Makefile.in.orig
        sed "s/-MD/-MMD/" < 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
+       # 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
+
+       # install-sh is used when /usr/bin/install is missing; ensure its
+       # path in libffi's Makefile is correct. See GHC #11109.
+       mv libffi/build/Makefile.in libffi/build/Makefile.in.orig
+       sed 's|@INSTALL@|$$(subst ../install-sh,$(TOP)/install-sh,@INSTALL@)|g' < libffi/build/Makefile.in.orig > libffi/build/Makefile.in
 
-# 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 \
+                 --disable-docs \
                  --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
@@ -91,7 +112,8 @@ $(libffi_STAMP_CONFIGURE): $(TOUCH_DEP)
        "$(TOUCH_CMD)" $@
 
 $(libffi_STAMP_BUILD): $(libffi_STAMP_CONFIGURE) $(TOUCH_DEP)
-       $(MAKE) -C libffi/build MAKEFLAGS=
+       # Use 'sync' as a temporary solution for #11960 (parallelisation bug).
+       sync; $(MAKE) -C libffi/build MAKEFLAGS=
        "$(TOUCH_CMD)" $@
 
 $(libffi_STAMP_INSTALL): $(libffi_STAMP_BUILD) $(TOUCH_DEP)
@@ -101,9 +123,8 @@ $(libffi_STAMP_INSTALL): $(libffi_STAMP_BUILD) $(TOUCH_DEP)
 $(libffi_STATIC_LIB): $(libffi_STAMP_INSTALL)
        @test -f $@ || { echo "$< exists, but $@ does not."; echo "Suggest removing $<."; exit 1; }
 
-$(ffi_HEADER): $(libffi_STAMP_INSTALL) | $$(dir $$@)/.
-       cp libffi/build/inst/lib/libffi-*/include/ffitarget.h $(dir $@)
-       cp libffi/build/inst/lib/libffi-*/include/ffi.h $@
+$(libffi_HEADERS): $(libffi_STAMP_INSTALL) | $$(dir $$@)/.
+       cp -f libffi/build/inst/include/$(notdir $@) $@
 
 $(eval $(call clean-target,libffi,, \
     libffi/build $(wildcard libffi/stamp.ffi.*) libffi/dist-install))