3.12 changelogs updated (#9908)
[cabal.git] / release-notes / WIP-cabal-install-3.12.x.0.md
blobb3fb01900a402f769b3c81b6216b60faacad35eb
1 ☞ N.B.: this is a WIP release-note file for 3.12.x.0 cabal-install.
3 cabal-install and cabal-install-solver 3.12.1.0 changelog and release notes
4 ---
6 - Add --project-dir flag [#7695](https://github.com/haskell/cabal/issues/7695) [#7940](https://github.com/haskell/cabal/issues/7940) [#8454](https://github.com/haskell/cabal/pull/8454)
8     - Added --project-dir flag for specifying the project's root directory
9     - Deprecated using --project-file with an absolute filepath without also using --project-dir
11 - Remove useles "Log" log level [#9151](https://github.com/haskell/cabal/issues/9151) [#9346](https://github.com/haskell/cabal/pull/9346)
13     - Remove "Log" as a log level in favour of "Info".
14     - Remove "Show" in Severity and replace by "displaySeverity" function
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 - Support per-component builds when coverage is enabled [#4798](https://github.com/haskell/cabal/issues/4798) [#5213](https://github.com/haskell/cabal/issues/5213) [#6397](https://github.com/haskell/cabal/issues/6397) [#6440](https://github.com/haskell/cabal/issues/6440) [#9464](https://github.com/haskell/cabal/pull/9464)
22     Cabal now supports per-component builds when coverage is enabled.This enables
23     coverage for packages with internal libraries (#6440), and enables coverage for
24     packages that use backpack (#6397), even though we do not get coverage for
25     instantiations of an indefinite module (it is not clear what it means for HPC
26     to support backpack, regardless of Cabal).
28     To achieve this, hpc information (`.mix` files) from a library is now written
29     into the package database of a library under `extraCompilationArtifacts`.
31     Cabal configure (via the Setup interface) now accepts --coverage-for=<unit-id>,
32     a flag which specifies which libraries should be included in the coverage
33     report for some testsuite.
35 - Redesign 'cabal path' command to account for projects [#9673](https://github.com/haskell/cabal/pull/9673)
37   Previously, `cabal path` was only able to query from the global configuration file, e.g., `~/.cabal/config` or the XDG equivalent.
38   We take the foundations and enhance `cabal path` to take project configuration, such as `cabal.project`, into account.
40   Additionally, we add support for multiple output formats, such as key-value pairs and json.
42   The key-value pair output prints a line for each queried key and its respective value:
44       key1: value2
45       key2: value2
47   If only a single key is queried, we print only the value, for example:
49       value1
51   The json output format is versioned by the cabal-install version, which is part of the json object.
52   Thus, all result objects contain at least the key "cabal-install-version".
54   We expand the `cabal path` to also produce information of the compiler that is going to be used in a `cabal build` or `cabal repl` invocation.
55   To do that, we re-configure the compiler program, and outputs the location, version and compiler flavour.
56   This is helpful for downstream tools, such as HLS, to figure out the GHC version required to compile a project with, without dependency solving.
58 ### Other changes
60 - Script cache dir is the base16 hash of the canonical path of the script. [#9459](https://github.com/haskell/cabal/pull/9459)
62     Script cache dir is the base16 hash of the canonical path of the script.
64 - Die if package list is missing [#8944](https://github.com/haskell/cabal/pull/8944)
66     If a package list is missing, `cabal` will now die and suggest the user to run
67     `cabal update` instead of continuing into not being able to find packages coming
68     from the remote package server.
70 - Reject index-state younger than cached index file [#8944](https://github.com/haskell/cabal/pull/8944)
72     Requesting to use an index-state younger than the cached version will now fail,
73     telling the user to use an index-state older or equal to the cached file, or to
74     run `cabal update`.
76     The warning for a non-existing index-state has been also demoted to appear only
77     on verbose logging.
79 - Warn early that overwrite policy is needed [#5993](https://github.com/haskell/cabal/issues/5993) [#9268](https://github.com/haskell/cabal/pull/9268)
81     Waiting for a long build and then seeing the install fail because a flag was
82     missing is frustrating.With this change we skip the wait and warn early,
83     before the build, that an overwrite policy flag would be needed for the
84     install to succeed.
86 - Add support for authentication tokens for uploading to Hackage [#6738](https://github.com/haskell/cabal/issues/6738) [#9058](https://github.com/haskell/cabal/pull/9058)
88     A new flag `--token` (`-t`) has been created. Token authentication takes 
89     precedence over username and password meaning that, if a token is set, 
90     the username and password flags are ignored.
92 - Make --(test-)show-details=direct the default [#8942](https://github.com/haskell/cabal/pull/8942)
94     This option leaves it up to the testing framework to decide what and how to print out,
95     potentially leading to a prettier output. For example, most of the testing frameworks
96     use colors, which wouldn't be seen with any other option.
98     This comes with a tradeoff, though: Cabal will not create a log file with this option.
99     If you prefer a log file, consider setting `--test-show-details=streaming` (or something
100     else) manually.
102 - Make sure Haskell files in explicit source directories take precedence over autogenerated Haskell files [#8689](https://github.com/haskell/cabal/issues/8689) [#8690](https://github.com/haskell/cabal/pull/8690)
104     - Changed order or directories in GHC invocation so that source
105     directories explicitly specified in cabal file will be considered
106     before Cabal’s internal build directory.
108 - Also render short options with arguments [#8785](https://github.com/haskell/cabal/issues/8785) [#9043](https://github.com/haskell/cabal/pull/9043)
110     Show how arguments are used with both short and long forms of options:
112     ```diff
113     <-v, --verbose[=n]Control verbosity (n is 0--3, default
114     >-v[n], --verbose[=n] Control verbosity (n is 0--3, default
115     <-w, --with-compiler=PATH give the path to a particular compiler
116     >-w PATH or -wPATH, --with-compiler=PATH
117     ```
119 - config file: allow more flags in the init section [#8835](https://github.com/haskell/cabal/issues/8835) [#8839](https://github.com/haskell/cabal/pull/8839)
121     The init section of config file now allows the following fields:
123 - Fix handling of ETag header for remote packages [#9113](https://github.com/haskell/cabal/issues/9113) [#9116](https://github.com/haskell/cabal/pull/9116)
125     Remote packages will now be cached regardless of the capitalization of the
126     "ETag" header. Previously remote packages would not be cached if the header
127     name did not match exactly. Now they will be cached even if the header's
128     capitalization is different.
130 - Clarify the semantics of the -package-db flag [#9678](https://github.com/haskell/cabal/issues/9678)
132     The `--package-db` flag now only applies to the default
133     immutable initial package stack rather than also applying to the store
134     package database.
136     This fixes an assertion failure which was triggered when using -package-db and also
137     clarifies how it should interact with `--store-dir` and `--dist-dir` flags.
139 - PkgConfig individual calls [#9134](https://github.com/haskell/cabal/pull/9134)
141 - Add `--semaphore` flag to enable interaction with GHC Job Server protocol [#8557](https://github.com/haskell/cabal/pull/8557)
143     When cabal-install is passed the `--semaphore` flag it will now act as a job server
144     according to the GHC Jobserver Protocol.
146     In particular this means that cabal-install will create a semaphore which it then
147     passes to `./Setup build` (and hence `ghc`) which can be used by `ghc` in order to
148     control how much paralellism it uses, coordinating with other simultaneously running
149     processes.
151     This feature requires ghc-9.8 in order to use, as this is the first version of GHC
152     which implements the protocol.
154 - Reimplementing `cabal check` [#7423](https://github.com/haskell/cabal/issues/7423) [#8427](https://github.com/haskell/cabal/pull/8427)
156   - For `cabal-install` users: `cabal check` do not warn on -O2 or similar
157     options if under an off-by-default cabal flag.
159 - Add `--ignore` to `cabal check` [#8587](https://github.com/haskell/cabal/issues/8587) [#9442](https://github.com/haskell/cabal/pull/9442)
161     - `cabal check` now ignores specific warnings with `--ignore`. E.g.
162       `--ignore=missing-upper-bounds` will not display “Missing upper
163       bounds” warnings.
164     - `cabal check` output now prints the warning identifier too
165       (like `[no-category]`).
167 - Adds functionality for the --offline flag with the "build" command. [#8676](https://github.com/haskell/cabal/pull/8676)
169     The --offline flag previously created in #2578 but was only implemented
170     for the install command even thought the flag didn't throw an error
171     whenever the build command was run. This PR adds functionality for the
172     --offline flag with the build command.  Additionally there is a new
173     PackageTest for the flag using the build command.
175 - Add warning for running cabal run, cabal test and cabal bench with +RTS flag [#8709](https://github.com/haskell/cabal/pull/8709)
177     This adds a warning when RTS options are passed to cabal instead of the
178     binary for the commands 'run', 'bench' and 'test', as most users want to
179     pass these options to their binary.
181 - Add support for loading multiple components into one repl session [#8238](https://github.com/haskell/cabal/pull/8238) [#8491](https://github.com/haskell/cabal/pull/8491) [#8726](https://github.com/haskell/cabal/pull/8726)
183     The `repl` command is extended in order to allow starting a repl session
184     with multiple local components. When a user specifies a target to the
185     "repl" command which resolves to multiple local components then `cabal`
186     will start a repl session which loads them all into a single GHC session
187     if the multi-repl is enabled.
189     The multi-repl can be enabled by passing `--enable-multi-repl`, or writing
190     `multi-repl: True` in your cabal.project file.
192     The feature is fully explained in [this blog
193     post](https://well-typed.com/blog/2023/03/cabal-multi-unit/).
195 - Add `cabal path` command [#8879](https://github.com/haskell/cabal/pull/8879)
197     The `cabal path` command prints the file system paths used by Cabal.
198     It is intended for use by tooling that needs to read or modify Cabal
199     data, such that it does not need to replicate the complicated logic
200     for respecting `CABAL_DIR`, `CABAL_CONFIG`, etc.
202 - `cabal check`: clearly mark Errors [#8908](https://github.com/haskell/cabal/pull/8908)
204     `cabal check` will now mark errors (which make the program return 1 and
205     Hackage refuse the package) by prepending them with an "Error: " string in
206     the output.
208 - Warn when project configuration options are going to be ignored. [#8949](https://github.com/haskell/cabal/pull/8949)
210     Some project configuration options can only be specified from the command
211     line.  If the user specified those options from a project file,
212     cabal-install would silently ignore them. Now cabal-install will emit a
213     warning.
215 - Fix precedence for PATH for build-tools-depends [#8972](https://github.com/haskell/cabal/pull/8972)
217     Fixes a bug introduced in #8506 that caused executables in the path to
218     take precedence over those specified in build-tools-depends.
220 - Remove --cabal-file flags from v2 commands [#6880](https://github.com/haskell/cabal/issues/6880) [#7225](https://github.com/haskell/cabal/issues/7225) [#8395](https://github.com/haskell/cabal/issues/8395) [#9123](https://github.com/haskell/cabal/pull/9123)
222     The --cabal-file flag was never meant for public use but only for testing.
223     To avoid confusing the users any further we removed the flag from v2
224     commands.
226 - Avoid a double space in "Executing install plan ..." [#9376](https://github.com/haskell/cabal/pull/9376)
228     The "Executing·install·plan··serially" and other similar "Executing
229     install plan··..." outputs no longer contain double spaces.
231 - Guard PackageInfo_* modules behind `cabal-version` ≥ 3.12 [#9331](https://github.com/haskell/cabal/issues/9331) [#9481](https://github.com/haskell/cabal/pull/9481)
233     `cabal check` now warns whenever PackageInfo_* autogen modules are
234     used with `cabal-version` ≥ 3.12.
235     Additionally, `cabal configure` will fail if you try to use PackageInfo_*
236     with `cabal-version` < 3.12.
238 - cabal init now generates cabal versions older than 1.12 with the correct >= syntax [#8206](https://github.com/haskell/cabal/issues/8206) [#8860](https://github.com/haskell/cabal/pull/8860)
239 - `cabal init`: suggest BSD-3 as default license [#8757](https://github.com/haskell/cabal/issues/8757) [#8764](https://github.com/haskell/cabal/pull/8764)
240 - Do not ask overwrite permissions on blank project [#9150](https://github.com/haskell/cabal/issues/9150) [#9155](https://github.com/haskell/cabal/pull/9155)
241 - 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)
243 - Shorten solver rejection messages by removing repetition [#4251](https://github.com/haskell/cabal/issues/4251) [#9559](https://github.com/haskell/cabal/issues/9559) [#9560](https://github.com/haskell/cabal/pull/9560)
245     As before, we show a single rejection as hyphenated package-version.
247     For multiple rejections, we show a list of versions preceded by package
248     semicolon, a much shorter rendering of the same information.
250     ```diff
251     - [__0] rejecting: pandoc-3.1.8, pandoc-3.1.7, pandoc-3.1.6.2, pandoc-3.1.6.1,
252     - pandoc-3.1.6, pandoc-3.1.5, pandoc-3.1.4, pandoc-3.1.3, pandoc-3.1.2,
253     - pandoc-3.1.1, pandoc-3.1, pandoc-3.0.1, pandoc-3.0, pandoc-2.19.2,
254     - pandoc-2.19.1, pandoc-2.19, pandoc-2.18, pandoc-2.17.1.1, pandoc-2.17.1,
255     + [__0] rejecting: pandoc; 3.1.8, 3.1.7, 3.1.6.2, 3.1.6.1, 3.1.6, 3.1.5, 3.1.4,
256     + 3.1.3, 3.1.2, 3.1.1, 3.1, 3.0.1, 3.0, 2.19.2, 2.19.1, 2.19, 2.18, 2.17.1.1,
257     ```
259 - Show provenance of project constraints [#9562](https://github.com/haskell/cabal/issues/9562) [#9578](https://github.com/haskell/cabal/pull/9578)
261   Show imports when the solver rejects a package version due to a project
262   constraint.  Even though imports are relative to their parent when imported,
263   their paths are shown relative to the directory of the project in the solver
264   output.
266   ```
267   $ cabal build all --dry-run
268   ...
269   [__1] next goal: hashable
270   [__1] rejecting: hashable-1.4.3.0
271         (constraint from cabal.project requires ==1.4.2.0)
272   [__1] rejecting: hashable-1.4.2.0
273         (constraint from project-stackage/nightly-2023-12-07.config requires ==1.4.3.0)
274           imported by: cabal.project
275   ```
277   Fixes some test failures detecting cycles in imports, when;
279   - the wrong import was reported as starting the cycle
280   - a cycle was reported that wasn't actually a cycle
282 - Adjust BSD-2-Clause and BSD-3-Clause licence text [#9812](https://github.com/haskell/cabal/issues/9812) [#9813](https://github.com/haskell/cabal/pull/9813)
284   This change matters to BSD-2-Clause and BSD-3-Clause licences. For these two
285   licences, `cabal init` created a licence file that slightly differed from
286   wording published at SPDX.  This has been rectified.