1 Cabal and Cabal-syntax 3.12.0.0 changelog and release notes
5 ### Significant changes
7 - Add support for asm, cmm, and js sources in executable components [#8639](https://github.com/haskell/cabal/issues/8639) [#9061](https://github.com/haskell/cabal/pull/9061)
9 Executable components now support the inclusion of asm, cmm, and js source
10 files in a cabal file using the same syntax as is used for these sources
11 in library components, similar to how c and c++ sources are supported in
12 both types of components. This syntax was already parsed in cabal files,
13 but was silently ignored in the build step, so no changes to syntax are
16 - Add `--haddock-output-dir` flag to `cabal haddock`. [#8720](https://github.com/haskell/cabal/issues/8720) [#8788](https://github.com/haskell/cabal/pull/8788)
18 This flag gives the user full control over the directory where the documentation is placed. It allows both relative and absolute paths.
20 - Add `--semaphore` option to `./Setup build` interface [#8557](https://github.com/haskell/cabal/pull/8557)
22 When `./Setup build --semaphore <SEM>` is called, `ghc` will be called
23 with the `-jsem` option. It is the responsibility of the caller of
24 `./Setup build` to manage the semaphore according to the GHC Jobserver
27 This low level interface is intended to be called by a high-level tool
28 such as `cabal-install` which can create and manage the semaphore
31 The protocol is specified by [GHC Proposal #540](https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0540-jsem.rst).
33 - Add `--promised-dependency` flag to `./Setup configure` interface [#8726](https://github.com/haskell/cabal/pull/8726)
35 There is a new flag `--promised-dependency`to allow users to configure a
36 package *without* having previously built the dependency. Instead, we
37 promise to the configure phase that we will have built it by the time we
38 build the package. This allows us to configure all the packages we intend
39 to load into the repl without building any dependenices which we will load
40 in the same session, because the promise is satisifed due to loading the
41 package and its dependency into one multi-session which ensures the
42 dependency is built before it is needed.
44 A user of ./Setup configure specifies a promised dependency by using the
45 "--promised-dependency" flag with a normal dependency specification. For
49 '--promised-dependency=cabal-install-solver=cabal-install-solver-3.9.0.0-inplace'
52 - Add `--ignore` to `cabal check` [#8587](https://github.com/haskell/cabal/issues/8587) [#9442](https://github.com/haskell/cabal/pull/9442)
54 - `Distribution.PackageDescription.Check.Warning` now exports
55 `filterPackageChecksById`, this can be used by third-party
56 tools to filter warnings.
58 - Add support for `GHC2024` [#9736](https://github.com/haskell/cabal/issues/9736)
60 Support for the `GHC2024` language edition, introduced by GHC 9.10, has been
61 added. It can now be used in the `default-language` and `other-languages`
62 fields, and will be offered as an option by `cabal init`.
64 - Remove `initialBuildSteps` from `Distribution.Simple.Build` [#9474](https://github.com/haskell/cabal/pull/9474)
66 Calling `initialBuildSteps` to prepare source files for a package is error
67 prone, as `initialBuildSteps` only handles things like the paths module
70 To mimick `initialBuildSteps` behaviour when there is no custom Setup, you
71 can call `repl_setupHooks`.
73 If you are dealing with a custom setup, you have to invoke
74 `./Setup repl --repl-multi-file`.
76 - Cabal and Cabal-syntax 3.12 support GHC version 8.4.4 and up.
78 Support for all previous GHC versions is deprecated.
82 - `cabal init` should not suggest Cabal < 2.0 [#8680](https://github.com/haskell/cabal/issues/8680)
84 'cabal init' no longer suggests users to set cabal-version to less than
87 - Remove Distribution.Utils.TempTestDir module from Cabal library [#9453](https://github.com/haskell/cabal/issues/9453) [#9454](https://github.com/haskell/cabal/pull/9454)
89 This library was only used by internal tests, and now lives in the
90 `Cabal-tests` library which is shared across test components.
92 - PkgConfig individual calls [#9134](https://github.com/haskell/cabal/pull/9134)
94 `cabal` invokes `pkg-config` individually for each lib if querying for all
95 doesn't return the expected result.
97 - Split up `Distribution.Simple.Setup` [#8130](https://github.com/haskell/cabal/pull/8130)
99 The external interface of 'Distribution.Simple.Setup' has been kept the
100 same, but internally it has been broken up into smaller modules. This
101 improves build times in two ways:
103 1. GHC is superlinear in the size of files, meaning that splitting up a
104 large file can reduce overall compile times.
105 2. Breaking up the module allows dependent modules to refine their imports
106 to just the parts they require, allowing them to start buildling quicker
107 when GHC is run in parrallel make mode ('--ghc-options -j').
109 - Reimplementing `cabal check` [#7423](https://github.com/haskell/cabal/issues/7423) [#8427](https://github.com/haskell/cabal/pull/8427)
111 - `checkPackage` signature has been simplified,
112 you do not need to pass a specific configuration of the package, since
113 we do not flatten GenericPackageDescription any more.
114 - `checkPackageFileNames` has been removed,
115 use `checkPackageFiles` instead.
116 - `checkPackageFilesGPD` has been introduced,
117 a function similar to `checkPackageFiles` that works on
118 `GenericPackageDescription`. You do not need to use
119 `flattenPackageDescription` anymore.
121 - Installation of extra-compilation-artifacts directory [#8662](https://github.com/haskell/cabal/pull/8662)
123 GHC plugins now can store custom data in the 'extra-compilation-artifacts' directory which gets installed with the package.
125 - Add option to ./Setup repl to write repl arguments to file [#8726](https://github.com/haskell/cabal/pull/8726)
127 The `./Setup repl` command is modified to allow a user to defer starting
128 the repl and instead instruct the command to write the necessary build
129 flags to a directiory. The option is called `--repl-multi-file <DIR>`.
131 This is useful when starting multi-component sessions, as we want to query
132 Setup.hs for the arguments which are needed to build each component but
133 not for ./Setup to start the repl itself.
135 - Add Haiku as a known platform [#9006](https://github.com/haskell/cabal/pull/9006)
137 Cabal: Distribution now recognises Haiku as a valid platform, and also
138 implements Haiku's unique directory layout.
140 - Installation of .hie files [#8685](https://github.com/haskell/cabal/issues/8685) [#9019](https://github.com/haskell/cabal/pull/9019)
142 Hie files generated by GHC are now stored in the
143 `extra-compilation-artifacts` directory which gets installed with the
146 - Include the GHC "Project Unit Id" in the cabal store path [#8114](https://github.com/haskell/cabal/issues/8114) [#9326](https://github.com/haskell/cabal/pull/9326)
148 This allows the use of several **API incompatible builds of the same
149 version of GHC** without corrupting the cabal store.
151 This relies on the "Project Unit Id" which is available since GHC 9.8.1,
152 older versions of GHC do not benefit from this change.
154 - Fix the platform string for GNU/Hurd [#9434](https://github.com/haskell/cabal/pull/9434)
156 Depending whom you ask, GNU/Hurd will be labelled "gnu" or "hurd". The
157 autotools use "gnu", so ghc follows this for installed files, even if the
158 ghc source code uses OSHurd. We thus need to add the translation between
161 - Use linker capability detection to improve linker use [#9443](https://github.com/haskell/cabal/pull/9443)
163 Previously the GHC version number and platform were used as a proxy for
164 whether the linker can generate relocatable objects.
166 Now, the ability of the linker to create relocatable objects is detected.
168 - Merge globbing implementations [#5349](https://github.com/haskell/cabal/issues/5349) [#9673](https://github.com/haskell/cabal/pull/9673)
170 The common aspects of the globbing functionality between `Cabal` and
171 `cabal-install` have been factored out. The only change in the user-facing
172 API is that we now record when a glob does not match exactly, but matches
173 a directory with that same name, with the new constructor
174 `GlobMatchesDirectory` of `GlobResult`.
176 To illustrate, this change means that when `foo/dir` is a directory, the
177 glob `*/dir/` matches exactly `foo/dir` (as before), but now `*/dir`
178 produces `GlobMatchesDirectory` instead of failing. This allows callers
179 to decide whether to allow or discard such inexact matches.
181 - Document `remote-repo-cache` as implemented. [#8737](https://github.com/haskell/cabal/issues/8737) [#8738](https://github.com/haskell/cabal/pull/8738)
183 - Deduplicate LD_LIBRARY_PATH when running tests [#8728](https://github.com/haskell/cabal/pull/8728)
185 - Add support for a number of architectures:
187 - RISC-V [#9062](https://github.com/haskell/cabal/pull/9062)
188 - 64-bit LoongArch [#9215](https://github.com/haskell/cabal/pull/9215)
189 - 64-bit SPARC as a separate architecture [#9445](https://github.com/haskell/cabal/pull/9445)
191 - Don't report `index.html` file as created, if not created by Haddock [#5120](https://github.com/haskell/cabal/issues/5120) [#9332](https://github.com/haskell/cabal/pull/9332)
193 - Enable using $ORIGIN in RPATH on GNU/Hurd [#9441](https://github.com/haskell/cabal/pull/9441)
196 - Make check comply with Hackage requirements [#8897](https://github.com/haskell/cabal/pull/8897)
198 - `cabal check` will only return exitcode 1 when the package is not fit
199 for Hackage. E.g. it will not error anymore when your `synopsis:` is
200 larger than `description:`, just emit a warning.
201 - Cabal: Distribution.Client.Check now exports `isHackageDistError`, for
202 third-party tools to know if a specific error will preclude a package
203 from being uploaded to Hacakge.
205 - Add language extension `ExtendedLiterals` [#8992](https://github.com/haskell/cabal/pull/8992)
207 Adds support for the `ExtendedLiterals` language extension (GHC proposal #451)
209 - Warn about inconsistent indentation [#8975](https://github.com/haskell/cabal/pull/8975)
211 - Make Cabal warn about inconsistent indentation in .cabal files. For
212 example warn about somewhat common decreasing indentation like in
216 default-language: Haskell2010
221 The change is `readFields` function.
223 This is an effect of using `indentOfAtLeast` method/approach: any
224 indentation greater than current offset is accepted.
226 That behavior is desirable to parsing multiline field contents, but it is
227 a bit surprising for fields in sections, which we expect to be aligned.
229 Such insonsistency seems to be always a mistake, and it's easy to fix once
230 a machine points it out.
232 - Add `LexBraces` lexer warning [#8577](https://github.com/haskell/cabal/issues/8577)
234 `LexBraces` warning is issued when brace delimiting syntax is used. This
235 way, using `readFields'`, a low-lever consumer may decide whether braces
238 Looking for a brace character in the input is imprecise, as braces can
239 occur inside field content.
241 This warning is not propagated to parser warnings, so e.g.
242 `readGenericPackageDescription` doesn't warn about it. This is because all
243 parser warnings prevent uploads to Hackage, and using braces (or not) is
246 - Distinguish `powerpc64le`, by adding `PPC64LE` constructor to type `Arch` [#9534](https://github.com/haskell/cabal/issues/9534) [#9535](https://github.com/haskell/cabal/pull/9535)
248 Adds constructor `PPC64LE` to type `Arch` to distinguish architecture
249 powerpc64le from powerpc64. Existing constructor `PPC64` now exclusively
250 represents powerpc64.
252 - PkgConfig individual calls [#9134](https://github.com/haskell/cabal/pull/9134)
254 `cabal` invokes `pkg-config` individually for each lib if querying for all doesn't return the expected result
256 - Add language extension `ListTuplePuns` [#8854](https://github.com/haskell/cabal/pull/8854)
258 Adds support for the `ListTuplePuns` language extension (GHC proposal #475)
260 - Add `mkVersionIntervals` for creating a `VersionIntervals` from a list [#9034](https://github.com/haskell/cabal/pull/9034)
262 If external tools want to change the version intervals of dependencies, they
263 need to be able to create a `VersionRange` from a `[VersionInterval]` list. Adding
264 the function `mkVersionIntervals` makes this possible again.
266 - Add language extension `TypeAbstractions` [#9496](https://github.com/haskell/cabal/issues/9496) [#9502](https://github.com/haskell/cabal/pull/9502)
268 - Update SPDX License List to version `3.23 2024-02-08` [#9818](https://github.com/haskell/cabal/pull/9818)
270 - LicenseId and LicenseExceptionId now conform to SPDX License List
271 version 3.23 2024-02-08.