summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver/utils/dynwrapper.c8
-rw-r--r--rules/build-prog.mk17
2 files changed, 22 insertions, 3 deletions
diff --git a/driver/utils/dynwrapper.c b/driver/utils/dynwrapper.c
index eead8bd0a0..a84b5aef03 100644
--- a/driver/utils/dynwrapper.c
+++ b/driver/utils/dynwrapper.c
@@ -4,6 +4,7 @@ Need to concatenate this file with something that defines:
LPTSTR path_dirs[];
LPTSTR progDll;
LPTSTR rtsDll;
+int rtsOpts;
*/
#include <stdarg.h>
@@ -161,7 +162,7 @@ int main(int argc, char *argv[]) {
LPTSTR oldPath;
StgClosure *main_p;
- RtsConfig *rts_config_p;
+ RtsConfig rts_config;
hs_main_t hs_main_p;
// MSDN says: An environment variable has a maximum size limit of
@@ -189,9 +190,10 @@ int main(int argc, char *argv[]) {
hRtsDll = GetNonNullModuleHandle(rtsDll);
hs_main_p = GetNonNullProcAddress(hRtsDll, "hs_main");
- rts_config_p = GetNonNullProcAddress(hRtsDll, "defaultRtsConfig");
main_p = GetNonNullProcAddress(hProgDll, "ZCMain_main_closure");
+ rts_config.rts_opts_enabled = rtsOpts;
+ rts_config.rts_opts = NULL;
- return hs_main_p(argc, argv, main_p, *rts_config_p);
+ return hs_main_p(argc, argv, main_p, rts_config);
}
diff --git a/rules/build-prog.mk b/rules/build-prog.mk
index 9d1e5890be..d362d4299f 100644
--- a/rules/build-prog.mk
+++ b/rules/build-prog.mk
@@ -213,15 +213,32 @@ endif
ifeq "$$($1_$2_PROG_NEEDS_C_WRAPPER)" "YES"
+$1_$2_RTS_OPTS_FLAG = $$(lastword $$(filter -rtsopts -rtsopts=all -rtsopts=some -rtsopts=none -no-rtsopts,$$($1_$2_$$($1_$2_PROGRAM_WAY)_ALL_HC_OPTS)))
+ifeq "$$($1_$2_RTS_OPTS_FLAG)" "-rtsopts"
+$1_$2_RTS_OPTS = RtsOptsAll
+else ifeq "$$($1_$2_RTS_OPTS_FLAG)" "-rtsopts=all"
+$1_$2_RTS_OPTS = RtsOptsAll
+else ifeq "$$($1_$2_RTS_OPTS_FLAG)" "-rtsopts=some"
+$1_$2_RTS_OPTS = RtsOptsSafeOnly
+else ifeq "$$($1_$2_RTS_OPTS_FLAG)" "-rtsopts=none"
+$1_$2_RTS_OPTS = RtsOptsNone
+else ifeq "$$($1_$2_RTS_OPTS_FLAG)" "-no-rtsopts"
+$1_$2_RTS_OPTS = RtsOptsNone
+else
+$1_$2_RTS_OPTS = RtsOptsSafeOnly
+endif
+
$1/$2/build/tmp/$$($1_$2_PROG)-inplace-wrapper.c: driver/utils/dynwrapper.c | $$$$(dir $$$$@)/.
$$(call removeFiles,$$@)
echo '#include <Windows.h>' >> $$@
+ echo '#include "Rts.h"' >> $$@
echo 'LPTSTR path_dirs[] = {' >> $$@
$$(foreach d,$$($1_$2_DEP_LIB_REL_DIRS),$$(call make-command,echo ' TEXT("$$d")$$(comma)' >> $$@))
echo ' TEXT("$1/$2/build/tmp/"),' >> $$@
echo ' NULL};' >> $$@
echo 'LPTSTR progDll = TEXT("../../$1/$2/build/tmp/$$($1_$2_PROG).dll");' >> $$@
echo 'LPTSTR rtsDll = TEXT("$$($$(WINDOWS_DYN_PROG_RTS))");' >> $$@
+ echo 'int rtsOpts = $$($1_$2_RTS_OPTS);' >> $$@
cat driver/utils/dynwrapper.c >> $$@
$1/$2/build/tmp/$$($1_$2_PROG) : $1/$2/build/tmp/$$($1_$2_PROG)-inplace-wrapper.c $1/$2/build/tmp/$$($1_$2_PROG).dll | $$$$(dir $$$$@)/.