summaryrefslogtreecommitdiff
path: root/rules
diff options
context:
space:
mode:
authorIan Lynagh <ian@well-typed.com>2013-03-12 18:19:22 +0000
committerIan Lynagh <ian@well-typed.com>2013-03-12 18:19:22 +0000
commit9f8ee071d99e0782e3e0ac484c50e29b93119769 (patch)
treea12d7dc67c9325d9ddc85443388d78b4d5958032 /rules
parent8a50206c51a534bc00a7a008c08b6adb3f76aa76 (diff)
parentd7da7fa11910f7a0f80d2a1e6857bcb9c200a28e (diff)
downloadhaskell-9f8ee071d99e0782e3e0ac484c50e29b93119769.tar.gz
Merge branch 'master' of win:c:/ghc/git/cygwin/.
Diffstat (limited to 'rules')
-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
+