diff options
author | Ian Lynagh <igloo@earth.li> | 2013-03-10 17:57:23 +0100 |
---|---|---|
committer | Ian Lynagh <igloo@earth.li> | 2013-03-11 01:23:23 +0100 |
commit | d7da7fa11910f7a0f80d2a1e6857bcb9c200a28e (patch) | |
tree | 346f2f2c27a724582357f7f988fe43067f5a8d24 /rules | |
parent | 86794019b2680d52d8785818f9aa443a4b4efa45 (diff) | |
download | haskell-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')
-rw-r--r-- | rules/build-package-way.mk | 41 |
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 + |