1 # -----------------------------------------------------------------------------
3 # (c) 2009 The University of Glasgow
5 # This file is part of the GHC build system.
7 # To understand how the build system works and how to modify it, see
8 # http://hackage.haskell.org/trac/ghc/wiki/Building/Architecture
9 # http://hackage.haskell.org/trac/ghc/wiki/Building/Modifying
11 # -----------------------------------------------------------------------------
14 # We package libffi as Haskell package for two reasons:
16 # 1) GHC uses different names for shared and static libs, so it can
17 # choose the lib variant to link with on its own. With regular
18 # libtool styled shared lib names, the linker would interfer and
19 # link against the shared lib variant even when GHC runs in -static
21 # 2) The first issue isn't a problem when a shared lib of libffi would
22 # be installed in system locations, but we do not assume that. So,
23 # when running in -dynamic mode, we must either install libffi to
24 # system locations ourselves, or we must add its location to
25 # respective environment variable, (DY)LD_LIBRARY_PATH etc...before
26 # we call dynamically linked binaries. Especially, the latter is
27 # necessary as GHC calls binary it produced before its installation
28 # phase. However, both mechanism, installing to system locations or
29 # modifying (DY)LD_LIBRARY_PATH, are already in place for Haskell
30 # packages so with packaging libffi as Haskell package we reuse
33 # -----------------------------------------------------------------------------
35 # We use libffi's own configuration stuff.
37 PLATFORM := $(shell echo $(HOSTPLATFORM) | sed 's/i[567]86/i486/g')
41 # is not a valid command on non-Cygwin-systems.
42 # Let it fail silently instead of aborting the build.
46 # set -o igncr; export SHELLOPTS
47 # here as otherwise checking the size of limbs
48 # makes the build fall over on Cygwin. See the thread
49 # http://www.cygwin.com/ml/cygwin/2006-12/msg00011.html
55 # isn't sufficient to stop cygwin using symlinks the mingw gcc can't
56 # follow, as it isn't used consistently. Instead we put an ln.bat in
57 # path that always fails.
59 ifeq "$(BuildSharedLibs)" "YES"
60 libffi_STAMP_CONFIGURE = libffi/stamp.ffi.configure-shared
61 libffi_STAMP_BUILD = libffi/stamp.ffi.build-shared
63 libffi_STAMP_CONFIGURE = libffi/stamp.ffi.configure
64 libffi_STAMP_BUILD = libffi/stamp.ffi.build
67 BINDIST_STAMPS = libffi/stamp.ffi.build libfii/stamp.ffi.configure
69 INSTALL_HEADERS += libffi/ffi.h
70 libffi_STATIC_LIB = libffi/libffi.a
71 INSTALL_LIBS += libffi/libHSffi.a libffi/HSffi.o
73 # We have to add the GHC version to the name of our dynamic libs, because
74 # they will be residing in the system location along with dynamic libs from
75 # other GHC installations.
77 libffi_HS_DYN_LIB_NAME = libHSffi$(dyn_libsuf)
78 libffi_HS_DYN_LIB = libffi/$(libffi_HS_DYN_LIB_NAME)
80 ifeq "$(Windows)" "YES"
81 libffi_DYNAMIC_PROG = $(libffi_HS_DYN_LIB).a
82 libffi_DYNAMIC_LIBS = $(libffi_HS_DYN_LIB)
85 libffi_DYNAMIC_LIBS = libffi/libffi.so libffi/libffi.so.5 libffi/libffi.so.5.0.7
88 ifeq "$(BuildSharedLibs)" "YES"
89 libffi_EnableShared=yes
91 libffi_EnableShared=no
94 ifeq "$(BuildSharedLibs)" "YES"
95 INSTALL_LIBS += $(libffi_HS_DYN_LIB)
96 ifeq "$(Windows)" "YES"
97 INSTALL_PROGS += $(libffi_HS_DYN_LIB).a
101 # We have to fake a non-working ln for configure, so that the fallback
102 # option (cp -p) gets used instead. Otherwise the libffi build system
103 # will use cygwin symbolic linkks which cannot be read by mingw gcc.
104 # The same trick is played by the GMP build in ../gmp.
106 ifneq "$(BINDIST)" "YES"
107 $(libffi_STAMP_CONFIGURE):
108 "$(RM)" $(RM_OPTS) -r $(LIBFFI_DIR) libffi/build
109 cd libffi && $(TAR) -zxf tarball/libffi*.tar.gz
110 mv libffi/libffi-* libffi/build
112 cd libffi/build && "$(PATCH)" -p1 < ../libffi.dllize-3.0.8.patch
113 # This patch is just the resulting delta from running
114 # automake && autoreconf && libtoolize --force --copy
115 cd libffi/build && "$(PATCH)" -p1 < ../libffi.autotools-update-3.0.8.patch
117 # Because -Werror may be in SRC_CC_OPTS/SRC_LD_OPTS, we need to turn
118 # warnings off or the compilation of libffi might fail due to warnings
120 (set -o igncr 2>/dev/null) && set -o igncr; export SHELLOPTS; \
124 CC=$(WhatGccIsCalled) \
125 CFLAGS="$(SRC_CC_OPTS) -w" \
126 LDFLAGS="$(SRC_LD_OPTS) -w" \
127 "$(SHELL)" configure \
128 --enable-static=yes \
129 --enable-shared=$(libffi_EnableShared) \
130 --host=$(PLATFORM) --build=$(PLATFORM)
132 # libffi.so needs to be built with the correct soname.
133 # NOTE: this builds libffi_convience.so with the incorrect
134 # soname, but we don't need that anyway!
136 "$(CP)" build/libtool build/libtool.orig; \
137 sed -e s/soname_spec=.*/soname_spec="$(libffi_HS_DYN_LIB_NAME)"/ build/libtool.orig > build/libtool
139 # We don't want libtool's cygwin hacks
141 "$(CP)" build/libtool build/libtool.orig; \
142 sed -e s/dlname=\'\$$tdlname\'/dlname=\'\$$dlname\'/ build/libtool.orig > build/libtool
146 libffi/ffi.h: $(libffi_STAMP_CONFIGURE)
147 "$(CP)" libffi/build/include/ffi.h $@
149 $(libffi_STAMP_BUILD): $(libffi_STAMP_CONFIGURE)
151 $(MAKE) -C build MAKEFLAGS=; \
152 (cd build; ./libtool --mode=install cp libffi.la $(TOP)/libffi)
155 $(libffi_STATIC_LIB): $(libffi_STAMP_BUILD)
156 # Rename libffi.a to libHSffi.a
157 libffi/libHSffi.a libffi/libHSffi_p.a: $(libffi_STATIC_LIB)
158 "$(CP)" $(libffi_STATIC_LIB) libffi/libHSffi.a
159 "$(CP)" $(libffi_STATIC_LIB) libffi/libHSffi_p.a
161 $(eval $(call all-target,libffi,libffi/libHSffi.a libffi/libHSffi_p.a))
163 # The GHCi import lib isn't needed as compiler/ghci/Linker.lhs + rts/Linker.c
164 # link the interpreted references to FFI to the compiled FFI.
165 # Instead of adding libffi to the list preloaded packages (see
166 # compiler/ghci/Linker.lhs:emptyPLS) we generate an empty HSffi.o
168 libffi/HSffi.o: libffi/libHSffi.a
171 "$(CC)" $(SRC_CC_OPTS) -c empty.c -o HSffi.o
173 $(eval $(call all-target,libffi,libffi/HSffi.o))
175 ifeq "$(BuildSharedLibs)" "YES"
176 ifeq "$(Windows)" "YES"
177 libffi/libffi.dll.a $(libffi_HS_DYN_LIB): $(libffi_STAMP_BUILD)
178 # Windows libtool creates <soname>.dll, and as we already patched that
179 # there is no need to copy from libffi.dll to libHSffi...dll.
180 # However, the renaming is still required for the import library
182 $(libffi_HS_DYN_LIB).a: libffi/libffi.dll.a
183 "$(CP)" libffi/libffi.dll.a $(libffi_HS_DYN_LIB).a
185 $(eval $(call all-target,libffi,$(libffi_HS_DYN_LIB).a))
188 $(libffi_DYNAMIC_LIBS): $(libffi_STAMP_BUILD)
189 # Rename libffi.so to libHSffi...so
190 $(libffi_HS_DYN_LIB): $(libffi_DYNAMIC_LIBS)
191 "$(CP)" $(word 1,$(libffi_DYNAMIC_LIBS)) $(libffi_HS_DYN_LIB)
193 $(eval $(call all-target,libffi,$(libffi_HS_DYN_LIB)))
197 $(eval $(call clean-target,libffi,, \
198 libffi/build libffi/stamp.ffi.* libffi/ffi.h libffi/empty.c \
199 libffi/libffi.a libffi/libffi.la \
200 libffi/HSffi.o libffi/libHSffi.a libffi/libHSffi_p.a \
201 $(libffi_DYNAMIC_PROG) $(libffi_DYNAMIC_LIBS) \
202 $(libffi_HS_DYN_LIB) $(libffi_HS_DYN_LIB).a))
205 #-----------------------------------------------------------------------------
206 # Do the package config
208 $(eval $(call manual-package-config,libffi))
210 #-----------------------------------------------------------------------------
214 BINDIST_EXTRAS += libffi/package.conf.in