# \[ANN\] Stack 3.11.1

**URL:** https://discourse.haskell.org/t/ann-stack-3-11-1/14272
**Category:** Announcements
**Created:** [June 13, 2026, 7:50pm UTC](https://discourse.haskell.org/t/ann-stack-3-11-1/14272 "2026-06-13T19:50:23Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![mpilgrem](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/mpilgrem/32/2529_2.png) [@mpilgrem](https://discourse.haskell.org/u/mpilgrem)
#### Post date: [June 13, 2026, 7:50pm UTC](https://discourse.haskell.org/t/ann-stack-3-11-1/14272/1 "2026-06-13T19:50:23Z")

</div>

![](https://raw.githubusercontent.com/commercialhaskell/stack/refs/heads/master/doc/img/stack-favicon.svg)

See [https://haskellstack.org/](https://haskellstack.org/) for installation and upgrade instructions.

**Changes since v3.9.3:**

Major changes:

- On 64-bit Windows, the default `msys-environment` configuration option is now `CLANG64`, rather than `MINGW64` (which remains an option). The MSYS2 project deprecated the latter environment on 15 March 2026. The GHC project has used the former toolchain from GHC 9.4.1. No default is provided for 32-bit Windows, rather than `MINGW32` (which remains an option). The MSYS2 project ceased to actively support it on 17 May 2020. 32-bit Windows is not supported by the GHC project from GHC 9.0.1.

Behavior changes:

- Stack’s default Nix integration now includes the `cacert` Nix package, in order to support Stack’s use of `crypton-x509-system >= 1.6.8`.
- Following a change to the Stackage project’s server API, the default value of the `urls` key includes `recent-snapshots: https://stackage.org/api/v1/snapshots`.
- The `--[no-]keep-ghc-rts` flag of Stack’s `config env` command is now enabled by default, consistent with Stack’s `exec` command.
- On Windows, in the Stack environment, the MSYS2 `usr/local/bin` directory (if it exists) is now searched before the MSYS2 `usr/bin` directory, rather than after.

Other enhancements:

- Bump to Hpack 0.39.6.
- Experimental: Add flag `--[no-]semaphore` (default: disabled) to Stack’s `build` command, to allow GHC to use a system semaphore to perform compilation in parallel when possible. Supported, by default, by GHC 9.10.1 or later. The option is considered experiemental because, on Linux only, musl and non-musl semaphores are incompatible.
- Add option `--reach <packages>` to Stack’s `dot` and `ls dependencies` commands, to prune packages that cannot reach any of the specified packages in the dependency graph.
- Add option `--test-suite-timeout-grace=SECONDS` to Stack’s `build` command to request termination of a timed-out test suite process and, after the specified grace period, force termination. Used together with the existing `--test-suite-timeout=SECONDS` option.
- In YAML configuration files, the `recent-snapshots` key is introduced (under the `urls` key), to specify the URL used by Stack’s `ls snapshots remote` command.
- In YAML configuration files (`stack.yaml` and `config.yaml`), an `!include <file path>` directive is now supported. This allows common configuration to be shared across multiple files. For example, a project that maintains multiple project-level configuration files for testing against different snapshots can use `!include` to avoid duplicating shared settings.
- Stack’s `config set` command raises an error if the target configuration file excludes the key being set and includes an `!include` directive.
- Stack’s `config set snapshot` command now works with other snapshot values in addition to snapshot synonymns.
- Add Stack’s `config compiler-tools` command to create (when applicable) the compiler tools directory for the specified compiler version (implies Stack’s `config build-files` command).

Bug fixes:

- Stack’s `dot` and `ls dependencies` commands no longer prune a package with dependencies only because all its direct dependencies are to be pruned.
- After March 2026, Hackage requires Stack’s user agent to be set when applying digest authentication to a request. Stack’s `upload` command now does that, re-establishing authentication by Hackage username and password.
- Stack 3.9.3 and earlier fail to construct a build plan if project package A depends on project package B and package B’s executables (only) depend on package A and the name of A is before that of B, alphabetically. That bug is fixed.
- Stack’s `config set` commands will recreate the `global-project` directory contents, if Stack needs to consult its project-level configuration file and there is no file.
- The output of Stack’s `path --bin-path` command is now consistent with the Stack environment in Stack’s `exec` command and includes the `bin` directory of Stack’s local install root directory.
- Stack now builds packages that depend directly on packages with the same name as a sublibrary or foreign library of the package.
- On Windows, Stack’s `build` command now accepts a build directory that is a long path.

**Thanks to all our contributors for this release:**

- Bryan Richter
- Ching Pei Yang
- Dan Burton
- David Vollbracht
- Mike Pilgrem
- Olivier Benz

---

<div class="post-metadata">

### Author: ![benz0li](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/benz0li/32/3654_2.png) [@benz0li](https://discourse.haskell.org/u/benz0li)
#### Post date: [June 15, 2026, 3:24am UTC](https://discourse.haskell.org/t/ann-stack-3-11-1/14272/2 "2026-06-15T03:24:24Z")

</div>

_Unofficial_ Linux/RISC-V (64-bit, `linux/riscv64` ) release assets are available at [v3.11.1 · Commercial Haskell / stack · GitLab](https://gitlab.b-data.ch/commercialhaskell/stack/-/releases/v3.11.1).

* * *

Due to ongoing DDoS attacks, access to b-data’s IT infrastructure has been blocked for all Chinese servers.

ℹ For any requests to unblock individual Chinese IPs or CIDR blocks, please contact [olivier.benz@b-data.ch](mailto:olivier.benz@b-data.ch).

---

<div class="post-metadata">

### Author: ![benz0li](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/benz0li/32/3654_2.png) [@benz0li](https://discourse.haskell.org/u/benz0li)
#### Post date: [June 18, 2026, 7:27pm UTC](https://discourse.haskell.org/t/ann-stack-3-11-1/14272/3 "2026-06-18T19:27:28Z")

</div>

The _[GHC musl](https://github.com/benz0li/ghc-musl)_ docker manifests (`linux/amd64`, `linux/arm64/v8`) for GHC versions 9.14.1, 9.12.4, 9.10.3, 9.8.4 and 9.6.7 now include Stack version 3.11.1. Available from

[Quay](https://quay.io/repository/benz0li/ghc-musl):

- `quay.io/benz0li/ghc-musl:9.14.1`
- `quay.io/benz0li/ghc-musl:9.14.1-int-native`
- `quay.io/benz0li/ghc-musl:9.12.4`
- `quay.io/benz0li/ghc-musl:9.12.4-int-native`
- `quay.io/benz0li/ghc-musl:9.10.3`
- `quay.io/benz0li/ghc-musl:9.10.3-int-native`
- `quay.io/benz0li/ghc-musl:9.8.4`
- `quay.io/benz0li/ghc-musl:9.8.4-int-native`
- `quay.io/benz0li/ghc-musl:9.6.7`
- `quay.io/benz0li/ghc-musl:9.6.7-int-native`

[Docker Hub](https://hub.docker.com/r/benz0li/ghc-musl):

- `docker.io/benz0li/ghc-musl:9.14.1`
- `docker.io/benz0li/ghc-musl:9.14.1-int-native`
- `docker.io/benz0li/ghc-musl:9.12.4`
- `docker.io/benz0li/ghc-musl:9.12.4-int-native`
- `docker.io/benz0li/ghc-musl:9.10.3`
- `docker.io/benz0li/ghc-musl:9.10.3-int-native`
- `docker.io/benz0li/ghc-musl:9.8.4`
- `docker.io/benz0li/ghc-musl:9.8.4-int-native`
- `docker.io/benz0li/ghc-musl:9.6.7`
- `docker.io/benz0li/ghc-musl:9.6.7-int-native`

The manifests for GHC versions 9.14.1, 9.12.4 and 9.10.3 also include an image for `linux/riscv64`.

ℹ Please be aware that these are _unofficial_ and _untested_ binary distributions of GHC on Alpine Linux.

---

<div class="post-metadata">

### Author: ![janus](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/janus/32/1060_2.png) [@janus](https://discourse.haskell.org/u/janus)
#### Post date: [June 19, 2026, 3:58pm UTC](https://discourse.haskell.org/t/ann-stack-3-11-1/14272/4 "2026-06-19T15:58:46Z")

</div>

I want to make sure I am using [the v2 semaphore protocol](http://well-typed.com/blog/2026/06/haskell-ecosystem-report-march-may-2026/#semaphores-and--jsem) with GHC 10.0 when it is released. I see that [Stack uses the semaphore-compat library](https://github.com/commercialhaskell/stack/pull/6851/changes#diff-e0ee4e21f8811c1171864cc68ea4005347b1b0ca70626026f251bf4111c2aa6e).

I would like to ensure that I am using the v2 library exclusively.

How can I determine which versions of libraries (like e.g. semaphore-compat) my stack build has been linked against?

---

<div class="post-metadata">

### Author: ![mpilgrem](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/mpilgrem/32/2529_2.png) [@mpilgrem](https://discourse.haskell.org/u/mpilgrem)
#### Post date: [June 20, 2026, 5:05pm UTC](https://discourse.haskell.org/t/ann-stack-3-11-1/14272/5 "2026-06-20T17:05:16Z")

</div>

The ‘official’ build of Stack 3.11.1 is built against GHC 9.10.3 and the GHC boot package is `semaphore-compat-1.0.0`.

The changes to Stack’s code in respect of Semaphore are principally at:

- [Add --semaphore by horriblename · Pull Request #6851 · commercialhaskell/stack · GitHub](https://github.com/commercialhaskell/stack/pull/6851)

More generally, `stack --version` (in an ‘official’ build) will output a Git commit hash and that can be used to identify the contents of `stack.yaml` at that point in the commit history (that being the file that specifies the GHC version and the set of package versions).
