summaryrefslogtreecommitdiff
path: root/rules
diff options
context:
space:
mode:
authorTamar Christina <tamar@zhox.com>2017-08-29 23:09:09 +0100
committerTamar Christina <tamar@zhox.com>2017-08-29 23:09:09 +0100
commit5f6a82040694f7c8c2b394c1b418c0167b963e0b (patch)
treec176440e824dd48e2ee54814272642ce453f664f /rules
parent3c6b2fc3b5ca11a5410405664e4640767ef941dd (diff)
downloadhaskell-5f6a82040694f7c8c2b394c1b418c0167b963e0b.tar.gz
Add gen-dll as replacement for dll-split
Summary: This tool can be used to generate dll's for any list of object files given to it. It will then repartition them automatically to fit within a dll and generates as many dll's as needed to do this. Cyclic dependencies between these generated dlls are handle automatically so there is no need to tell it how to partition. It is also a lot more general than `dll-split` as it is able to split any package not just `libGHC`. It also uses a trick using GNU style import libraries to hide the splitting from the rest of the pipeline. Which means come linking time you don't need to know which dll contains what symbol or how many split dlls were created. The import libraries are by default created with libtool. However since libtool is BFD based it is very slow. So if present and detected by configure the `genlib` tool from the msys2 project is used. This makes a difference of about ~45 minutes when compiling. To install `genlib` run `pacman -Sy mingw-w64-$(uname -m)-tools-git`. More detailed explaination of the process can be found here https://ghc.haskell.org/trac/ghc/wiki/WindowsDynamicLinking Test Plan: ./validate Reviewers: austin, hvr, bgamari, erikd, simonmar Reviewed By: bgamari Subscribers: snowleopard, rwbarton, thomie, erikd, #ghc_windows_task_force GHC Trac Issues: #5987 Differential Revision: https://phabricator.haskell.org/D3883
Diffstat (limited to 'rules')
-rw-r--r--rules/build-package-way.mk31
1 files changed, 17 insertions, 14 deletions
diff --git a/rules/build-package-way.mk b/rules/build-package-way.mk
index 73fc684257..9c101c4a9d 100644
--- a/rules/build-package-way.mk
+++ b/rules/build-package-way.mk
@@ -134,20 +134,23 @@ endif # "$3" "v"
$(call profEnd, build-package-way($1,$2,$3))
endef # build-package-way
-# $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.
- SYMBOLS=`$(OBJDUMP) -p $6 | sed -n "1,/^.Ordinal\/Name Pointer/ D; p; /^$$/ q" | tail -n +2 | wc -l`; echo "Number of symbols in $6: $$SYMBOLS"
- 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
+# Call out to the shell script to decide how to build the util dll.
+# 1 = dir
+# 2 = distdir
+# 3 = way
+# 4 = extra flags
+# 5 = extra libraries to link
+# 6 = object files to link
+# 7 = output filename
+# 8 = link command
+# 9 = create delay load import lib
+# 10 = SxS Name
+# 11 = SxS Version
+$(gen-dll_INPLACE) link "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$(call cmd,$1_$2_HC) $(subst -no-hs-main,,$($1_$2_$3_ALL_HC_OPTS) $($1_$2_$3_GHC_LD_OPTS)) \
+ -shared -dynamic -dynload deploy \
+ $(addprefix -l,$($1_$2_EXTRA_LIBRARIES)) \
+ -no-auto-link-packages" "$8" \
+ "$9" "${10}"
endef