summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen.Lippmeier@anu.edu.au <unknown>2009-11-11 01:48:21 +0000
committerBen.Lippmeier@anu.edu.au <unknown>2009-11-11 01:48:21 +0000
commitfcf0225457abec189ea630163fa56bc48c2d796d (patch)
tree26317325a0fa1e31603aa62679b53815389bb130
parente60ef3d0da7e37e7b18088b42925e60b1b47a29e (diff)
downloadhaskell-fcf0225457abec189ea630163fa56bc48c2d796d.tar.gz
Windows DLLs: use one import lib for each DLL the RTS needs.
-rw-r--r--rts/ghc.mk65
-rw-r--r--rts/win32/libHSbase.def27
-rw-r--r--rts/win32/libHSffi.def20
-rw-r--r--rts/win32/libHSghc-prim.def13
4 files changed, 87 insertions, 38 deletions
diff --git a/rts/ghc.mk b/rts/ghc.mk
index a4c31d8e80..7276e72bcd 100644
--- a/rts/ghc.mk
+++ b/rts/ghc.mk
@@ -74,9 +74,54 @@ rts/libs.depend : $(GHC_PKG_INPLACE)
"$(GHC_PKG_INPLACE)" field rts extra-libraries \
| sed -e 's/^extra-libraries: //' -e 's/\([a-z0-9]*\)[ ]*/-l\1 /g' > $@
+
+# ----------------------------------------------------------------------------
+# On Windows, as the RTS and base libraries have recursive imports,
+# we have to break the loop with "import libraries".
+# These are made from rts/win32/libHS*.def which contain lists of
+# all the symbols in those libraries used by the RTS.
+#
+ifneq "$$(findstring dyn, $1)" ""
+ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
+
+ALL_RTS_DEF_LIBNAMES = base ghc-prim
+ALL_RTS_DEF_LIBS = \
+ rts/dist/build/win32/libHSbase.dll.a \
+ rts/dist/build/win32/libHSghc-prim.dll.a \
+ rts/dist/build/win32/libHSffi.dll.a \
+ gmp/libgmp.dll.a
+
+
+# -- import libs for the regular Haskell libraries
+define make-importlib-def # args $1 = lib name
+rts/dist/build/win32/libHS$1.def : rts/win32/libHS$1.def
+ cat rts/win32/libHS$1.def \
+ | sed "s/@LibVersion@/$$(libraries/$1_dist-install_VERSION)/" \
+ | sed "s/@ProjectVersion@/$(ProjectVersion)/" \
+ > rts/dist/build/win32/libHS$1.def
+
+rts/dist/build/win32/libHS$1.dll.a : rts/dist/build/win32/libHS$1.def
+ "$$(DLLTOOL)" -d rts/dist/build/win32/libHS$1.def \
+ -l rts/dist/build/win32/libHS$1.dll.a
+endef
+$(foreach lib,$(ALL_RTS_DEF_LIBNAMES),$(eval $(call make-importlib-def,$(lib))))
+
+
+# -- import libs for libffi
+rts/dist/build/win32/libHSffi.def : rts/win32/libHSffi.def
+ cat rts/win32/libHSffi.def \
+ | sed "s/@ProjectVersion@/$(ProjectVersion)/" \
+ > rts/dist/build/win32/libHSffi.def
+
+rts/dist/build/win32/libHSffi.dll.a : rts/dist/build/win32/libHSffi.def
+ "$(DLLTOOL)" -d rts/dist/build/win32/libHSffi.def \
+ -l rts/dist/build/win32/libHSffi.dll.a
+endif
+endif
+
+
#-----------------------------------------------------------------------------
# Building one way
-
define build-rts-way # args: $1 = way
# The per-way CC_OPTS
@@ -108,23 +153,19 @@ rts_$1_OBJS = $$(rts_$1_C_OBJS) $$(rts_$1_S_OBJS) $$(rts_$1_CMM_OBJS)
rts_dist_$1_CC_OPTS += -DRtsWay=$$(DQ)rts_$1$$(DQ)
-
# Making a shared library for the RTS.
-# On Windows, as the RTS and base library has recursive imports
-# we have to break the loop with a import library (libHSbase.so.a)
-# This is made from rts/win32/libHSbase.def which contains a list of
-# all the symbols in the base library used by the RTS.
ifneq "$$(findstring dyn, $1)" ""
-$$(rts_$1_LIB) : $$(rts_$1_OBJS) rts/libs.depend
+ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
+$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(ALL_RTS_DEF_LIBS) rts/libs.depend
"$$(RM)" $$(RM_OPTS) $$@
- ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
- "$$(DLLTOOL)" -d rts/win32/libHSbase.def -l rts/dist/build/win32/libHSbase.so.a
"$$(rts_dist_HC)" -shared -dynamic -dynload deploy \
- -no-auto-link-packages `cat rts/libs.depend` $$(rts_$1_OBJS) rts/dist/build/win32/libHSbase.so.a -o $$@
- else
+ -no-auto-link-packages `cat rts/libs.depend` $$(rts_$1_OBJS) $$(ALL_RTS_DEF_LIBS) -o $$@
+else
+$$(rts_$1_LIB) : $$(rts_$1_OBJS) rts/libs.depend
+ "$$(RM)" $$(RM_OPTS) $$@
"$$(rts_dist_HC)" -shared -dynamic -dynload deploy \
-no-auto-link-packages `cat rts/libs.depend` $$(rts_$1_OBJS) -o $$@
- endif
+endif
else
$$(rts_$1_LIB) : $$(rts_$1_OBJS)
"$$(RM)" $$(RM_OPTS) $$@
diff --git a/rts/win32/libHSbase.def b/rts/win32/libHSbase.def
index 5f534e0246..583eeb038e 100644
--- a/rts/win32/libHSbase.def
+++ b/rts/win32/libHSbase.def
@@ -1,33 +1,8 @@
-LIBRARY base
+LIBRARY "libHSbase-@LibVersion@-ghc@ProjectVersion@.dll"
EXPORTS
- ffi_call
- ffi_prep_cif
- ffi_call
- ffi_type_void
- ffi_type_float
- ffi_type_double
- ffi_type_sint64
- ffi_type_uint64
- ffi_type_sint32
- ffi_type_uint32
- ffi_type_sint16
- ffi_type_uint16
- ffi_type_sint8
- ffi_type_uint8
- ffi_type_pointer
-
- ghczmprim_GHCziBool_True_closure
- ghczmprim_GHCziBool_False_closure
- ghczmprim_GHCziTypes_Czh_con_info
- ghczmprim_GHCziTypes_Izh_con_info
- ghczmprim_GHCziTypes_Fzh_con_info
- ghczmprim_GHCziTypes_Dzh_con_info
- ghczmprim_GHCziTypes_Czh_static_info
- ghczmprim_GHCziTypes_Izh_static_info
-
base_GHCziInt_I8zh_con_info
base_GHCziInt_I16zh_con_info
base_GHCziInt_I32zh_con_info
diff --git a/rts/win32/libHSffi.def b/rts/win32/libHSffi.def
new file mode 100644
index 0000000000..6bb1377816
--- /dev/null
+++ b/rts/win32/libHSffi.def
@@ -0,0 +1,20 @@
+
+LIBRARY "libHSffi-ghc@ProjectVersion@.dll"
+
+EXPORTS
+
+ ffi_call
+ ffi_prep_cif
+ ffi_call
+ ffi_type_void
+ ffi_type_float
+ ffi_type_double
+ ffi_type_sint64
+ ffi_type_uint64
+ ffi_type_sint32
+ ffi_type_uint32
+ ffi_type_sint16
+ ffi_type_uint16
+ ffi_type_sint8
+ ffi_type_uint8
+ ffi_type_pointer
diff --git a/rts/win32/libHSghc-prim.def b/rts/win32/libHSghc-prim.def
new file mode 100644
index 0000000000..b1285cc9d1
--- /dev/null
+++ b/rts/win32/libHSghc-prim.def
@@ -0,0 +1,13 @@
+
+LIBRARY "libHSghc-prim-@LibVersion@-ghc@ProjectVersion@.dll"
+
+EXPORTS
+
+ ghczmprim_GHCziBool_True_closure
+ ghczmprim_GHCziBool_False_closure
+ ghczmprim_GHCziTypes_Czh_con_info
+ ghczmprim_GHCziTypes_Izh_con_info
+ ghczmprim_GHCziTypes_Fzh_con_info
+ ghczmprim_GHCziTypes_Dzh_con_info
+ ghczmprim_GHCziTypes_Czh_static_info
+ ghczmprim_GHCziTypes_Izh_static_info