diff --git a/distrib/configure.ac.in b/distrib/configure.ac.in
index 770d8c37dfb7f6f07019f0fc24fb5d4977305afc..8004f7255c06bb76aec4d183850cf6e5b91891bc 100644
--- a/distrib/configure.ac.in
+++ b/distrib/configure.ac.in
@@ -325,6 +325,7 @@ FP_SETTINGS
 AC_CONFIG_FILES([config.mk])
 AC_CONFIG_FILES([default.host.target])
 AC_CONFIG_FILES([default.target])
+AC_CONFIG_FILES([mk/hsc2hs])
 AC_OUTPUT
 
 # We get caught by
diff --git a/hadrian/bindist/Makefile b/hadrian/bindist/Makefile
index 8e08c8fedb0989b7497aff6fbeb42880c515c287..32f9952c8ca11205610608fcd88fdf085ad194e3 100644
--- a/hadrian/bindist/Makefile
+++ b/hadrian/bindist/Makefile
@@ -237,13 +237,18 @@ install_man:
 
 export SHELL
 .PHONY: install_wrappers
-install_wrappers: install_bin_libdir
+install_wrappers: install_bin_libdir install_hsc2hs_wrapper
 	@echo "Installing wrapper scripts"
 	$(INSTALL_DIR) "$(DESTDIR)$(WrapperBinsDir)"
 	for p in `cd wrappers; $(FIND) . ! -type d`; do \
 	    mk/install_script.sh "$$p" "$(DESTDIR)/$(WrapperBinsDir)/$$p" "$(WrapperBinsDir)" "$(ActualBinsDir)" "$(ActualBinsDir)/$$p" "$(ActualLibsDir)" "$(docdir)" "$(includedir)"; \
 	done
 
+.PHONY: install_hsc2hs_wrapper
+install_hsc2hs_wrapper:
+	@echo Copying hsc2hs wrapper
+	cp mk/hsc2hs wrappers/hsc2hs-ghc-$(ProjectVersion)
+
 PKG_CONFS = $(shell find "$(DESTDIR)$(ActualLibsDir)/package.conf.d" -name '*.conf' | sed "s:   :\0xxx\0:g")
 .PHONY: update_package_db
 update_package_db: install_bin install_lib
diff --git a/hadrian/src/Rules/BinaryDist.hs b/hadrian/src/Rules/BinaryDist.hs
index 4547cde6513730b2444e3f37d1d705c8d487b6bc..16b4dac06dde0481bf5fe50b38b573a1ee42773d 100644
--- a/hadrian/src/Rules/BinaryDist.hs
+++ b/hadrian/src/Rules/BinaryDist.hs
@@ -15,8 +15,6 @@ import Target
 import Utilities
 import qualified System.Directory.Extra as IO
 import Data.Either
-import GHC.Toolchain (ccProgram, tgtCCompiler, ccLinkProgram, tgtCCompilerLink)
-import GHC.Toolchain.Program (prgFlags)
 import qualified Data.Set as Set
 import Oracles.Flavour
 
@@ -400,6 +398,7 @@ bindistInstallFiles =
     , "mk" -/- "project.mk"
     , "mk" -/- "relpath.sh"
     , "mk" -/- "system-cxx-std-lib-1.0.conf.in"
+    , "mk" -/- "hsc2hs.in"
     , "mk" -/- "install_script.sh"
     , "README", "INSTALL" ]
 
@@ -464,17 +463,8 @@ haddockWrapper = pure $ "exec \"$executablename\" -B\"$libdir\" -l\"$libdir\" ${
 commonWrapper :: Action String
 commonWrapper = pure $ "exec \"$executablename\" ${1+\"$@\"}\n"
 
--- echo 'HSC2HS_EXTRA="$(addprefix --cflag=,$(CONF_CC_OPTS_STAGE1)) $(addprefix --lflag=,$(CONF_GCC_LINKER_OPTS_STAGE1))"' >> "$(WRAPPER)"
 hsc2hsWrapper :: Action String
-hsc2hsWrapper = do
-  ccArgs <- map ("--cflag=" <>) . prgFlags . ccProgram . tgtCCompiler <$> targetStage Stage1
-  linkFlags <- map ("--lflag=" <>) . prgFlags . ccLinkProgram . tgtCCompilerLink <$> targetStage Stage1
-  wrapper <- drop 4 . lines <$> liftIO (readFile "utils/hsc2hs/hsc2hs.wrapper")
-  return $ unlines
-    ( "HSC2HS_EXTRA=\"" <> unwords (ccArgs ++ linkFlags) <> "\""
-    : "tflag=\"--template=$libdir/template-hsc.h\""
-    : "Iflag=\"-I$includedir/\""
-    : wrapper )
+hsc2hsWrapper = return "Copied from mk/hsc2hs"
 
 runGhcWrapper :: Action String
 runGhcWrapper = pure $ "exec \"$executablename\" -f \"$exedir/ghc\" ${1+\"$@\"}\n"
diff --git a/mk/hsc2hs.in b/mk/hsc2hs.in
new file mode 100644
index 0000000000000000000000000000000000000000..8e01c11f7fc8bd7c443105e9b680df3b70262e1e
--- /dev/null
+++ b/mk/hsc2hs.in
@@ -0,0 +1,41 @@
+HSC2HS_C="@SettingsCCompilerFlags@"
+
+HSC2HS_L="@SettingsCCompilerLinkFlags@"
+
+tflag="--template=$libdir/template-hsc.h"
+Iflag="-I$includedir/include/"
+
+for f in ${HSC2HS_C}; do
+  cflags="${cflags} --cflag=$f"
+done
+
+for f in ${HSC2HS_L}; do
+  lflags="${lflags} --lflag=$f"
+done
+
+HSC2HS_EXTRA="$cflags $lflags"
+
+read_response() {
+    response_file=$1
+    if [ -f "$response_file" ]; then
+        while read -r arg; do
+            case "$arg" in
+                -t*)          tflag=;;
+                --template=*) tflag=;;
+                @*)           read_response "${arg#"@"}" ;;
+                --)           break;;
+            esac
+        done < "$response_file"
+    fi
+}
+
+for arg do
+    case "$arg" in
+        -t*)          tflag=;;
+        --template=*) tflag=;;
+        @*)           read_response "${arg#"@"}" ;;
+        --)           break;;
+    esac
+done
+
+exec "$executablename" ${tflag:+"$tflag"} $HSC2HS_EXTRA ${1+"$@"} "$Iflag"