Releases: commercialhaskell/stack
Release list
rc/v4.1.0.1 (release candidate)
Release notes:
- The change in major version from 3.x to 4.1 marks the introduction of Stack's support for GHC's Backpack module system for cross-package use.
Changes since v3.11.1:
Major changes:
- Stack now supports GHC's Backpack module system for cross-package use. (Private Backpack, where signatures and implementations are in the same package, was already supported.) When a package uses
signaturesandmixinsto depend on an abstract interface provided by another package, Stack automatically creates the extra instantiation build steps that Cabal requires. This includes support for explicit renaming, multiple instantiations of the same indefinite package, transitive signature chains, sub-library signatures, and indefinite package from Hackage or snapshots. See the Backpack topic for details.
Behavior changes:
- When Stack's Nix integration is enabled and a
shell-fileis not specified, Stack setsLANG=C.UTF-8(rather thanen_US.UTF-8, which may not be available if Stack has been built from source). - With Nix integration, Stack uses
nix-instantiatebeforenix-shell, enabling Stack to catch and report when the Nix expression cannot be evaluated by Nix. Thenix-instantiate-optionsoption is added, accordingly. - Stack's
buildcommand now warns if--force-dirtyis specified but no local packages will be built.
Other enhancements:
- Add option
--query ITEM, which can be specified multiple times, to Stack'sls dependencies textcommand (the defaultls dependenciescommand), to cause Stack to filter out from the results all packages other than those queried. Like the existing--filter ITEMoption, an item is either a package name or$localsfor all project packages.
Bug fixes:
- If snapshot locations are cyclic, Stack reports an error rather than going round in circles.
v3.11.1
See https://haskellstack.org/ for installation and upgrade instructions.
Changes since v3.9.3:
Major changes:
- On 64-bit Windows, the default
msys-environmentconfiguration option is nowCLANG64, rather thanMINGW64(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 thanMINGW32(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
cacertNix package, in order to support Stack's use ofcrypton-x509-system >= 1.6.8. - Following a change to the Stackage project's server API, the default value of the
urlskey includesrecent-snapshots: https://stackage.org/api/v1/snapshots. - The
--[no-]keep-ghc-rtsflag of Stack'sconfig envcommand is now enabled by default, consistent with Stack'sexeccommand. - On Windows, in the Stack environment, the MSYS2
usr/local/bindirectory (if it exists) is now searched before the MSYS2usr/bindirectory, rather than after.
Other enhancements:
- Bump to Hpack 0.39.6.
- Experimental: Add flag
--[no-]semaphore(default: disabled) to Stack'sbuildcommand, 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'sdotandls dependenciescommands, to prune packages that cannot reach any of the specified packages in the dependency graph. - Add option
--test-suite-timeout-grace=SECONDSto Stack'sbuildcommand 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=SECONDSoption. - In YAML configuration files, the
recent-snapshotskey is introduced (under theurlskey), to specify the URL used by Stack'sls snapshots remotecommand. - In YAML configuration files (
stack.yamlandconfig.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!includeto avoid duplicating shared settings. - Stack's
config setcommand raises an error if the target configuration file excludes the key being set and includes an!includedirective. - Stack's
config set snapshotcommand now works with other snapshot values in addition to snapshot synonymns. - Add Stack's
config compiler-toolscommand to create (when applicable) the compiler tools directory for the specified compiler version (implies Stack'sconfig build-filescommand).
Bug fixes:
- Stack's
dotandls dependenciescommands 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
uploadcommand 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 setcommands will recreate theglobal-projectdirectory contents, if Stack needs to consult its project-level configuration file and there is no file. - The output of Stack's
path --bin-pathcommand is now consistent with the Stack environment in Stack'sexeccommand and includes thebindirectory 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
buildcommand 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
rc/v3.11.0.1 (release candidate)
Changes since v3.9.3:
Major changes:
- On 64-bit Windows, the default
msys-environmentconfiguration option is nowCLANG64, rather thanMINGW64(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 thanMINGW32(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 8.12.
Behavior changes:
- Stack's default Nix integration now includes the
cacertNix package, in order to support Stack's use ofcrypton-x509-system >= 1.6.8. - Following a change to the Stackage project's server API, the default value of the
urlskey includesrecent-snapshots: https://stackage.org/api/v1/snapshots. - The
--[no-]keep-ghc-rtsflag of Stack'sconfig envcommand is now enabled by default, consistent with Stack'sexeccommand. - On Windows, in the Stack environment, the MSYS2
usr/local/bindirectory (if it exists) is now searched before the MSYS2usr/bindirectory, rather than after.
Other enhancements:
- Bump to Hpack 0.39.5.
- Experimental: Add flag
--[no-]semaphore(default: disabled) to Stack'sbuildcommand, 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'sdotandls dependenciescommands, to prune packages that cannot reach any of the specified packages in the dependency graph. - Add option
--test-suite-timeout-grace=SECONDSto Stack'sbuildcommand 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=SECONDSoption. - In YAML configuration files, the
recent-snapshotskey is introduced (under theurlskey), to specify the URL used by Stack'sls snapshots remotecommand. - In YAML configuration files (
stack.yamlandconfig.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!includeto avoid duplicating shared settings. - Stack's
config setcommand raises an error if the target configuration file excludes the key being set and includes an!includedirective. - Stack's
config set snapshotcommand now works with other snapshot values in addition to snapshot synonymns. - Add Stack's
config compiler-toolscommand to create (when applicable) the compiler tools directory for the specified compiler version (implies Stack'sconfig build-filescommand).
Bug fixes:
- Stack's
dotandls dependenciescommands 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
uploadcommand 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 setcommands will recreate theglobal-projectdirectory contents, if Stack needs to consult its project-level configuration file and there is no file. - The output of Stack's
path --bin-pathcommand is now consistent with the Stack environment in Stack'sexeccommand and includes thebindirectory 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.
v3.9.3
See https://haskellstack.org/ for installation and upgrade instructions.
Release notes:
- This release fixes a potential bug for users of Stack's Docker integration.
Changes since v3.9.1:
Other enhancements:
- The
resolversynonym forsnapshot, informally deprecated from Stack 3.1.1, is formally deprecated in online and in-app documentation.
Bug fixes:
- Stack's Docker integration supports Docker client versions 29.0.0 and greater.
Thanks to all our contributors for this release:
- Jens Petersen
- Mike Pilgrem
- Olivier Benz
v3.9.1
See https://haskellstack.org/ for installation and upgrade instructions.
Changes since v3.7.1:
Behavior changes:
- Where applicable and Stack supports the GHC version, only the wired-in packages of the actual version of GHC used are treated as wired-in packages.
- Stack now recognises
ghc-internalas a GHC wired-in package. - The configuration option
package-indexhas a new default value: thekeyidskey lists the keys of the Hackage root key holders applicable from 2025-07-24. - Stack's
dotcommand now treats--depththe same way as thels dependenciescommand, so that the nodes ofstack dot --external --depth 0are the same as the packages listed bystack ls dependencies --depth 0. - When building GHC from source, on Windows, the default Hadrian build target is
reloc-binary-distand the default path to the GHC built by Hadrian is_build/reloc-bindist. - Stack's
haddockcommand no longer requires a package to have a main library that exposes modules. - On Windows, the path segment platform\hash\ghc version, under
.stack-work\installand.stack-work\hoogle, is hashed only once, rather than twice.
Other enhancements:
- Bump to Hpack 0.39.1.
- Consider GHC 9.14 to be a tested compiler and remove warnings.
- Consider Cabal 3.16 to be a tested library and remove warnings.
- From GHC 9.12.1,
baseis not a GHC wired-in package. In configuration files, thenotify-if-base-not-bootkey is introduced, to allow the exisitng notification to be muted if unwanted when using such GHC versions. - Add flag
--[no-]omit-this(default: disabled) to Stack'scleancommand to omit directories currently in use from cleaning (when--fullis not specified). - Add option
-was synonym for--stack-yaml. stack newnow allowscodeberg:as a service for template downloads- In YAML configuration files, the
compiler-targetandcompiler-bindist-pathkeys are introduced to allow, when building GHC from source, the Hadrian build target and Hadrian path to the built GHC to be specified.
Bug fixes:
--PROG-option=<argument>passes--PROG-option=<argument>(and not--PROG-option="<argument>") to Cabal (the library).- The message S-7151 now presents as an error, with advice, and not as a bug.
- Stack's
dotcommand now uses a box to identify all GHC wired-in packages, not just those with no dependencies (being onlyrts). - Stack's
dotcommand now gives all nodes with no dependencies in the graph the maximum rank, not just those nodes with no relevant dependencies at all (being onlyrts, when--externalis specified). - Improved error messages for S-4634 and S-8215.
- Improved in-app help for the
--hpack-forceflag.
Thanks to all our contributors for this release:
- Alexey Kotlyarov
- Dino Morelli
- Jens Petersen
- Lauren Yim
- Mike Pilgrem
- Olivier Benz
- Simon Hengel
- Wolfram Kahl
rc/v3.9.0.1 (release candidate)
Changes since v3.7.1:
Behavior changes:
- Where applicable and Stack supports the GHC version, only the wired-in packages of the actual version of GHC used are treated as wired-in packages.
- Stack now recognises
ghc-internalas a GHC wired-in package. - The configuration option
package-indexhas a new default value: thekeyidskey lists the keys of the Hackage root key holders applicable from 2025-07-24. - Stack's
dotcommand now treats--depththe same way as thels dependenciescommand, so that the nodes ofstack dot --external --depth 0are the same as the packages listed bystack ls dependencies --depth 0. - When building GHC from source, on Windows, the default Hadrian build target is
reloc-binary-distand the default path to the GHC built by Hadrian is_build/reloc-bindist. - Stack's
haddockcommand no longer requires a package to have a main library that exposes modules.
Other enhancements:
- Bump to Hpack 0.38.2.
- Consider GHC 9.14 to be a tested compiler and remove warnings.
- Consider Cabal 3.16 to be a tested library and remove warnings.
- From GHC 9.12.1,
baseis not a GHC wired-in package. In configuration files, thenotify-if-base-not-bootkey is introduced, to allow the exisitng notification to be muted if unwanted when using such GHC versions. - Add flag
--[no-]omit-this(default: disabled) to Stack'scleancommand to omit directories currently in use from cleaning (when--fullis not specified). - Add option
-was synonym for--stack-yaml. stack newnow allowscodeberg:as a service for template downloads.- In YAML configuration files, the
compiler-targetandcompiler-bindist-pathkeys are introduced to allow, when building GHC from source, the Hadrian build target and Hadrian path to the built GHC to be specified.
Bug fixes:
--PROG-option=<argument>passes--PROG-option=<argument>(and not--PROG-option="<argument>") to Cabal (the library).- The message S-7151 now presents as an error, with advice, and not as a bug.
- Stack's
dotcommand now uses a box to identify all GHC wired-in packages, not just those with no dependencies (being onlyrts). - Stack's
dotcommand now gives all nodes with no dependencies in the graph the maximum rank, not just those nodes with no relevant dependencies at all (being onlyrts, when--externalis specified). - Improved error messages for S-4634 and S-8215.
- Improved in-app help for the
--hpack-forceflag.
v3.7.1
See https://haskellstack.org/ for installation and upgrade instructions.
Changes since v3.5.1:
Other enhancements:
- Bump to Hpack 0.38.1.
- The
--extra-depoption of Stack'sscriptcommand now accepts a YAML value specifying any immutable extra-dep. Previously only an extra-dep in the package index that could be specified by a YAML string (for example,acme-missiles-0.3@rev:0) was accepted.
Bug fixes:
stack script --package <pkg-name>now uses GHC's-package-idoption to expose the installed package, rather than GHC's-packageoption. For packages with public sub-libraries,-package <pkg>can expose an installed package other than one listed byghc-pkg list <pkg>.- Work around
ghc-pkgbug where, on Windows only, it cannot register a package into a package database that is also listed in theGHC_PACKAGE_PATHenvironment variable. In previous versions of Stack, this affectedstack scriptwhen copying a pre-compiled package from another package database. - On Windows, when decompressing, and extracting, tools from archive files, Stack uses the system temporary directory, rather than the root of the destination drive, if the former is on the destination drive.
Thanks to all our contributors for this release:
- Max Ulidtko
- Mike Pilgrem
- Olivier Benz
- Simon Hengel
rc/v3.7.0.1 (release candidate)
Changes since v3.5.1:
Other enhancements:
- Bump to Hpack 0.38.1.
- The
--extra-depoption of Stack'sscriptcommand now accepts a YAML value specifying any immutable extra-dep. Previously only an extra-dep in the package index that could be specified by a YAML string (for example,acme-missiles-0.3@rev:0) was accepted.
Bug fixes:
stack script --package <pkg-name>now uses GHC's-package-idoption to expose the installed package, rather than GHC's-packageoption. For packages with public sub-libraries,-package <pkg>can expose an installed package other than one listed byghc-pkg list <pkg>.- Work around
ghc-pkgbug where, on Windows only, it cannot register a package into a package database that is also listed in theGHC_PACKAGE_PATHenvironment variable. In previous versions of Stack, this affectedstack scriptwhen copying a pre-compiled package from another package database. - On Windows, when decompressing, and extracting tools, from archive files, Stack uses the system temporary directory, rather than the root of the destination drive, if the former is on the destination drive.
v3.5.1
See https://haskellstack.org/ for installation and upgrade instructions.
Changes since v3.3.1:
Behavior changes:
- Stack will also warn (message S-8432) if there is any non-ISO/IEC 8859-1 (Latin-1) character in Stack's 'programs' path, as
hsc2hsdoes not work if there is such a character in the path to its default templatetemplate-hsc.h. - Stack customizes setup using
Cabal, so if asetup-dependsfield does not mention it as a dependency, Stack warns and adds the GHC boot package as a dependency. Previously, Stack would not do so but only warn that build errors were likely.
Other enhancements:
- Bump to Hpack 0.38.0.
- In YAML configuration files, the
install-msyskey is introduced, to enable or disable the download and installation of Stack-supplied MSYS2 when necessary (subject toskip-msys: false). The default is the same as theinstall-ghcsetting (including if that is set at the command line). Consequently, the default behaviour of Stack is unaffected. - Add the
stack config set install-msyscommand to configure theinstall-msysoption in YAML configuration files. - Option
allow-newer-depsis no longer classified as experimental in documentation. stack sdistandstack uploadreport the version of Cabal (the library) being used to check packages.- Add the
stack config build-filescommand to generate (when applicable) a Cabal file from a package description in the Hpack format and/or a lock file for Stack's project-level configuration, without taking any other build steps.
Thanks to all our contributors for this release:
- Mike Pilgrem
- Olivier Benz
rc/v3.5.0.1 (release candidate)
Changes since v3.3.1:
Behavior changes:
- Stack will also warn (message S-8432) if there is any non-ISO/IEC 8859-1 (Latin-1) character in Stack's 'programs' path, as
hsc2hsdoes not work if there is such a character in the path to its default templatetemplate-hsc.h. - Stack customizes setup using
Cabal, so if asetup-dependsfield does not mention it as a dependency, Stack warns and adds the GHC boot package as a dependency. Previously, Stack would not do so but only warn that build errors were likely.
Other enhancements:
- Bump to Hpack 0.38.0.
- In YAML configuration files, the
install-msyskey is introduced, to enable or disable the download and installation of Stack-supplied MSYS2 when necessary (subject toskip-msys: false). The default is the same as theinstall-ghcsetting (including if that is set at the command line). Consequently, the default behaviour of Stack is unaffected. - Add the
stack config set install-msyscommand to configure theinstall-msysoption in YAML configuration files. - Option
allow-newer-depsis no longer classified as experimental in documentation. stack sdistandstack uploadreport the version of Cabal (the library) being used to check packages.