diff --git a/release-notes/Cabal-3.12.0.0.md b/release-notes/Cabal-3.12.0.0.md index bac478370c3..d52a27c1a45 100644 --- a/release-notes/Cabal-3.12.0.0.md +++ b/release-notes/Cabal-3.12.0.0.md @@ -1,200 +1,164 @@ Cabal and Cabal-syntax 3.12.0.0 changelog and release notes --- + + ### Significant changes - 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) - - Executable components now support the inclusion of asm, cmm, and js source files in a cabal file using the same syntax as is used for these sources in library components, similar to how c and c++ sources are supported in both types of components. This syntax was already parsed in cabal files, but was silently ignored in the build step, so no changes to syntax are made. - + +Executable components now support the inclusion of asm, cmm, and js source files in a cabal file using the same syntax as is used for these sources in library components, similar to how c and c++ sources are supported in both types of components. This syntax was already parsed in cabal files, but was silently ignored in the build step, so no changes to syntax are made. + - Add `--haddock-output-dir` flag to `cabal haddock`. [#8720](https://github.com/haskell/cabal/issues/8720) [#8788](https://github.com/haskell/cabal/pull/8788) - - - Added `--haddock-output-dir` flag to `cabal haddock`. This flag gives the user full control over the directory where the documentation is placed. It allows both relative and absolute paths. - -- 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) - - Cabal now supports per-component builds when coverage is enabled. This enables - coverage for packages with internal libraries (#6440), and enables coverage for - packages that use backpack (#6397), even though we do not get coverage for - instantiations of an indefinite module (it is not clear what it means for HPC - to support backpack, regardless of Cabal). - - To achieve this, hpc information (`.mix` files) from a library is now written - into the package database of a library under `extraCompilationArtifacts`. - - Cabal configure (via the Setup interface) now accepts --coverage-for=, - a flag which specifies which libraries should be included in the coverage - report for some testsuite. - + + This flag gives the user full control over the directory where the documentation is placed. It allows both relative and absolute paths. + ### Other changes -- Make --(test-)show-details=direct the default [#8942](https://github.com/haskell/cabal/pull/8942) - - This option leaves it up to the testing framework to decide what and how to print out, - potentially leading to a prettier output. For example, most of the testing frameworks - use colors, which wouldn't be seen with any other option. - - This comes with a tradeoff, though: Cabal will not create a log file with this option. - If you prefer a log file, consider setting `--test-show-details=streaming` (or something - else) manually. - - `cabal init` should not suggest Cabal < 2.0 [#8680](https://github.com/haskell/cabal/issues/8680) - - 'cabal init' no longer suggests users to set cabal-version to less than 2.0 - + +'cabal init' no longer suggests users to set cabal-version to less than 2.0 + - Remove Distribution.Utils.TempTestDir module from Cabal library [#9453](https://github.com/haskell/cabal/issues/9453) [#9454](https://github.com/haskell/cabal/pull/9454) - - This library was only used by internal tests, and now lives in the `Cabal-tests` library - which is shared across test components. - + +This library was only used by internal tests, and now lives in the `Cabal-tests` library +which is shared across test components. + - 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) - - Adds constructor `PPC64LE` to type `Arch` to distinguish architecture - powerpc64le from powerpc64. Existing constructor `PPC64` now exclusively - represents powerpc64. - + +Adds constructor `PPC64LE` to type `Arch` to distinguish architecture +powerpc64le from powerpc64. Existing constructor `PPC64` now exclusively +represents powerpc64. + - PkgConfig individual calls [#9134](https://github.com/haskell/cabal/pull/9134) - - - `cabal` invokes `pkg-config` individually for each lib if querying for all doesn't return the expected result - + +- `cabal` invokes `pkg-config` individually for each lib if querying for all doesn't return the expected result + - Split up `Distribution.Simple.Setup` [#8130](https://github.com/haskell/cabal/pull/8130) - - The external interface of 'Distribution.Simple.Setup' has been kept the same, but internally it has been broken up into smaller modules. - This improves build times in two ways: - 1. GHC is superlinear in the size of files, meaning that splitting up a large file can reduce overall compile times. - 2. Breaking up the module allows dependent modules to refine their imports to just the parts they require, allowing them to start buildling quicker - when GHC is run in parrallel make mode ('--ghc-options -j'). - + +The external interface of 'Distribution.Simple.Setup' has been kept the same, but internally it has been broken up into smaller modules. +This improves build times in two ways: +1. GHC is superlinear in the size of files, meaning that splitting up a large file can reduce overall compile times. +2. Breaking up the module allows dependent modules to refine their imports to just the parts they require, allowing them to start buildling quicker +when GHC is run in parrallel make mode ('--ghc-options -j'). + - Reimplementing `cabal check` [#7423](https://github.com/haskell/cabal/issues/7423) [#8427](https://github.com/haskell/cabal/pull/8427) - - - For `cabal-install` users: `cabal check` do not warn on -O2 or similar - options if under an off-by-default cabal flag. - - For `Cabal` the library users: `checkPackage` signature has been simplified, - you do not need to pass a specific configuration of the package, since - we do not flatten GenericPackageDescription no more. - - For `Cabal` the library users: `checkPackageFileNames` has been removed, - use `checkPackageFiles` instead. - - For `Cabal` the library users: `checkPackageFilesGPD` has been introduced, - a function similar to `checkPackageFiles` that works on - `GenericPackageDescription`. You do not need to use - `flattenPackageDescription` anymore. - + + - For `Cabal` the library users: `checkPackage` signature has been simplified, + you do not need to pass a specific configuration of the package, since + we do not flatten GenericPackageDescription no more. + - For `Cabal` the library users: `checkPackageFileNames` has been removed, + use `checkPackageFiles` instead. + - For `Cabal` the library users: `checkPackageFilesGPD` has been introduced, + a function similar to `checkPackageFiles` that works on + `GenericPackageDescription`. You do not need to use + `flattenPackageDescription` anymore. + - Add --semaphore option to ./Setup build interface [#8557](https://github.com/haskell/cabal/pull/8557) - - When `./Setup build --semaphore ` is called, `ghc` will be called with the - `-jsem` option. It is the responsibility of the caller of `./Setup build` to - manage the semaphore according to the GHC Jobserver Protocol. - - This low level interface is intended to be called by a high-level tool such as - `cabal-install` which can create and manage the semaphore appropriately. - - The protocol is specified by [GHC Proposal #540](https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0540-jsem.rst). - + +When `./Setup build --semaphore ` is called, `ghc` will be called with the +`-jsem` option. It is the responsibility of the caller of `./Setup build` to +manage the semaphore according to the GHC Jobserver Protocol. + +This low level interface is intended to be called by a high-level tool such as +`cabal-install` which can create and manage the semaphore appropriately. + +The protocol is specified by [GHC Proposal #540](https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0540-jsem.rst). + - Installation of extra-compilation-artifacts directory [#8662](https://github.com/haskell/cabal/pull/8662) - - - GHC plugins now can store custom data in the 'extra-compilation-artifacts' directory which gets installed with the package. - + +- GHC plugins now can store custom data in the 'extra-compilation-artifacts' directory which gets installed with the package. + - Add --promised-dependency flag to ./Setup configure interface [#8726](https://github.com/haskell/cabal/pull/8726) - - There is a new flag `--promised-dependency` to allow users to - configure a package *without* having previously built the dependency. - Instead, we promise to the configure phase that we will have built it - by the time we build the package. This allows us to configure all the - packages we intend to load into the repl without building any - dependenices which we will load in the same session, because the - promise is satisifed due to loading the package and it's dependency - into one multi-session which ensures the dependency is built before - it is needed. - - A user of ./Setup configure specifies a promised dependency by - using the "--promised-dependency" flag with a normal dependency specification. For example: - - ``` - '--promised-dependency=cabal-install-solver=cabal-install-solver-3.9.0.0-inplace' - ``` - + +There is a new flag `--promised-dependency`to allow users to +configure a package *without* having previously built the dependency. +Instead, we promise to the configure phase that we will have built it +by the time we build the package. This allows us to configure all the +packages we intend to load into the repl without building any +dependenices which we will load in the same session, because the +promise is satisifed due to loading the package and it's dependency +into one multi-session which ensures the dependency is built before +it is needed. + +A user of ./Setup configure specifies a promised dependency by +using the "--promised-dependency" flag with a normal dependency specification. For example: + +``` + '--promised-dependency=cabal-install-solver=cabal-install-solver-3.9.0.0-inplace' +``` + - Add option to ./Setup repl to write repl arguments to file [#8726](https://github.com/haskell/cabal/pull/8726) - - The `./Setup repl` command is modified to allow a user to defer - starting the repl and instead instruct the command to write the - necessary build flags to a directiory. The option is called - `--repl-multi-file `. - - This is useful when starting multi-component sessions as we want to query Setup.hs - for the arguments which are needed to build each component but not for ./Setup to - start the repl itself. - + +The `./Setup repl` command is modified to allow a user to defer +starting the repl and instead instruct the command to write the +necessary build flags to a directiory. The option is called +`--repl-multi-file `. + +This is useful when starting multi-component sessions as we want to query Setup.hs +for the arguments which are needed to build each component but not for ./Setup to +start the repl itself. + - Make check comply with Hackage requirements [#8897](https://github.com/haskell/cabal/pull/8897) - + - `cabal check` will only return exitcode 1 when the package is not fit for Hackage. E.g. it will not error anymore when your `synopsis:` is larger than `description:`, just emit a warning. - Cabal: Distribution.Client.Check now exports `isHackageDistError`, for third-party tools to know if a specific error will preclude a package from being uploaded to Hacakge. - -- Fix precedence for PATH for build-tools-depends [#8972](https://github.com/haskell/cabal/pull/8972) - - - fixes a bug introduced in #8506 that caused executables in the path to take precedence over those specified in build-tools-depends. - + - Add Haiku as a known platform [#9006](https://github.com/haskell/cabal/pull/9006) - - - Cabal: Distribution now recognises Haiku as a valid platform, - and also implements Haiku's unique directory layout. - + +- Cabal: Distribution now recognises Haiku as a valid platform, +and also implements Haiku's unique directory layout. + - Installation of .hie files [#8685](https://github.com/haskell/cabal/issues/8685) [#9019](https://github.com/haskell/cabal/pull/9019) - - - Hie files generated by GHC are now stored in the `extra-compilation-artifacts` directory which gets installed with the package. - + +- Hie files generated by GHC are now stored in the `extra-compilation-artifacts` directory which gets installed with the package. + - 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) - - - This allows the use of several **API incompatible builds of the same version - of GHC** without corrupting the cabal store. - - This relies on the "Project Unit Id" which is available since GHC 9.8.1, - older versions of GHC do not benefit from this change. - + +- This allows the use of several **API incompatible builds of the same version +of GHC** without corrupting the cabal store. +- This relies on the "Project Unit Id" which is available since GHC 9.8.1, +older versions of GHC do not benefit from this change. + - Fix the platform string for GNU/Hurd [#9434](https://github.com/haskell/cabal/pull/9434) - - Depending who you ask, GNU/Hurd will be labelled "gnu" or "hurd". The autotools - use "gnu", so ghc follows this for installed files, even if the ghc source code - uses OSHurd. We thus need to add the translation between the two. - + +Depending who you ask, GNU/Hurd will be labelled "gnu" or "hurd". The autotools +use "gnu", so ghc follows this for installed files, even if the ghc source code +uses OSHurd. We thus need to add the translation between the two. + - Use linker capability detection to improve linker use [#9443](https://github.com/haskell/cabal/pull/9443) - - - Previously the GHC version number and platform were used as a proxy for whether - the linker can generate relocatable objects. - - Now, the ability of the linker to create relocatable objects is detected. - -- Guard PackageInfo_* modules behind `cabal-version` ≥ 3.12 [#9331](https://github.com/haskell/cabal/issues/9331) [#9481](https://github.com/haskell/cabal/pull/9481) - - `cabal check` now warns whenever PackageInfo_* autogen modules are - used with `cabal-version` ≥ 3.12. - Additionally, `cabal configure` will fail if you try to use PackageInfo_* - with `cabal-version` < 3.12. - + +- Previously the GHC version number and platform were used as a proxy for whether +the linker can generate relocatable objects. +- Now, the ability of the linker to create relocatable objects is detected. + - Merge globbing implementations [#5349](https://github.com/haskell/cabal/issues/5349) [#9673](https://github.com/haskell/cabal/pull/9673) - - The common aspects of the globbing functionality between `Cabal` and - `cabal-install` have been factored out. The only change in the user-facing API - is that we now record when a glob does not match exactly, but matches a - directory with that same name, with the new constructor `GlobMatchesDirectory` - of `GlobResult`. - - To illustrate, this change means that when `foo/dir` is a directory, the glob - `*/dir/` matches exactly `foo/dir` (as before), but now - `*/dir` produces `GlobMatchesDirectory` instead of failing. - This allows callers to decide whether to allow or discard such inexact matches. - + +The common aspects of the globbing functionality between `Cabal` and +`cabal-install` have been factored out. The only change in the user-facing API +is that we now record when a glob does not match exactly, but matches a +directory with that same name, with the new constructor `GlobMatchesDirectory` +of `GlobResult`. + +To illustrate, this change means that when `foo/dir` is a directory, the glob +`*/dir/` matches exactly `foo/dir` (as before), but now +`*/dir` produces `GlobMatchesDirectory` instead of failing. +This allows callers to decide whether to allow or discard such inexact matches. + - Add `--ignore` to `cabal check` [#8587](https://github.com/haskell/cabal/issues/8587) [#9442](https://github.com/haskell/cabal/pull/9442) - - - `cabal check` now ignores specific warnings with `--ignore`. E.g. - `--ignore=missing-upper-bounds` will not display “Missing upper - bounds” warnings. - - `cabal check` output now prints the warning identifier too - (like `[no-category]`). - - `Distribution.PackageDescription.Check.Warning` now exports - `filterPackageChecksById`, this can be used by third-party - tools to filter warnings. - + +- `cabal check` now ignores specific warnings with `--ignore`. E.g. +`--ignore=missing-upper-bounds` will not display “Missing upper +bounds” warnings. +- `cabal check` output now prints the warning identifier too +(like `[no-category]`). +- `Distribution.PackageDescription.Check.Warning` now exports +`filterPackageChecksById`, this can be used by third-party +tools to filter warnings. + - Document `remote-repo-cache` as implemented. [#8737](https://github.com/haskell/cabal/issues/8737) [#8738](https://github.com/haskell/cabal/pull/8738) - Deduplicate LD_LIBRARY_PATH when running tests [#8728](https://github.com/haskell/cabal/pull/8728) - Add support for the 64-bit RISC-V architecture [#9062](https://github.com/haskell/cabal/pull/9062) @@ -205,69 +169,69 @@ Cabal and Cabal-syntax 3.12.0.0 changelog and release notes ### Significant changes - Add language extension ExtendedLiterals [#8992](https://github.com/haskell/cabal/pull/8992) - - - adds support for the ExtendedLiterals language extension (GHC proposal #451) - + +- adds support for the ExtendedLiterals language extension (GHC proposal #451) + ### Other changes - Warn about inconsistent indentation [#8975](https://github.com/haskell/cabal/pull/8975) - - Make Cabal warn about inconsistent indentation in .cabal files. - - For example warn about somewhat common decreasing indentation like in - - ```cabal - library - default-language: Haskell2010 + + - Make Cabal warn about inconsistent indentation in .cabal files. For + example warn about somewhat common decreasing indentation like in + + ```cabal + library + default-language: Haskell2010 build-depends: base ghc-options: -Wall - ``` - - The change is `readFields` function. - - This is an effect of using `indentOfAtLeast` method/approach: any indentation greater than current offset is accepted. - - That behavior is desirable to parsing multiline field contents, but it is a bit surprising for fields in sections, which we expect to be aligned. - - Such insonsistency seems to be always a mistake, and it's easy to fix once a machine points it out. - + ``` + + The change is `readFields` function. + + This is an effect of using `indentOfAtLeast` method/approach: any + indentation greater than current offset is accepted. + + That behavior is desirable to parsing multiline field contents, but it is + a bit surprising for fields in sections, which we expect to be aligned. + + Such insonsistency seems to be always a mistake, and it's easy to fix once + a machine points it out. + - Add LexBraces lexer warning [#8577](https://github.com/haskell/cabal/issues/8577) - - LexBraces warning is issued when brace delimiting syntax is used. - This way, using `readFields'`, a low-lever consumer may decide - whether braces were used. - - (Looking for a brace character in the input is imprecise, as braces can occur inside field content). - - This warning is not propagated to parser warnings, - so e.g. readGenericPackageDescription doesn't warn about it. - This is because all parser warnings prevent uploads to Hackage, - and using braces (or not) is opinionated choice. - + +LexBraces warning is issued when brace delimiting syntax is used. +This way, using `readFields'`, a low-lever consumer may decide +whether braces were used. + +(Looking for a brace character in the input is imprecise, as braces can occur inside field content). + +This warning is not propagated to parser warnings, +so e.g. readGenericPackageDescription doesn't warn about it. +This is because all parser warnings prevent uploads to Hackage, +and using braces (or not) is opinionated choice. + - 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) - - Adds constructor `PPC64LE` to type `Arch` to distinguish architecture - powerpc64le from powerpc64. Existing constructor `PPC64` now exclusively - represents powerpc64. - + +Adds constructor `PPC64LE` to type `Arch` to distinguish architecture +powerpc64le from powerpc64. Existing constructor `PPC64` now exclusively +represents powerpc64. + - PkgConfig individual calls [#9134](https://github.com/haskell/cabal/pull/9134) - - - `cabal` invokes `pkg-config` individually for each lib if querying for all doesn't return the expected result - + +- `cabal` invokes `pkg-config` individually for each lib if querying for all doesn't return the expected result + - Add language extension ListTuplePuns [#8854](https://github.com/haskell/cabal/pull/8854) - - - adds support for the `ListTuplePuns` language extension (GHC proposal #475) - + +- adds support for the `ListTuplePuns` language extension (GHC proposal #475) + - Add `mkVersionIntervals` for creating a `VersionIntervals` from a list [#9034](https://github.com/haskell/cabal/pull/9034) - - If external tools want to change the version intervals of dependencies, they - need to be able to create a `VersionRange` from a `[VersionInterval]` list. Adding - the function `mkVersionIntervals` makes this possible again. - + + If external tools want to change the version intervals of dependencies, they + need to be able to create a `VersionRange` from a `[VersionInterval]` list. Adding + the function `mkVersionIntervals` makes this possible again. + - Add language extension `TypeAbstractions` [#9496](https://github.com/haskell/cabal/issues/9496) [#9502](https://github.com/haskell/cabal/pull/9502) - - - Adds support for the TypeAbstractions language extension. - + - Add support for the 64-bit RISC-V architecture [#9062](https://github.com/haskell/cabal/pull/9062) - Add support for 64-bit LoongArch architecture [#9215](https://github.com/haskell/cabal/pull/9215) - Add support for 64-bit SPARC as a separate architecture [#9445](https://github.com/haskell/cabal/pull/9445) diff --git a/release-notes/cabal-install-3.12.0.0.md b/release-notes/cabal-install-3.12.0.0.md index d12f0d4624d..cb223c0aa51 100644 --- a/release-notes/cabal-install-3.12.0.0.md +++ b/release-notes/cabal-install-3.12.0.0.md @@ -2,247 +2,218 @@ cabal-install and cabal-install-solver 3.12.0.0 changelog and release notes --- - 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) - - - Added --project-dir flag for specifying the project's root directory - - Deprecated using --project-file with an absolute filepath without also using --project-dir - -- remove [#9151](https://github.com/haskell/cabal/issues/9151) [#9346](https://github.com/haskell/cabal/pull/9346) - - - Remove "Log" as a log level in favour of "Info". - - Remove "Show" in Severity and replace by "displaySeverity" function - + +- Added --project-dir flag for specifying the project's root directory +- Deprecated using --project-file with an absolute filepath without also using --project-dir + +- remove[#9151](https://github.com/haskell/cabal/issues/9151) [#9346](https://github.com/haskell/cabal/pull/9346) + +- Remove "Log" as a log level in favour of "Info". +- Remove "Show" in Severity and replace by "displaySeverity" function + - Add `--haddock-output-dir` flag to `cabal haddock`. [#8720](https://github.com/haskell/cabal/issues/8720) [#8788](https://github.com/haskell/cabal/pull/8788) - - - Added `--haddock-output-dir` flag to `cabal haddock`. This flag gives the user full control over the directory where the documentation is placed. It allows both relative and absolute paths. - + + This flag gives the user full control over the directory where the documentation is placed. It allows both relative and absolute paths. + - 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) - - Cabal now supports per-component builds when coverage is enabled. This enables - coverage for packages with internal libraries (#6440), and enables coverage for - packages that use backpack (#6397), even though we do not get coverage for - instantiations of an indefinite module (it is not clear what it means for HPC - to support backpack, regardless of Cabal). - - To achieve this, hpc information (`.mix` files) from a library is now written - into the package database of a library under `extraCompilationArtifacts`. - - Cabal configure (via the Setup interface) now accepts --coverage-for=, - a flag which specifies which libraries should be included in the coverage - report for some testsuite. - + +Cabal now supports per-component builds when coverage is enabled.This enables +coverage for packages with internal libraries (#6440), and enables coverage for +packages that use backpack (#6397), even though we do not get coverage for +instantiations of an indefinite module (it is not clear what it means for HPC +to support backpack, regardless of Cabal). + +To achieve this, hpc information (`.mix` files) from a library is now written +into the package database of a library under `extraCompilationArtifacts`. + +Cabal configure (via the Setup interface) now accepts --coverage-for=, +a flag which specifies which libraries should be included in the coverage +report for some testsuite. + ### Other changes - Script cache dir is the base16 hash of the canonical path of the script. [#9459](https://github.com/haskell/cabal/pull/9459) - - Script cache dir is the base16 hash of the canonical path of the script. - + +Script cache dir is the base16 hash of the canonical path of the script. + - Die if package list is missing [#8944](https://github.com/haskell/cabal/pull/8944) - - If a package list is missing, `cabal` will now die and suggest the user to run - `cabal update` instead of continuing into not being able to find packages coming - from the remote package server. - + +If a package list is missing, `cabal` will now die and suggest the user to run +`cabal update` instead of continuing into not being able to find packages coming +from the remote package server. + - Reject index-state younger than cached index file [#8944](https://github.com/haskell/cabal/pull/8944) - - Requesting to use an index-state younger than the cached version will now fail, - telling the user to use an index-state older or equal to the cached file, or to - run `cabal update`. - - The warning for a non-existing index-state has been also demoted to appear only - on verbose logging. - + +Requesting to use an index-state younger than the cached version will now fail, +telling the user to use an index-state older or equal to the cached file, or to +run `cabal update`. + +The warning for a non-existing index-state has been also demoted to appear only +on verbose logging. + - Warn early that overwrite policy is needed [#5993](https://github.com/haskell/cabal/issues/5993) [#9268](https://github.com/haskell/cabal/pull/9268) - - Waiting for a long build and then seeing the install fail because a flag was - missing is frustrating. With this change we skip the wait and warn early, - before the build, that an overwrite policy flag would be needed for the - install to succeed. - + +Waiting for a long build and then seeing the install fail because a flag was +missing is frustrating.With this change we skip the wait and warn early, +before the build, that an overwrite policy flag would be needed for the +install to succeed. + - 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) - - A new flag `--token` (`-t`) has been created. Token authentication takes - precedence over username and password meaning that, if a token is set, - the username and password flags are ignored. - + +A new flag `--token` (`-t`) has been created. Token authentication takes +precedence over username and password meaning that, if a token is set, +the username and password flags are ignored. + - Make --(test-)show-details=direct the default [#8942](https://github.com/haskell/cabal/pull/8942) - - This option leaves it up to the testing framework to decide what and how to print out, - potentially leading to a prettier output. For example, most of the testing frameworks - use colors, which wouldn't be seen with any other option. - - This comes with a tradeoff, though: Cabal will not create a log file with this option. - If you prefer a log file, consider setting `--test-show-details=streaming` (or something - else) manually. - + +This option leaves it up to the testing framework to decide what and how to print out, +potentially leading to a prettier output. For example, most of the testing frameworks +use colors, which wouldn't be seen with any other option. + +This comes with a tradeoff, though: Cabal will not create a log file with this option. +If you prefer a log file, consider setting `--test-show-details=streaming` (or something +else) manually. + - 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) - - - Changed order or directories in GHC invocation so that source - directories explicitly specified in cabal file will be considered - before Cabal’s internal build directory. - + +- Changed order or directories in GHC invocation so that source +directories explicitly specified in cabal file will be considered +before Cabal’s internal build directory. + - Also render short options with arguments [#8785](https://github.com/haskell/cabal/issues/8785) [#9043](https://github.com/haskell/cabal/pull/9043) - - Show how arguments are used with both short and long forms of options: - - ```diff - < -v, --verbose[=n] Control verbosity (n is 0--3, default - > -v[n], --verbose[=n] Control verbosity (n is 0--3, default - < -w, --with-compiler=PATH give the path to a particular compiler - > -w PATH or -wPATH, --with-compiler=PATH - ``` - + +Show how arguments are used with both short and long forms of options: + +```diff +<-v, --verbose[=n]Control verbosity (n is 0--3, default +>-v[n], --verbose[=n] Control verbosity (n is 0--3, default +<-w, --with-compiler=PATH give the path to a particular compiler +>-w PATH or -wPATH, --with-compiler=PATH +``` + - 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) - - The init section of config file now allows the following fields: - + +The init section of config file now allows the following fields: + - Fix handling of ETag header for remote packages [#9113](https://github.com/haskell/cabal/issues/9113) [#9116](https://github.com/haskell/cabal/pull/9116) - - Remote packages will now be cached regardless of the capitalization of the - "ETag" header. Previously remote packages would not be cached if the header - name did not match exactly. Now they will be cached even if the header's - capitalization is different. - + +Remote packages will now be cached regardless of the capitalization of the +"ETag" header. Previously remote packages would not be cached if the header +name did not match exactly. Now they will be cached even if the header's +capitalization is different. + - Clarify the semantics of the -package-db flag [#9678](https://github.com/haskell/cabal/issues/9678) - - The `--package-db` flag now only applies to the default - immutable initial package stack rather than also applying to the store - package database. - - This fixes an assertion failure which was triggered when using -package-db and also - clarifies how it should interact with `--store-dir` and `--dist-dir` flags. - + +The `--package-db` flag now only applies to the default +immutable initial package stack rather than also applying to the store +package database. + +This fixes an assertion failure which was triggered when using -package-db and also +clarifies how it should interact with `--store-dir` and `--dist-dir` flags. + - PkgConfig individual calls [#9134](https://github.com/haskell/cabal/pull/9134) - - - `cabal` invokes `pkg-config` individually for each lib if querying for all doesn't return the expected result - + - Add `--semaphore` flag to enable interaction with GHC Job Server protocol [#8557](https://github.com/haskell/cabal/pull/8557) - - When cabal-install is passed the `--semaphore` flag it will now act as a job server - according to the GHC Jobserver Protocol. - - In particular this means that cabal-install will create a semaphore which it then - passes to `./Setup build` (and hence `ghc`) which can be used by `ghc` in order to - control how much paralellism it uses, coordinating with other simultaneously running - processes. - - This feature requires ghc-9.8 in order to use, as this is the first version of GHC - which implements the protocol. - - The protocol is specified by [GHC Proposal #540](https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0540-jsem.rst). - + +When cabal-install is passed the `--semaphore` flag it will now act as a job server +according to the GHC Jobserver Protocol. + +In particular this means that cabal-install will create a semaphore which it then +passes to `./Setup build` (and hence `ghc`) which can be used by `ghc` in order to +control how much paralellism it uses, coordinating with other simultaneously running +processes. + +This feature requires ghc-9.8 in order to use, as this is the first version of GHC +which implements the protocol. + +- Reimplementing `cabal check` [#7423](https://github.com/haskell/cabal/issues/7423) [#8427](https://github.com/haskell/cabal/pull/8427) + + - For `cabal-install` users: `cabal check` do not warn on -O2 or similar + options if under an off-by-default cabal flag. + +The protocol is specified by [GHC Proposal #540](https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0540-jsem.rst). + - Adds functionality for the --offline flag with the "build" command. [#8676](https://github.com/haskell/cabal/pull/8676) - - The --offline flag previously created in #2578 but was only implemented for the install command even thought the flag didn't throw an error whenever the build command was run. This PR adds functionality for the --offline flag with the build command. - Additionally there is a new PackageTest for the flag using the build command. - + +The --offline flag previously created in #2578 but was only implemented for the install command even thought the flag didn't throw an error whenever the build command was run. This PR adds functionality for the --offline flag with the build command. +Additionally there is a new PackageTest for the flag using the build command. + - Add warning for running cabal run, cabal test and cabal bench with +RTS flag [#8709](https://github.com/haskell/cabal/pull/8709) - - This adds a warning when RTS options are passed to cabal instead of the binary - for the commands 'run', 'bench' and 'test', as most users want to pass these - options to their binary. - + +This adds a warning when RTS options are passed to cabal instead of the binary +for the commands 'run', 'bench' and 'test', as most users want to pass these +options to their binary. + - 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) - - The `repl` command is extended in order to allow starting a repl session with - multiple local components. When a user specifies a target to the "repl" command - which resolves to multiple local components then `cabal` will start a repl session - which loads them all into a single GHC session if the multi-repl is enabled. - - The multi-repl can be enabled by passing `--enable-multi-repl`, or writing `multi-repl: True` in - your cabal.project file. - - The feature is fully explained in [this blog post](https://well-typed.com/blog/2023/03/cabal-multi-unit/). - + +The `repl` command is extended in order to allow starting a repl session with +multiple local components. When a user specifies a target to the "repl" command +which resolves to multiple local components then `cabal` will start a repl session +which loads them all into a single GHC session if the multi-repl is enabled. + +The multi-repl can be enabled by passing `--enable-multi-repl`, or writing `multi-repl: True` in +your cabal.project file. + +The feature is fully explained in [this blog post](https://well-typed.com/blog/2023/03/cabal-multi-unit/). + - Add `cabal path` command [#8879](https://github.com/haskell/cabal/pull/8879) - - The `cabal path` command prints the file system paths used by Cabal. - It is intended for use by tooling that needs to read or modify Cabal - data, such that it does not need to replicate the complicated logic - for respecting `CABAL_DIR`, `CABAL_CONFIG`, etc. - -- Make check comply with Hackage requirements [#8897](https://github.com/haskell/cabal/pull/8897) - - - `cabal check` will only return exitcode 1 when the package is not fit - for Hackage. E.g. it will not error anymore when your `synopsis:` is - larger than `description:`, just emit a warning. - - Cabal: Distribution.Client.Check now exports `isHackageDistError`, for - third-party tools to know if a specific error will preclude a package - from being uploaded to Hacakge. - + +The `cabal path` command prints the file system paths used by Cabal. +It is intended for use by tooling that needs to read or modify Cabal +data, such that it does not need to replicate the complicated logic +for respecting `CABAL_DIR`, `CABAL_CONFIG`, etc. + - `cabal check`: clearly mark Errors [#8908](https://github.com/haskell/cabal/pull/8908) - - - `cabal check` will now mark errors (which make the program return 1 and - Hackage refuse the package) by prepending them with an "Error: " string - in the output. - + +- `cabal check` will now mark errors (which make the program return 1 and +Hackage refuse the package) by prepending them with an "Error: " string +in the output. + - Warn when project configuration options are going to be ignored. [#8949](https://github.com/haskell/cabal/pull/8949) - - Some project configuration options can only be specified from the command line. - If the user specified those options from a project file, cabal-install would - silently ignore them. Now cabal-install will emit a warning. - + +Some project configuration options can only be specified from the command line. +If the user specified those options from a project file, cabal-install would +silently ignore them. Now cabal-install will emit a warning. + - Fix precedence for PATH for build-tools-depends [#8972](https://github.com/haskell/cabal/pull/8972) - - - fixes a bug introduced in #8506 that caused executables in the path to take precedence over those specified in build-tools-depends. - + +- fixes a bug introduced in #8506 that caused executables in the path to take precedence over those specified in build-tools-depends. + - 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) - - The --cabal-file flag was never meant for public use but only for testing. To - avoid confusing the users any further we removed the flag from v2 commands. - -- 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) - - - This allows the use of several **API incompatible builds of the same version - of GHC** without corrupting the cabal store. - - This relies on the "Project Unit Id" which is available since GHC 9.8.1, - older versions of GHC do not benefit from this change. - + +The --cabal-file flag was never meant for public use but only for testing. To +avoid confusing the users any further we removed the flag from v2 commands. + - Avoid a double space in "Executing install plan ..." [#9376](https://github.com/haskell/cabal/pull/9376) - - The "Executing·install·plan··serially" and other similar "Executing install - plan··..." outputs no longer contain double spaces. - + +The "Executing·install·plan··serially" and other similar "Executing install +plan··..." outputs no longer contain double spaces. + - Guard PackageInfo_* modules behind `cabal-version` ≥ 3.12 [#9331](https://github.com/haskell/cabal/issues/9331) [#9481](https://github.com/haskell/cabal/pull/9481) - - `cabal check` now warns whenever PackageInfo_* autogen modules are - used with `cabal-version` ≥ 3.12. - Additionally, `cabal configure` will fail if you try to use PackageInfo_* - with `cabal-version` < 3.12. - -- Merge globbing implementations [#5349](https://github.com/haskell/cabal/issues/5349) [#9673](https://github.com/haskell/cabal/pull/9673) - - The common aspects of the globbing functionality between `Cabal` and - `cabal-install` have been factored out. The only change in the user-facing API - is that we now record when a glob does not match exactly, but matches a - directory with that same name, with the new constructor `GlobMatchesDirectory` - of `GlobResult`. - - To illustrate, this change means that when `foo/dir` is a directory, the glob - `*/dir/` matches exactly `foo/dir` (as before), but now - `*/dir` produces `GlobMatchesDirectory` instead of failing. - This allows callers to decide whether to allow or discard such inexact matches. - + + `cabal check` now warns whenever PackageInfo_* autogen modules are + used with `cabal-version` ≥ 3.12. + Additionally, `cabal configure` will fail if you try to use PackageInfo_* + with `cabal-version` < 3.12. + - 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) - `cabal init`: suggest BSD-3 as default license [#8757](https://github.com/haskell/cabal/issues/8757) [#8764](https://github.com/haskell/cabal/pull/8764) - Do not ask overwrite permissions on blank project [#9150](https://github.com/haskell/cabal/issues/9150) [#9155](https://github.com/haskell/cabal/pull/9155) - 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) -- PkgConfig individual calls [#9134](https://github.com/haskell/cabal/pull/9134) - - - `cabal` invokes `pkg-config` individually for each lib if querying for all doesn't return the expected result - + - 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) - - As before, we show a single rejection as hyphenated package-version. - - For multiple rejections, we show a list of versions preceded by package - semicolon, a much shorter rendering of the same information. - - ```diff - - [__0] rejecting: pandoc-3.1.8, pandoc-3.1.7, pandoc-3.1.6.2, pandoc-3.1.6.1, - - pandoc-3.1.6, pandoc-3.1.5, pandoc-3.1.4, pandoc-3.1.3, pandoc-3.1.2, - - pandoc-3.1.1, pandoc-3.1, pandoc-3.0.1, pandoc-3.0, pandoc-2.19.2, - - pandoc-2.19.1, pandoc-2.19, pandoc-2.18, pandoc-2.17.1.1, pandoc-2.17.1, - + [__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, - + 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, - ``` - + +As before, we show a single rejection as hyphenated package-version. + +For multiple rejections, we show a list of versions preceded by package +semicolon, a much shorter rendering of the same information. + +```diff +- [__0] rejecting: pandoc-3.1.8, pandoc-3.1.7, pandoc-3.1.6.2, pandoc-3.1.6.1, +- pandoc-3.1.6, pandoc-3.1.5, pandoc-3.1.4, pandoc-3.1.3, pandoc-3.1.2, +- pandoc-3.1.1, pandoc-3.1, pandoc-3.0.1, pandoc-3.0, pandoc-2.19.2, +- pandoc-2.19.1, pandoc-2.19, pandoc-2.18, pandoc-2.17.1.1, pandoc-2.17.1, ++ [__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, ++ 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, +``` +