diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index daa8e8a5c848a9a267fdf257cae93bc38f9c0d53..38e984a7c32e7cdca333686764caec507036bc78 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -233,6 +233,17 @@ lint-release-changelogs:
   tags:
     - x86_64-linux
 
+# Verify that Hadrian builds with stack. Note that we don't actually perform a
+# build of GHC itself; we merely test that the Hadrian executable builds and
+# works (by invoking `hadrian --version`).
+stack-hadrian-build:
+  extends: .validate-linux-hadrian
+  stage: build
+  script:
+    - .gitlab/ci.sh setup
+    - .gitlab/ci.sh configure
+    - hadrian/build-stack --version
+
 validate-x86_64-linux-deb9-hadrian:
   extends: .validate-linux-hadrian
   needs: [hadrian-ghc-in-ghci]
diff --git a/hadrian/build-stack b/hadrian/build-stack
index 7a45042ebd73c1dd4d58383f8e35968379b1bce4..da069e3575381d7b802036d3a87f7a20307e9ad0 100755
--- a/hadrian/build-stack
+++ b/hadrian/build-stack
@@ -3,11 +3,13 @@
 # Make sure that the script exits if Hadrian fails to build
 set -euo pipefail
 
+STACK="${STACK:-stack}"
+
 # Make sure Hadrian is up-to-date
 cd hadrian
-stack build --no-library-profiling ${HADRIAN_NIX:+--nix}
+$STACK build --no-library-profiling ${HADRIAN_NIX:+--nix}
 
 # Run Hadrian in the top-level GHC directory
-stack exec hadrian -- \
+$STACK exec hadrian -- \
     --directory ".."  \
     "$@"
diff --git a/hadrian/build-stack.bat b/hadrian/build-stack.bat
index 09bfd9561e9d220d364e47dd6e193b72669ec05d..4ed26a703a4c13fba6899aa344329fe7649567ef 100644
--- a/hadrian/build-stack.bat
+++ b/hadrian/build-stack.bat
@@ -3,5 +3,9 @@ setlocal
 rem Change the current directory to the one containing this script
 cd %~dp0
 
+if "%STACK%"=="" (
+    set STACK=stack
+)
+
 rem Build and run Hadrian in GHC top directory forwarding additional user arguments
-stack run hadrian --cwd=.. -- %*
+%STACK% run hadrian --cwd=.. -- %*