summaryrefslogtreecommitdiff
path: root/rules/build-package-way.mk
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2013-03-10 17:57:23 +0100
committerIan Lynagh <igloo@earth.li>2013-03-11 01:23:23 +0100
commitd7da7fa11910f7a0f80d2a1e6857bcb9c200a28e (patch)
tree346f2f2c27a724582357f7f988fe43067f5a8d24 /rules/build-package-way.mk
parent86794019b2680d52d8785818f9aa443a4b4efa45 (diff)
downloadhaskell-d7da7fa11910f7a0f80d2a1e6857bcb9c200a28e.tar.gz
Fix building the GHC package DLL on Windows
We now put a handful of modules in a separate DLL. For now the list is hand-written, but we could automate it in the future.
Diffstat (limited to 'rules/build-package-way.mk')
-rw-r--r--rules/build-package-way.mk41
1 files changed, 33 insertions, 8 deletions
diff --git a/rules/build-package-way.mk b/rules/build-package-way.mk
index 4621482d82..c67e25875e 100644
--- a/rules/build-package-way.mk
+++ b/rules/build-package-way.mk
@@ -27,6 +27,16 @@ $1_$2_$3_LIB_NAME = libHS$$($1_PACKAGE)-$$($1_$2_VERSION)$$($3_libsuf)
$1_$2_$3_LIB = $1/$2/build/$$($1_$2_$3_LIB_NAME)
$$($1_PACKAGE)-$$($1_$2_VERSION)_$2_$3_LIB = $$($1_$2_$3_LIB)
+ifeq "$3" "dyn"
+ifeq "$$(HostOS_CPP)" "mingw32"
+ifneq "$$($1_$2_dll0_HS_OBJS)" ""
+$1_$2_$3_LIB0_ROOT = HS$$($1_PACKAGE)-$$($1_$2_VERSION)-0$$($3_libsuf)
+$1_$2_$3_LIB0_NAME = lib$$($1_$2_$3_LIB0_ROOT)
+$1_$2_$3_LIB0 = $1/$2/build/$$($1_$2_$3_LIB0_NAME)
+endif
+endif
+endif
+
# Note [inconsistent distdirs]
# hack: the DEPS_LIBS mechanism assumes that the distdirs for packages
# that depend on each other are the same, but that is not the case for
@@ -52,14 +62,12 @@ ifeq "$3" "dyn"
# On windows we have to supply the extra libs this one links to when building it.
ifeq "$$(HostOS_CPP)" "mingw32"
$$($1_$2_$3_LIB) : $$($1_$2_$3_ALL_OBJS) $$(ALL_RTS_LIBS) $$($1_$2_$3_DEPS_LIBS)
- $$(call cmd,$1_$2_HC) $$($1_$2_$3_ALL_HC_OPTS) $$($1_$2_$3_GHC_LD_OPTS) $$($1_$2_$3_ALL_OBJS) \
- -shared -dynamic -dynload deploy \
- $$(addprefix -l,$$($1_$2_EXTRA_LIBRARIES)) \
- -no-auto-link-packages \
- -o $$@
-# Now check that the DLL doesn't have too many symbols. See trac #5987.
- case `$$(OBJDUMP) -p $$@ | sed -n "1,/^.Ordinal\/Name Pointer/ D; p; /^$$$$/ q" | grep "\[ *0\]" | wc -l` in 1) echo DLL $$@ OK;; 0) echo No symbols in DLL $$@; exit 1;; [0-9]*) echo Too many symbols in DLL $$@; exit 1;; *) echo bad DLL $$@; exit 1;; esac
-
+ifneq "$$($1_$2_$3_LIB0)" ""
+ $$(call build-dll,$1,$2,$3,,$$($1_$2_dll0_HS_OBJS) $$($1_$2_$3_NON_HS_OBJS),$$($1_$2_$3_LIB0))
+ $$(call build-dll,$1,$2,$3,-L$1/$2/build -l$$($1_$2_$3_LIB0_ROOT),$$(filter-out $$($1_$2_dll0_HS_OBJS),$$($1_$2_$3_HS_OBJS)) $$($1_$2_$3_NON_HS_OBJS),$$@)
+else
+ $$(call build-dll,$1,$2,$3,,$$($1_$2_$3_HS_OBJS) $$($1_$2_$3_NON_HS_OBJS),$$@)
+endif
else
$$($1_$2_$3_LIB) : $$($1_$2_$3_ALL_OBJS) $$(ALL_RTS_LIBS) $$($1_$2_$3_DEPS_LIBS)
$$(call cmd,$1_$2_HC) $$($1_$2_$3_ALL_HC_OPTS) $$($1_$2_$3_GHC_LD_OPTS) $$($1_$2_$3_ALL_OBJS) \
@@ -93,6 +101,7 @@ $(call all-target,$1_$2_$3,$$($1_$2_$3_LIB))
ifneq "$4" "0"
BINDIST_HI += $$($1_$2_$3_HI)
BINDIST_LIBS += $$($1_$2_$3_LIB)
+BINDIST_LIBS += $$($1_$2_$3_LIB0)
endif
# Build the GHCi library
@@ -122,3 +131,19 @@ endif
$(call profEnd, build-package-way($1,$2,$3))
endef
+# $1 = dir
+# $2 = distdir
+# $3 = way
+# $4 = extra flags
+# $5 = object files to link
+# $6 = output filename
+define build-dll
+ $(call cmd,$1_$2_HC) $($1_$2_$3_ALL_HC_OPTS) $($1_$2_$3_GHC_LD_OPTS) $4 $5 \
+ -shared -dynamic -dynload deploy \
+ $(addprefix -l,$($1_$2_EXTRA_LIBRARIES)) \
+ -no-auto-link-packages \
+ -o $6
+# Now check that the DLL doesn't have too many symbols. See trac #5987.
+ case `$(OBJDUMP) -p $6 | sed -n "1,/^.Ordinal\/Name Pointer/ D; p; /^$$/ q" | grep "\[ *0\]" | wc -l` in 1) echo DLL $6 OK;; 0) echo No symbols in DLL $6; exit 1;; [0-9]*) echo Too many symbols in DLL $6; $(OBJDUMP) -p $6 | sed -n "1,/^.Ordinal\/Name Pointer/ D; p; /^$$/ q" | tail; exit 1;; *) echo bad DLL $6; exit 1;; esac
+endef
+