Comments only
[ghc.git] / libffi / ghc.mk
index 22ce638..59e089d 100644 (file)
 # 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
 #
 # -----------------------------------------------------------------------------
 
 
-libffi_STAMP_CONFIGURE = libffi/stamp.ffi.configure
-libffi_STAMP_BUILD     = libffi/stamp.ffi.build
-libffi_STAMP_INSTALL   = libffi/stamp.ffi.install
+libffi_STAMP_STATIC_CONFIGURE = libffi/stamp.ffi.static.configure
+libffi_STAMP_STATIC_BUILD     = libffi/stamp.ffi.static.build
+libffi_STAMP_STATIC_INSTALL   = libffi/stamp.ffi.static.install
+
+libffi_STAMP_STATIC_SHARED_CONFIGURE = libffi/stamp.ffi.static-shared.configure
+libffi_STAMP_STATIC_SHARED_BUILD     = libffi/stamp.ffi.static-shared.build
+libffi_STAMP_STATIC_SHARED_INSTALL   = libffi/stamp.ffi.static-shared.install
+
+ifeq "$(BuildSharedLibs)" "YES"
+libffi_STAMP_CONFIGURE = $(libffi_STAMP_STATIC_SHARED_CONFIGURE)
+libffi_STAMP_BUILD     = $(libffi_STAMP_STATIC_SHARED_BUILD)
+libffi_STAMP_INSTALL   = $(libffi_STAMP_STATIC_SHARED_INSTALL)
+libffi_EnableShared    = yes
+else
+libffi_STAMP_CONFIGURE = $(libffi_STAMP_STATIC_CONFIGURE)
+libffi_STAMP_BUILD     = $(libffi_STAMP_STATIC_BUILD)
+libffi_STAMP_INSTALL   = $(libffi_STAMP_STATIC_INSTALL)
+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 "$(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
 
 ifneq "$(BINDIST)" "YES"
-$(libffi_STAMP_CONFIGURE):
-       "$(RM)" $(RM_OPTS_REC) $(LIBFFI_DIR) libffi/build
-       cat ghc-tarballs/libffi/libffi*.tar.gz | $(GZIP_CMD) -d | { cd libffi && $(TAR_CMD) -xf - ; }
+$(libffi_STAMP_CONFIGURE): $(TOUCH_DEP)
+       $(call removeFiles,$(libffi_STAMP_STATIC_CONFIGURE))
+       $(call removeFiles,$(libffi_STAMP_STATIC_BUILD))
+       $(call removeFiles,$(libffi_STAMP_STATIC_INSTALL))
+       $(call removeFiles,$(libffi_STAMP_STATIC_SHARED_CONFIGURE))
+       $(call removeFiles,$(libffi_STAMP_STATIC_SHARED_BUILD))
+       $(call removeFiles,$(libffi_STAMP_STATIC_SHARED_INSTALL))
+       $(call removeTrees,$(LIBFFI_DIR) libffi/build)
+       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
 
-# 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
+       # 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;
+#   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 && \
-           PATH=$(TOP)/libffi:$$PATH; \
-           export PATH; \
+           $(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 \
-                 --with-pic \
+                 --libdir=$(TOP)/libffi/build/inst/lib \
                  --enable-static=yes \
-                 --enable-shared=no \
-                 --host=$(HOSTPLATFORM) --build=$(BUILDPLATFORM)
+                 --enable-shared=$(libffi_EnableShared) \
+                 --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
        mv libffi/build/Makefile libffi/build/Makefile.orig
        sed "s#wc -w#wc -w | sed 's/ //g'#" < libffi/build/Makefile.orig > libffi/build/Makefile
 
-       touch $@
+       "$(TOUCH_CMD)" $@
 
-$(libffi_STAMP_BUILD): $(libffi_STAMP_CONFIGURE)
+$(libffi_STAMP_BUILD): $(libffi_STAMP_CONFIGURE) $(TOUCH_DEP)
        $(MAKE) -C libffi/build MAKEFLAGS=
-       touch $@
+       "$(TOUCH_CMD)" $@
 
-$(libffi_STAMP_INSTALL): $(libffi_STAMP_BUILD)
+$(libffi_STAMP_INSTALL): $(libffi_STAMP_BUILD) $(TOUCH_DEP)
        $(MAKE) -C libffi/build MAKEFLAGS= install
-       touch $@
+       "$(TOUCH_CMD)" $@
 
 $(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/lib/libffi-*/include/$(notdir $@) $@
 
 $(eval $(call clean-target,libffi,, \
-    libffi/build libffi/stamp.ffi.* libffi/dist-install))
+    libffi/build $(wildcard libffi/stamp.ffi.*) libffi/dist-install))
 
 endif