Add HsFFI.o to INSTALL_LIBS
[ghc.git] / libffi / Makefile
1
2 TOP=..
3 DONT_WANT_STD_GHCI_LIB_RULE=YES
4 DONT_WANT_STD_LIBRARY=YES
5
6 include $(TOP)/mk/boilerplate.mk
7 # Override haddock generation for this package
8 HADDOCK_DOCS=NO
9
10 # We package libffi as Haskell package for two reasons:
11
12 # 1) GHC uses different names for shared and static libs, so it can
13 # choose the lib variant to link with on its own. With regular
14 # libtool styled shared lib names, the linker would interfer and
15 # link against the shared lib variant even when GHC runs in -static
16 # mode.
17 # 2) The first issue isn't a problem when a shared lib of libffi would
18 # be installed in system locations, but we do not assume that. So,
19 # when running in -dynamic mode, we must either install libffi to
20 # system locations ourselves, or we must add its location to
21 # respective environment variable, (DY)LD_LIBRARY_PATH etc...before
22 # we call dynamically linked binaries. Especially, the latter is
23 # necessary as GHC calls binary it produced before its installation
24 # phase. However, both mechanism, installing to system locations or
25 # modifying (DY)LD_LIBRARY_PATH, are already in place for Haskell
26 # packages so with packaging libffi as Haskell package we reuse
27 # them naturally.
28
29 PACKAGE=ffi
30 # -----------------------------------------------------------------------------
31 #
32 # We use libffi's own configuration stuff.
33
34 PLATFORM := $(shell echo $(HOSTPLATFORM) | sed 's/i[567]86/i486/g')
35
36 # 2007-09-26
37 # set -o igncr
38 # is not a valid command on non-Cygwin-systems.
39 # Let it fail silently instead of aborting the build.
40 #
41 # 2007-07-05
42 # We do
43 # set -o igncr; export SHELLOPTS
44 # here as otherwise checking the size of limbs
45 # makes the build fall over on Cygwin. See the thread
46 # http://www.cygwin.com/ml/cygwin/2006-12/msg00011.html
47 # for more details.
48
49 # 2007-07-05
50 # Passing
51 # as_ln_s='cp -p'
52 # isn't sufficient to stop cygwin using symlinks the mingw gcc can't
53 # follow, as it isn't used consistently. Instead we put an ln.bat in
54 # path that always fails.
55
56 LIBFFI_TARBALL := $(firstword $(wildcard libffi*.tar.gz))
57 LIBFFI_DIR := $(subst .tar.gz,,$(LIBFFI_TARBALL))
58
59 BINDIST_STAMPS = stamp.ffi
60 INSTALL_HEADERS += ffi.h
61 STATIC_LIB = libffi.a
62 INSTALL_LIBS += libHSffi.a HSffi.o
63
64 # We have to add the GHC version to the name of our dynamic libs, because
65 # they will be residing in the system location along with dynamic libs from
66 # other GHC installations.
67 ifeq "$(Windows)" "YES"
68 DYNAMIC_PROG = libffi.dll.a
69 DYNAMIC_LIBS = libffi-3.dll
70 RENAME_LIBS =
71 else
72 DYNAMIC_PROG =
73 DYNAMIC_LIBS = libffi.so libffi.so.5 libffi.so.5.0.5
74 endif
75
76 HS_DYN_LIB_NAME=libHSffi-ghc$(ProjectVersion)$(soext)
77
78 ifeq "$(BuildSharedLibs)" "YES"
79 EnableShared=yes
80 else
81 EnableShared=no
82 endif
83
84 ifeq "$(BuildSharedLibs)" "YES"
85 INSTALL_LIBS += $(HS_DYN_LIB_NAME)
86 ifeq "$(Windows)" "YES"
87 INSTALL_PROGS += $(HS_DYN_LIB_NAME).a
88 endif
89 endif
90
91 install all :: $(INSTALL_HEADERS) $(INSTALL_LIBS) $(INSTALL_PROGS)
92
93 # We have to fake a non-working ln for configure, so that the fallback
94 # option (cp -p) gets used instead. Otherwise the libffi build system
95 # will use cygwin symbolic linkks which cannot be read by mingw gcc.
96 # The same trick is played by the GMP build in ../gmp.
97
98 stamp.ffi.configure:
99 $(RM) -rf $(LIBFFI_DIR) build
100 $(TAR) -zxf $(LIBFFI_TARBALL)
101 mv $(LIBFFI_DIR) build
102 chmod +x ln
103 (set -o igncr 2>/dev/null) && set -o igncr; export SHELLOPTS; \
104 PATH=`pwd`:$$PATH; \
105 export PATH; \
106 cd build && \
107 CC=$(WhatGccIsCalled) $(SHELL) configure \
108 --enable-static=yes \
109 --enable-shared=$(EnableShared) \
110 --host=$(PLATFORM) --build=$(PLATFORM)
111
112 # libffi.so needs to be built with the correct soname.
113 # NOTE: this builds libffi_convience.so with the incorrect
114 # soname, but we don't need that anyway!
115 $(CP) build/libtool build/libtool.orig
116 sed -e s/soname_spec=.*/soname_spec="$(HS_DYN_LIB_NAME)"/ build/libtool.orig > build/libtool
117 touch $@
118
119 ffi.h: stamp.ffi.configure
120 $(CP) build/include/ffi.h .
121
122 stamp.ffi.build: stamp.ffi.configure
123 $(MAKE) -C build MAKEFLAGS=
124 (cd build; ./libtool --mode=install cp libffi.la $(FPTOOLS_TOP_ABS)/libffi)
125 touch $@
126
127 $(STATIC_LIB) $(DYNAMIC_LIBS) $(DYNAMIC_PROG): stamp.ffi.build
128
129 libHSffi.a libHSffi_p.a: $(STATIC_LIB)
130 $(CP) $(STATIC_LIB) $@
131
132 all :: libHSffi.a libHSffi_p.a
133
134 # The GHCi import lib isn't needed as compiler/ghci/Linker.lhs + rts/Linker.c
135 # link the interpreted references to FFI to the compiled FFI.
136 # Instead of adding libffi to the list preloaded packages (see
137 # compiler/ghci/Linker.lhs:emptyPLS) we generate an empty HSffi.o
138
139 HSffi.o: libHSffi.a
140 touch empty.c
141 $(CC) -c empty.c -o HSffi.o
142
143 all :: HSffi.o
144
145 ifeq "$(BuildSharedLibs)" "YES"
146 $(HS_DYN_LIB_NAME): $(DYNAMIC_LIBS)
147 $(CP) $(word 1,$(DYNAMIC_LIBS)) $(HS_DYN_LIB_NAME)
148
149 all :: $(HS_DYN_LIB_NAME)
150 endif
151
152 clean distclean maintainer-clean ::
153 $(RM) -f stamp.ffi.configure stamp.ffi.build ffi.h empty.c
154 $(RM) -f libffi.a libffi.la $(DYNAMIC_PROG) $(DYNAMIC_LIBS) $(ORIG_DYNAMIC_LIBS)
155 $(RM) -rf build
156
157 #-----------------------------------------------------------------------------
158 #
159 # binary-dist
160
161 include $(TOP)/mk/target.mk
162
163 BINDIST_EXTRAS += $(BINDIST_STAMPS)
164 BINDIST_EXTRAS += $(INSTALL_PROGS)
165 BINDIST_EXTRAS += $(INSTALL_LIBS)
166 BINDIST_EXTRAS += $(INSTALL_HEADERS)
167 include $(TOP)/mk/bindist.mk
168