Comments only
[ghc.git] / libffi / ghc.mk
index f7caeda..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
 #
 # -----------------------------------------------------------------------------
 
 
-# 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.
+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
 
-# -----------------------------------------------------------------------------
-#
-# We use libffi's own configuration stuff.
-
-# 2007-07-05
-# Passing
-#     as_ln_s='cp -p'
-# isn't sufficient to stop cygwin using symlinks the mingw gcc can't
-# follow, as it isn't used consistently. Instead we put an ln.bat in
-# path that always fails.
+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.ffi.configure-shared
-libffi_STAMP_BUILD     = libffi/stamp.ffi.build-shared
+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.ffi.configure
-libffi_STAMP_BUILD     = libffi/stamp.ffi.build
+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
 
-BINDIST_STAMPS = libffi/stamp.ffi.build libfii/stamp.ffi.configure
-
-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$(dyn_libsuf)
-libffi_HS_DYN_LIB      = libffi/dist-install/build/$(libffi_HS_DYN_LIB_NAME)
+libffi_STATIC_LIB  = libffi/build/inst/lib/libffi.a
+libffi_HEADERS     = rts/dist/build/ffi.h \
+                     rts/dist/build/ffitarget.h
 
-ifeq "$(Windows)" "YES"
-libffi_DYNAMIC_PROG = $(libffi_HS_DYN_LIB).a
-libffi_DYNAMIC_LIBS = $(libffi_HS_DYN_LIB)
+ifeq "$(HostOS_CPP)" "mingw32"
+LIBFFI_NAME = ffi-6
 else
-libffi_DYNAMIC_PROG =
-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
+LIBFFI_NAME = ffi
 endif
+LIBFFI_DLL = lib$(LIBFFI_NAME).dll
 
-ifeq "$(BuildSharedLibs)" "YES"
-libffi_EnableShared=yes
-else
-libffi_EnableShared=no
+ifeq "$(OSTYPE)" "cygwin"
+LIBFFI_PATH_MANGLE = PATH=$$(cygpath "$(TOP)")/libffi:$$PATH; export PATH;
 endif
 
-ifeq "$(BuildSharedLibs)" "YES"
-INSTALL_LIBS  += $(libffi_HS_DYN_LIB)
-ifeq "$(Windows)" "YES"
-INSTALL_PROGS += $(libffi_HS_DYN_LIB).a
-endif
-endif
+ifneq "$(BINDIST)" "YES"
+$(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 linkks which cannot be read by mingw gcc.
-# The same trick is played by the GMP build in ../gmp.
-
-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 - ; }
-       mv libffi/libffi-* libffi/build
+# 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.selinux-detection-3.0.8.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
+       # 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=`pwd`:$$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 \
+                 --libdir=$(TOP)/libffi/build/inst/lib \
                  --enable-static=yes \
                  --enable-shared=$(libffi_EnableShared) \
-                 --host=$(HOSTPLATFORM) --build=$(BUILDPLATFORM)
-
-       # 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; \
-         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; \
-         sed -e s/dlname=\'\$$tdlname\'/dlname=\'\$$dlname\'/ build/libtool.orig > build/libtool
-
-       touch $@
+                 --host=$(TargetPlatformFull)
 
-libffi/dist-install/build/ffi.h: $(libffi_STAMP_CONFIGURE) libffi/dist-install/build/ffitarget.h | $$(dir $$@)/.
-       "$(CP)" libffi/build/include/ffi.h $@
+       # 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
 
-libffi/dist-install/build/ffitarget.h: $(libffi_STAMP_CONFIGURE) | $$(dir $$@)/.
-       "$(CP)" libffi/build/include/ffitarget.h $@
+       "$(TOUCH_CMD)" $@
 
-$(libffi_STAMP_BUILD): $(libffi_STAMP_CONFIGURE) | libffi/dist-install/build/.
+$(libffi_STAMP_BUILD): $(libffi_STAMP_CONFIGURE) $(TOUCH_DEP)
        $(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
-
-       touch $@
-
-$(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_STATIC_LIB)
-       "$(CP)" $(libffi_STATIC_LIB) 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_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/dist-install/build/HSffi.o: libffi/dist-install/build/libHSffi.a
-       cd libffi/dist-install/build && \
-         touch empty.c && \
-         "$(CC_STAGE1)" $(SRC_CC_OPTS) $(CONF_CC_OPTS_STAGE1) -c empty.c -o HSffi.o
-
-$(eval $(call all-target,libffi,libffi/dist-install/build/HSffi.o))
+       "$(TOUCH_CMD)" $@
 
-ifeq "$(BuildSharedLibs)" "YES"
-ifeq "$(Windows)" "YES"
-libffi/dist-install/build/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).a: libffi/dist-install/build/libffi.dll.a | $$(dir $$@)/.
-       "$(CP)" $< $@
-
-$(eval $(call all-target,libffi,$(libffi_HS_DYN_LIB).a))
+$(libffi_STAMP_INSTALL): $(libffi_STAMP_BUILD) $(TOUCH_DEP)
+       $(MAKE) -C libffi/build MAKEFLAGS= install
+       "$(TOUCH_CMD)" $@
 
-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): $(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
+$(libffi_STATIC_LIB): $(libffi_STAMP_INSTALL)
+       @test -f $@ || { echo "$< exists, but $@ does not."; echo "Suggest removing $<."; exit 1; }
 
-$(eval $(call all-target,libffi,$(libffi_HS_DYN_LIB)))
-endif
-endif
+$(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))
-endif
-
-#-----------------------------------------------------------------------------
-# Do the package config
+    libffi/build $(wildcard libffi/stamp.ffi.*) libffi/dist-install))
 
-$(eval $(call manual-package-config,libffi))
-
-#-----------------------------------------------------------------------------
-#
-# binary-dist
+endif
 
-BINDIST_EXTRAS += libffi/package.conf.in