Commit 7c3b22ed authored by Ian Lynagh's avatar Ian Lynagh

Simplify the libffi build

We now put the libffi objects into the RTS library, rather than trying
to mangle libffi into being a ghc package itself. It would be nicer to
 make it a separate library (but not a ghc package), but for now
 hopefully this will get the build going through on Windows again.
parent bcab1273
......@@ -81,7 +81,7 @@ Library
if flag(ghci)
Build-Depends: template-haskell
CPP-Options: -DGHCI
Include-Dirs: ../libffi/build/include
Include-Dirs: ../rts/dist/build
Build-Depends: bin-package-db
Build-Depends: hoopl
......
......@@ -265,7 +265,7 @@ PRIMOP_BITS = compiler/primop-data-decl.hs-incl \
compiler_CPP_OPTS += -I$(GHC_INCLUDE_DIR)
compiler_CPP_OPTS += ${GhcCppOpts}
compiler/stage2/build/LibFFI.hs : libffi/dist-install/build/ffi.h
compiler/stage2/build/LibFFI.hs : $(ffi_HEADER)
$(PRIMOPS_TXT) compiler/parser/Parser.y: %: %.pp compiler/stage1/$(PLATFORM_H)
$(CPP) $(RAWCPP_FLAGS) -P $(compiler_CPP_OPTS) -x c $< | grep -v '^#pragma GCC' > $@
......
......@@ -257,7 +257,7 @@ include rules/tags-package.mk
include rules/extra-packages.mk
# -----------------------------------------------------------------------------
# Registering hand-written package descriptions (used in libffi and rts)
# Registering hand-written package descriptions (used in rts)
include rules/manual-package-config.mk
......@@ -471,10 +471,8 @@ utils/hsc2hs/dist-install/package-data.mk: compiler/stage2/package-data.mk
utils/compare_sizes/dist-install/package-data.mk: compiler/stage2/package-data.mk
utils/runghc/dist-install/package-data.mk: compiler/stage2/package-data.mk
# add the final two package.conf dependencies: ghc-prim depends on RTS,
# and RTS depends on libffi.
# add the final package.conf dependency: ghc-prim depends on RTS
libraries/ghc-prim/dist-install/package-data.mk : rts/package.conf.inplace
rts/package.conf.inplace : libffi/package.conf.inplace
endif
# --------------------------------
......@@ -492,11 +490,6 @@ ALL_STAGE1_LIBS += $(foreach lib,$(PACKAGES_STAGE1),$(libraries/$(lib)_dist-inst
endif
BOOT_LIBS = $(foreach lib,$(PACKAGES_STAGE0),$(libraries/$(lib)_dist-boot_v_LIB))
OTHER_LIBS = libffi/dist-install/build/libHSffi$(v_libsuf) libffi/dist-install/build/HSffi.o
ifeq "$(BuildSharedLibs)" "YES"
OTHER_LIBS += libffi/dist-install/build/libHSffi$(dyn_libsuf)
endif
# ----------------------------------------
# Special magic for the ghc-prim package
......@@ -890,11 +883,10 @@ INSTALL_DISTDIR_compiler = stage2
# Now we can do the installation
install_packages: install_libexecs
install_packages: libffi/package.conf.install rts/package.conf.install
install_packages: rts/package.conf.install
$(call INSTALL_DIR,"$(DESTDIR)$(topdir)")
"$(RM)" $(RM_OPTS_REC) "$(INSTALLED_PACKAGE_CONF)"
$(call INSTALL_DIR,"$(INSTALLED_PACKAGE_CONF)")
"$(INSTALLED_GHC_PKG_REAL)" --force --global-conf "$(INSTALLED_PACKAGE_CONF)" update libffi/package.conf.install
"$(INSTALLED_GHC_PKG_REAL)" --force --global-conf "$(INSTALLED_PACKAGE_CONF)" update rts/package.conf.install
$(foreach p, $(INSTALLED_PKG_DIRS), \
$(call make-command, \
......@@ -1219,7 +1211,6 @@ maintainer-clean : distclean
.PHONY: all_libraries
.PHONY: bootstrapping-files
bootstrapping-files: $(OTHER_LIBS)
bootstrapping-files: includes/ghcautoconf.h
bootstrapping-files: includes/DerivedConstants.h
bootstrapping-files: includes/GHCConstants.h
......
......@@ -11,75 +11,18 @@
# -----------------------------------------------------------------------------
# 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.
# -----------------------------------------------------------------------------
#
# 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.
ifeq "$(BuildSharedLibs)" "YES"
libffi_STAMP_CONFIGURE = libffi/stamp.ffi.configure-shared
libffi_STAMP_BUILD = libffi/stamp.ffi.build-shared
libffi_STAMP_INSTALL = libffi/stamp.ffi.install-shared
else
libffi_STAMP_CONFIGURE = libffi/stamp.ffi.configure
libffi_STAMP_BUILD = libffi/stamp.ffi.build
libffi_STAMP_INSTALL = libffi/stamp.ffi.install
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)
ifeq "$(Windows)" "YES"
libffi_DYNAMIC_PROG = $(libffi_HS_DYN_LIB).a
libffi_DYNAMIC_LIBS = $(libffi_HS_DYN_LIB)
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
endif
libffi_STATIC_LIB = libffi/build/inst/lib/libffi.a
ffi_HEADER = rts/dist/build/ffi.h
ifeq "$(BuildSharedLibs)" "YES"
libffi_EnableShared=yes
......@@ -87,29 +30,21 @@ else
libffi_EnableShared=no
endif
ifeq "$(BuildSharedLibs)" "YES"
INSTALL_LIBS += $(libffi_HS_DYN_LIB)
ifeq "$(Windows)" "YES"
INSTALL_PROGS += $(libffi_HS_DYN_LIB).a
endif
endif
# 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
# 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
cd libffi && \
PATH=`pwd`:$$PATH; \
PATH=$(TOP)/libffi:$$PATH; \
export PATH; \
cd build && \
CC=$(CC_STAGE1) \
......@@ -119,24 +54,11 @@ $(libffi_STAMP_CONFIGURE):
CFLAGS="$(SRC_CC_OPTS) $(CONF_CC_OPTS_STAGE1) -w" \
LDFLAGS="$(SRC_LD_OPTS) $(CONF_GCC_LINKER_OPTS_STAGE1) -w" \
"$(SHELL)" configure \
--prefix=$(TOP)/libffi/build/inst \
--enable-static=yes \
--enable-shared=$(libffi_EnableShared) \
--host=$(HOSTPLATFORM) --build=$(BUILDPLATFORM)
cp libffi/build/*/libtool libffi/build
# 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
# 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
......@@ -144,89 +66,23 @@ $(libffi_STAMP_CONFIGURE):
touch $@
libffi/dist-install/build/ffi.h: $(libffi_STAMP_CONFIGURE) libffi/dist-install/build/ffitarget.h | $$(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/.
$(libffi_STAMP_BUILD): $(libffi_STAMP_CONFIGURE)
$(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))
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; }
$(libffi_STAMP_INSTALL): $(libffi_STAMP_BUILD)
$(MAKE) -C libffi/build MAKEFLAGS= install
touch $@
# 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)" $< $@
$(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).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): $(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
$(eval $(call all-target,libffi,$(libffi_HS_DYN_LIB)))
endif
endif
$(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 $@
$(eval $(call clean-target,libffi,, \
libffi/build libffi/stamp.ffi.* libffi/dist-install))
endif
#-----------------------------------------------------------------------------
# Do the package config
libffi/build libffi/stamp.ffi.* libffi/dist-install))
$(eval $(call manual-package-config,libffi))
#-----------------------------------------------------------------------------
#
# binary-dist
endif
BINDIST_EXTRAS += libffi/package.conf.in
......@@ -172,15 +172,15 @@ rts_dist_$1_CC_OPTS += -DRtsWay=\"rts_$1\"
# Making a shared library for the RTS.
ifneq "$$(findstring dyn, $1)" ""
ifeq "$$(HOSTPLATFORM)" "i386-unknown-mingw32"
$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(ALL_RTS_DEF_LIBS) rts/libs.depend
$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(ALL_RTS_DEF_LIBS) rts/libs.depend $$(rts_ffi_objs_stamp)
"$$(RM)" $$(RM_OPTS) $$@
"$$(rts_dist_HC)" -package-name rts -shared -dynamic -dynload deploy \
-no-auto-link-packages `cat rts/libs.depend` $$(rts_$1_OBJS) $$(ALL_RTS_DEF_LIBS) -o $$@
-no-auto-link-packages `cat rts/libs.depend` $$(rts_ffi_objs) $$(rts_$1_OBJS) $$(ALL_RTS_DEF_LIBS) -o $$@
else
$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) rts/libs.depend
$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) rts/libs.depend $$(rts_ffi_objs_stamp)
"$$(RM)" $$(RM_OPTS) $$@
"$$(rts_dist_HC)" -package-name rts -shared -dynamic -dynload deploy \
-no-auto-link-packages `cat rts/libs.depend` $$(rts_$1_OBJS) \
-no-auto-link-packages `cat rts/libs.depend` $$(rts_ffi_objs) $$(rts_$1_OBJS) \
$$(rts_$1_DTRACE_OBJS) -o $$@
ifeq "$$(darwin_HOST_OS)" "1"
# Ensure library's install name is correct before anyone links with it.
......@@ -188,9 +188,9 @@ ifeq "$$(darwin_HOST_OS)" "1"
endif
endif
else
$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS)
$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) $$(rts_ffi_objs_stamp)
"$$(RM)" $$(RM_OPTS) $$@
echo $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) | "$$(XARGS)" $$(XARGS_OPTS) "$$(AR_STAGE1)" \
echo $$(rts_ffi_objs) $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) | "$$(XARGS)" $$(XARGS_OPTS) "$$(AR_STAGE1)" \
$$(AR_OPTS_STAGE1) $$(EXTRA_AR_ARGS_STAGE1) $$@
endif
......@@ -198,6 +198,12 @@ endif
endef
rts_ffi_objs_stamp = rts/dist/ffi/stamp
rts_ffi_objs = rts/dist/ffi/*.o
$(rts_ffi_objs_stamp): $(libffi_STATIC_LIB) | $$(dir $$@)/.
cd rts/dist/ffi && $(AR) x ../../../$(libffi_STATIC_LIB)
touch $@
# And expand the above for each way:
$(foreach way,$(rts_WAYS),$(eval $(call build-rts-way,$(way))))
......@@ -455,15 +461,7 @@ endif
$(eval $(call dependencies,rts,dist,1))
$(rts_dist_depfile_c_asm) : libffi/dist-install/build/ffi.h $(DTRACEPROBES_H)
#-----------------------------------------------------------------------------
# libffi stuff
rts_CC_OPTS += -Ilibffi/dist-install/build
rts_HC_OPTS += -Ilibffi/dist-install/build
rts_HSC2HS_OPTS += -Ilibffi/dist-install/build
rts_LD_OPTS += -Llibffi/dist-install/build
$(rts_dist_depfile_c_asm) : $(ffi_HEADER) $(DTRACEPROBES_H)
# -----------------------------------------------------------------------------
# compile dtrace probes if dtrace is supported
......
......@@ -55,7 +55,6 @@ include-dirs: TOP"/includes"
#endif
includes: Stg.h
depends: builtin_ffi
hugs-options:
cc-options:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment