Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pkgconf-provided pkg-config does --modversion differently; dependency resolution fails mysteriously #8923

Closed
jashank opened this issue Apr 27, 2023 · 7 comments · Fixed by #9391
Labels
cabal-install: solver re: pkg-config Concerning pkg-config and pkgconfig-depends constraints type: bug

Comments

@jashank
Copy link

jashank commented Apr 27, 2023

Describe the bug

On a system where pkgconf provides pkg-config, Cabal incorrectly reports dependency resolution failures. It turns out (modulo a bug in pkgconf), pkgconf --modversion only reports information about one package at a time, whereas Cabal happily tries the lot:

(pkgVersions, _errs, exitCode) <-
getProgramInvocationOutputAndErrors verbosity
(programInvocation pkgConfig ("--modversion" : pkgNames))

(Whether that pkgconf behaviour is correct is another question, and one I'm certainly not qualified to answer.)

To Reproduce

(I use Pango as an example here, because it's where I started; however, this affects pretty much any package that has a pkg-config dependency.)

% pkg-config --about | head -n1
pkgconf 1.9.4
% pkg-config --modversion pango
1.50.14
% cabal v2-install --lib pango
Resolving dependencies...
Error: cabal: Could not resolve dependencies:
[__0] next goal: pango (user goal)
[__0] rejecting: pango-0.13.8.2, pango-0.13.8.1, pango-0.13.8.0,
pango-0.13.6.1, pango-0.13.6.0, pango-0.13.5.0, pango-0.13.4.0,
pango-0.13.3.1, pango-0.13.3.0, pango-0.13.2.0, pango-0.13.1.1,
pango-0.13.1.0, pango-0.13.0.5, pango-0.13.0.4, pango-0.13.0.3,
pango-0.13.0.2, pango-0.13.0.1, pango-0.13.0.0, pango-0.12.5.3,
pango-0.12.5.0, pango-0.12.4, pango-0.12.3, pango-0.12.2, pango-0.12.1,
pango-0.12.0, pango-0.11.2, pango-0.11.1, pango-0.11.0 (conflict: pkg-config
package pango>=1.0, not found in the pkg-config database)
[__0] fail (backjumping, conflict set: pango)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: pango
`cabal v2-install --verbose --lib pango`

% cabal v2-install --verbose --lib pango
Reading available packages of hackage.haskell.org...
Using most recent state specified from most recent cabal update
index-state(hackage.haskell.org) = 2023-04-27T03:20:47Z
Running: /home/jashank/bin/local/ghc --numeric-version
looking for tool ghc-pkg near compiler in /home/jashank/bin/local
found ghc-pkg in /home/jashank/.ghcup/ghc/9.6.1/bin/ghc-pkg-9.6.1
Running: /home/jashank/.ghcup/ghc/9.6.1/bin/ghc-pkg-9.6.1 --version
Running: /home/jashank/bin/local/ghc --supported-languages
Running: /home/jashank/bin/local/ghc --info
creating /tmp/jashank/cabal-install.-1289081/dist-newstyle
creating /tmp/jashank/cabal-install.-1289081/dist-newstyle/cache
Compiler settings changed, reconfiguring...
Running: /home/jashank/bin/local/ghc --numeric-version
looking for tool ghc-pkg near compiler in /home/jashank/bin/local
found ghc-pkg in /home/jashank/.ghcup/ghc/9.6.1/bin/ghc-pkg-9.6.1
Running: /home/jashank/.ghcup/ghc/9.6.1/bin/ghc-pkg-9.6.1 --version
Running: /home/jashank/bin/local/ghc --supported-languages
Running: /home/jashank/bin/local/ghc --info
Running: /home/jashank/bin/local/ghc --print-global-package-db
Reading available packages of hackage.haskell.org...
Using most recent state specified from most recent cabal update
index-state(hackage.haskell.org) = 2023-04-27T03:20:47Z
Running: /usr/bin/pkg-config --version
Running: /usr/bin/pkg-config --variable pc_path pkg-config
Running: /usr/bin/pkg-config --version
Running: /usr/bin/pkg-config --list-all
Running: /usr/bin/pkg-config --modversion guile-3.0 libtcmalloc_debug polyml xcb-renderutil 'flac++' bullet libtasn1 freetype2 libxslt harfbuzz-subset edje panelw libpci wayland-cursor cairo-tee pamc xcb-icccm gmpxx webkit2gtk-4.0 orc-0.4 eo-cxx pangoot libidn2 fftw3q ector wayland-client gobject-2.0 xcb-aux efreet-mime ecore-wl2 gmodule-2.0 kadm-client fftw3f libsharpyuv xcb-damage fontconfig gdk-x11-3.0 xtst yajl bdw-gc libunwind-coredump eio-cxx libnl-route-3.0 xpm libselinux kdb libevent_extra xcb-util readline pangofc fftw3 libjpeg harfbuzz ecore-sdl tic tk xkbcommon-x11 xcb-record libwebpdecoder libpcre2-16 cddlib evas-cxx openssl libout123 expat libnl-nf-3.0 vips-cpp cairo-fc liblzma libpcre efl-ui xcb-dri3 evas xcb-keysyms m17n-shell efl-canvas-wl atf-sh sysprof-capture-4 PyImath hogweed python-3.11 xcb-randr kadm-server xcb-render xcb-xkb xfixes gsl z3 libcrypto libbrotlienc libsasl2 harfbuzz-icu jansson libpcre2-posix libnl-genl-3.0 xcb-sync wayland-server gobject-introspection-no-export-1.0 libxcrypt libgsasl elementary libstartup-notification-1.0 m17n-core xcb-xrm atspi-2 xcursor x11 ldap pixman-1 fribidi 'gtk+-broadway-3.0' libexslt vorbisfile lber jemalloc gl libuv ecore-x libbsd-overlay libprofiler xcb-dri2 poppler-glib cairo-script xcb-xinerama libunwind-ptrace libpcreposix libattr libffi cairo-ft libpulse-mainloop-glib cairo-xcb cairo-xlib blkid gmodule-no-export-2.0 efl-cxx glesv2 matio cairo-xlib-xrender harfbuzz-cairo atf-c xmuu libgsf-1 epoxy krb5-gssapi xau libidn libpng mit-krb5 eldbus-cxx libunwind verilator xcb-atom libpulse libusb-1.0 menu libevent xaw3d 'gtk+-3.0' xft audit xdamage eina-cxx libnl-idiag-3.0 xaw7 cairo-gobject pango mit-krb5-gssapi libpcre32 uuid ecore-ipc gmp guile-2.2 sqlite3 wayland-scanner 'ncurses++w' avahi-libevent libgit2 gssrpc icu-uc libacl m17n-flt libcrypt libssl gtk4-wayland 'atf-c++' efreet xt gdk-pixbuf-2.0 gtk4-x11 cairo-pdf python zlib xcb-event sm ethumb-client ecore-cxx mpfr m17n-gui xrender python3-embed xscrnsaver tcl ecore-imf-evas krb5 gpg-error libtcmalloc atk-bridge-2.0 graphene-gobject-1.0 xcb-cursor alsa avahi-core libnl-cli-3.0 cairo-script-interpreter ecore-imf gdk-broadway-3.0 xkbfile libpcrecpp libxml-2.0 opus xcb-glx xapian-core elput ecore-evas luajit xcb-xfixes libmpg123 libseccomp libavif libsystemd 'gtk+-x11-3.0' ogg pangoft2 efreet-trash opengl eio glesv1_cm xcb-screensaver libglvnd xrandr ecore xcb-xv ice libbrotlicommon xcb-image libtirpc gmodule-export-2.0 cairo-png xcb-xinput libwebpdemux xext nettle libwebp wayland-egl libgcrypt libpcre16 cairo-ps xcb-shape cloudproviders gtk4-unix-print xcb-res libunwind-generic libpcre2-8 fwupd-efi libsoup-2.4 egl libpulse-simple gdk-wayland-3.0 yaml-0.1 libsyn123 libopenjp2 cairo gobject-introspection-1.0 xcb-present liblz4 libcap-ng ecore-input-evas xcb-dpms pangocairo eo ecore-fb elua ncursesw xcb-composite xcb-xvmc xinerama gdlib cgif graphite2 gnutls-dane libcurl xcb-xselinux atk libwebpmux OpenEXR webkit2gtk-web-extension-4.0 sndfile xi gdk-3.0 libsepol re2 ethumb emile libtiff-4 valgrind eolian libmd xcb-ewmh cairo-xcb-shm flac gnutls libevent_openssl libmariadb gio-unix-2.0 lmdb sdl2 edje-cxx python-3.11-embed libinput eet emotion atomic_ops libevent_core gtk4 ecore-drm2 ephysics libbsd dbus-1 imagequant libnl-3.0 com_err ruby eldbus libpsl pam libverto efl-core tinfo efl-net libtcmalloc_minimal_debug ecore-file gthread-2.0 ecore-con fftw3l gmodule libpng16 eeze librsvg-2.0 'gtk+-wayland-3.0' panel vorbisenc spng eina cairo-svg glib-2.0 libkeyutils python2 ecore-input menuw orc-test-0.4 xcb-xtest harfbuzz-gobject graphene-1.0 libelf xdmcp eolian-cxx python3 javascriptcoregtk-4.0 bzip2 vorbis x11-xcb pangoxft libperf libpq auparse 'gtk+-unix-print-3.0' libarchive pthread-stubs hunspell icu-i18n glib libevent_pthreads eet-cxx libotf icu-io gio-2.0 xcb-xf86dri gtk4-broadway vips embryo 'ncurses++' tree-sitter alsa-topology lcms2 ethumb_client gthread glx poppler xcomposite ncurses libsoup-gnome-2.4 p11-kit-1 mount libedit libpcre2-32 history xcb ecore-buffer libzstd ecore-avahi avahi-client ecore-audio xkbcommon gnome-todo libexif libthai python-2.7 wayland-egl-backend fuse xkbregistry elementary-cxx formw libtcmalloc_minimal Imath pam_misc libudev datrie-0.2 gail-3.0 efl form cfitsio xcb-shm libnl-xfrm-3.0 libbrotlidec xmu compositeproto dri2proto videoproto shared-mime-info fixesproto xcb-proto udev xcmiscproto xf86dgaproto emacs fontsproto chemical-mime-data dri3proto resourceproto dmxproto randrproto recordproto xbitmaps xproto damageproto kbproto dpmsproto xextproto bash-completion dracut xineramaproto inputproto xwaylandproto glproto xtrans bigreqsproto xf86bigfontproto renderproto scrnsaverproto xorg-macros presentproto xf86vidmodeproto bodr xf86driproto eigen3 systemd
Resolving dependencies...
CallStack (from HasCallStack):
  withMetadata, called at src/Distribution/Simple/Utils.hs:368:14 in Cabal-3.10.1.0-inplace:Distribution.Simple.Utils
Error: cabal: Could not resolve dependencies:
[__0] next goal: pango (user goal)
[__0] rejecting: pango-0.13.8.2, pango-0.13.8.1, pango-0.13.8.0,
pango-0.13.6.1, pango-0.13.6.0, pango-0.13.5.0, pango-0.13.4.0,
pango-0.13.3.1, pango-0.13.3.0, pango-0.13.2.0, pango-0.13.1.1,
pango-0.13.1.0, pango-0.13.0.5, pango-0.13.0.4, pango-0.13.0.3,
pango-0.13.0.2, pango-0.13.0.1, pango-0.13.0.0, pango-0.12.5.3,
pango-0.12.5.0, pango-0.12.4, pango-0.12.3, pango-0.12.2, pango-0.12.1,
pango-0.12.0, pango-0.11.2, pango-0.11.1, pango-0.11.0 (conflict: pkg-config
package pango>=1.0, not found in the pkg-config database)
[__0] fail (backjumping, conflict set: pango)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: pango (29)

Expected behavior

Packages with pkg-config dependencies, such as Pango, work.

System information

% lsb_release -d
Description:	Fedora release 39 (Rawhide)
% cabal --version
cabal-install version 3.10.1.0
compiled using version 3.10.1.0 of the Cabal library 
% ghc --version
The Glorious Glasgow Haskell Compilation System, version 9.6.1
% ghcup --version
The GHCup Haskell installer, version 0.1.19.2

Additional context

@andreasabel andreasabel added the re: pkg-config Concerning pkg-config and pkgconfig-depends constraints label May 4, 2023
@Dretch
Copy link

Dretch commented May 6, 2023

I have worked around this issue for my use case by wrapping pkg-config with a script that fails when given more than one argument, so triggering the fallback code path in cabal that calls pkg-config once for each package:

#!/bin/bash
# workaround https://github.com/haskell/cabal/issues/8923 by making pkg-config fail
# when given more than one package, instead of silently using only the first package 
mkdir -p pkg-config-hack
cat <<'EOF' > pkg-config-hack/pkg-config
#!/bin/bash
if [ "$1" == "--modversion" ] && [ "$2" != "" ] && [ "$3" != "" ]; then
  exit 1
fi
exec /usr/bin/pkg-config $@
EOF
chmod +x pkg-config-hack/pkg-config
export PATH=$(pwd)/pkg-config-hack:$PATH

@juhp
Copy link
Collaborator

juhp commented Jul 7, 2023

(I believe this was actually caused by a change of behavior of pkgconf-1.9 relative to 1.8 which still supported outputting many package versions (though admittedly that use-case feature made less sense.)

@juhp
Copy link
Collaborator

juhp commented Jul 7, 2023

I think the safest would be just to run pkgconf individually on each pkg always?
(though reading all pkgs makes less sense anyway)

@juhp
Copy link
Collaborator

juhp commented Nov 3, 2023

Fortunately the behavior seems reverted in pkgconf-2.0, but many distros are still on 1.8 or 1.9...

@juhp
Copy link
Collaborator

juhp commented Nov 3, 2023

As a first step I applied this simple patch to Fedora cabal-install-3.8.1 - if anyone else wants this.

juhp added a commit to juhp/cabal that referenced this issue Nov 6, 2023
Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes haskell#8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)
juhp added a commit to juhp/cabal that referenced this issue Nov 19, 2023
Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes haskell#8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)
juhp added a commit to juhp/cabal that referenced this issue Nov 19, 2023
Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes haskell#8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)
Mikolaj pushed a commit to juhp/cabal that referenced this issue Nov 23, 2023
Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes haskell#8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)
Mikolaj pushed a commit to juhp/cabal that referenced this issue Nov 23, 2023
Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes haskell#8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)
@mergify mergify bot closed this as completed in #9391 Nov 23, 2023
julialongtin pushed a commit that referenced this issue Dec 2, 2023
Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes #8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)
mergify bot added a commit that referenced this issue Dec 2, 2023
…ange only. (#9386)

* add more breadcrumbs for how to use remote packages.

* Hackage should be capitalized

* Update doc/cabal-project.rst

reword.

* Update doc/cabal-project.rst

reword.

* Update doc/cabal-project.rst

clearer.

* Update doc/cabal-project.rst

clearer!

* Update doc/cabal-project.rst

good mechanical description.

* wrap.

* Update doc/cabal-project.rst

add missing double ticks.

* clarify english, and follow a linguistic pattern better.

* Update doc/cabal-project.rst

* doc: render math with HTML to make it selectable (fix #8453) (#9361)

* doc: render math with HTML to make it selectable (fix #8453)

* Update doc/conf.py

Co-authored-by: Bryan Richter <bryan@haskell.foundation>

---------

Co-authored-by: Bryan Richter <bryan@haskell.foundation>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Avoid double space in "Executing install plan ..."

* Add a change log entry for double space avoidance

* Ignore CmmSourcesExe Demo

Ignore because it warns about missing MachDeps.h

* [cabal-7825] Implement external command system

Fix #2349 and #7825

* Bump to latest dependencies for GHC 9.8.1

* cabal.project: clean out obsolete `allow-newer`s

* update GH validate workflow to ghc 9.2.8, 9.4.7, 9.6.3

* Revert #3639 (Don't pass -package-db and -package flags to --abi-hash) (#9384)

* Revert #3639 (Don't pass -package-db and -package flags to --abi-hash)

With ghc>=9.6 `ghc --abi-hash` initialises the plugins so it will fail
if a cabal file specifies `ghc-options: -fplugin=Foo`.

Closes: #9375

* Also revert in GHC.hs

---------

Co-authored-by: Hamish Mackenzie <Hamish.K.Mackenzie@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Use the newer haskell-actions organisation

* Restructure Cabal documentation top-level parts

The goal is for users to easier find pages for typical problems through search engines and page navigation.
- The top-level layout is based on the popular documentation structure by https://documentation.divio.com/ to give a
   clear structure to users and future documentation contributors:
  * Guides: Present a solution to a single, atomic, typical user problem.
  * Reference: Describe user API (CLI fields, syntax etc) with technical rigour and completeness.
  * Explanation: Discuss background information, scope, design decisions etc.
- Move existing documentation roughly into these categories with minimal editing as the basis for further editing.
- Rename guide titles to mention how-to for improving SEO.
- Rename some files to improve SEO since that name becomes part of the URL (often called slug).
  Important page keywords should appear in the slug as well to make pages rank higher in search engines.

* Rename master_doc to root_doc (changed in version 4.0 of Sphynx)

* Add instance Ord for Field, FieldLine, SectionArg and Name

* Do not run CI for documentation changes

The github workflows are not run if the
changes are completely contained within
the doc/ subdirectory. The only exception
is the users-guide.yml github action.

* Move Backpack section to user guides

* Remove TBW virtual modules section

* Add reinstall test to LinkerOptions/NonignoredConfigs

* Record install options

* Reject index-states after last known index-state (#8944)

Co-authored-by: Javier Sagredo <jasataco@gmail.com>
Co-authored-by: Andrea Bedini <andrea.bedini@tweag.io>
Co-authored-by: Andrea Bedini <andrea@andreabedini.com>

* Note how to do "not equal" with constraints

* Use comma with then

Co-authored-by: Artem Pelenitsyn <a.pelenitsyn@gmail.com>

* Use narrow rather than upset

* Say something about hackage deprecations

* Fix AutogenModulesToggling test

By converting this to a setupTest we use the in-tree Cabal library
rather than relying on a proxy of the GHC version to provide the right
Cabal library version.

Supersedes #9398

* Require version 3,11 of Cabal to support --semaphore flag

Fixes #9197

* Add dependencies used by `PackageTests` to exe:cabal-tests

The runner allows the tests to use extra dependencies and the custom Prelude
from 'cabal-testsuite'.
However, if the tests use a dependency, say 'directory', and there are two
packages with the same unit id available in the store, the test fails since
it doesn't know which one to pick.
By including an extra dependency to directory, we force the test runner to
use a specific version directory, fixing the test failure.

* Use Paths_cabal_install for cabal-install version number (#9421)

* Use PackageInfo for cabal-install version number

* Use Paths_cabal_install instead

* Adjust documentation

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Document --profiling-detail in setup-commands.

Fixes #9182

* Add test requirement to PR template

Adding test becomes a checkmark instead of “bonus points”.

* A 'cabal path' command. (#8879)

* Add a 'cabal path' command.

* Formatting fix.

* Another formatting fix.

* Categorise "cabal path" as global command.

* Allow individual paths to be printed.

* Less duplication.

* Add config-file to "cabal path".

* Use sum type instead of strings.

* cabal path: support --installdir.

* Add documentation.

* Better text.

* Formatting.

* Add some tests.

* Improve tests.

* Add changelog entry.

* Mention "cabal path" in directory documentation.

---------

Co-authored-by: Artem Pelenitsyn <a.pelenitsyn@gmail.com>

* Reimplement `cabal check` (#8427)

* Fix Semigroup target instance

When two target names are the same, `mappend`ing them should not
error but just pick the first name.

* Add `desugarBuildToolSimple`

* Reimplement cabal check

* Reorder test output

* Fix autogen modules tests .cabal files

* Add a number of tests

* Add test for #7423

i.e. Do not warn on -O2 if under off-by-default package configuration
flag conditional.

* Add a regression for:

    * Add another -WErrr test
        This is to make sure we do *not* report it if it is under
        a user, off-by-default flag.
    * Add test for non manual user flags.
    * Add “absolute path in extra-lib-dirs” test
    * Add if/else test
    * Add “dircheck on abspath” check
    * Add Package version internal test
    * Add PackageVersionsStraddle test

* Add changelog for #8427

* Integrate various reviews

* Integrate Artem’s review

(review) Clarify `combineNames` documentation

By explaining the way it operates (working if the two names are equal
or one is empty) and renaming the function from `combineName` to
`combineNames`.

(review) Use guards instead of if/then/else

(review) Match inside argument list

(review) Replace “white” with “allow”

(review) Fix typo in comment

(review) Fix typo in Check module documentation

(review) Harmonise indentation for `data` decls

First field goes in a new line than the data constructor, so we
have more space.

(review) Rename `Prim` module to `Types`

(review) Add checkPackageFilesGPD

`checkPackageFiles` — which works on PD — was used to perform IO. We
introduce a function that does the same thing but works on GPD (which
is more principled).

`checkPackageFiles` cannot just be removed, since it is part of the
interface of Distribution.PackageDescription.Check. Deprecation can
be planned once “new check” is up and running.

* Integrate Andreas’ review

(review) Add named section to missing upper bound check

“miss upper bound” checks will now list target type and name (“On
executable 'myexe', these packages miss upper bounds”) for easier
fixing by the user.

(review) remove `cabal gen-bounds` suggestion

Reasonable as `cabal gen-bounds` is stricter than `cabal check`, see
#8427 (comment)
Once `gen-bounds` behaves in line with `check` we can readd the
suggestion.

(review) Do not warn on shared bounds

When a target which depends on an internal library shares some
dependencies with the latter, do not warn on upper bounds.

An example is clearer

    library
     build-depends: text < 5
    ⁝
     build-depends: myPackage,        ← no warning, internal
                    text,             ← no warning, shared bound
                    monadacme         ← warning!

* Integrate Artem’s review /II

(review) Split Check.hs

Check.hs has been split in multiple file, each une sub 1000 lines:

Check              857 lines
Check.Common       147 lines
Check.Conditional  204 lines
Check.Monad        352 lines
Check.Paths        387 lines
Check.Target       765 lines
Check.Warning      865 lines

Migration guide:
- Check              GPD/PD checks plus work-tree checks.
- Check.Common       common types and functions that are
                     *not* part of monadic checking setup.
- Check.Conditional  checks on CondTree and related matter
                     (variables, duplicate modules).
- Check.Monad        Backbone of the checks, monadic inter-
                     face and related functions.
- Check.Paths        Checks on files, directories, globs.
- Check.Target       Checks on realised targets (libraries,
                     executables, benchmarks, testsuites).
- Check.Warning      Datatypes and strings for warnings
                     and severities.

(review) remove useless section header

(review) Fix typo

(review) Add warnings documentation (list)

For each warning, we document constructor/brief description
in the manual.  This might not be much useful as not but it
will come handy when introducing `--ignore=WARN` and similar
flags.

* (review Andreas) Clarify CheckExplanation comment

Whoever modifies `CheckExplanation` data constructors needs to be
aware that the documentation in  doc/cabal-commands.rst  has to be
updated too.

* Move internal Check modules to `other-modules`

No need to expose Distribution.PackageDescription.Check.*
to the world. API for checking, for cabal-install and other
tools, should be in Distribution.PackageDescription.Check.

* Make fourmolu happy

Cabal codebase has now a formatter/style standard (see #8950).

“Ravioli ravioli, give me the formuoli”

* Do not check for OptO in scripts

See #8963 for reason and clarification requests.

* Remove useless PackageId parameter

It is now in the Reader part of CheckM monad.

* Do not check PVP on internal targets

Internal: testsuite, benchmark.
See #8361.

* Make hlint happy

* Fix #9122

When checking internal version ranges, we need to make sure we
are not mistaking a libraries with the same name but from different
packages. See #9132.

* Fix grammar

neither…nor, completing what done in #9162

* Integrate Brandon’s review: grammar

* Remove unnecessary `-fvia-C` check

Brandon’s review/II.

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* ci: Enable windows tests for 9.6.3

There were two failing tests:

1. CCompilerOverride, was attempting to use gcc.exe rather than
   clang.exe without also overriding the C options which led to
   incorrect options being passed to gcc.exe. The fix is to override to
   clang.exe on ghc-9.4 or newer.
2. ForeignLibs exposes a bug in GHC
   (https://gitlab.haskell.org/ghc/ghc/-/issues/24185) and hence is
   skipped for GHCs newer than 9.4 where it was first introduced.

Towards fixing #8451, we just need to fix the shared library issue now.

* testsuite: Be explicit about runtime test dependencies

Issue #8356 reports occasional errors from running the testsuite about
multiple package versions available. This stems from the invokation of
`runghc` not being explicit about all dependencies of the testsuite.

The solution is provide a component in the cabal file which is explicit
about which packages the tests can depend on. This component has a
build-depends section which lists all the dependencies that the tests
require.

It would be better if this component was a library component but we
can't do this with a Custom setup because of limitations to do with
per-component builds.

Then we also enable `-hide-all-packages`, so the dependency will not be
available if it is not explicitly listed as a dependency.

You could also imagine a future where the Setup.hs script found the test
files and compiled a single executable which would run all the tests,
rather than invoking runghc on each one individually.

Fixes #8356

* hurd: Enable using $ORIGIN in RPATH

GNU/Hurd fully supports RPATH and the $ORIGIN development, and we indeed
want to use it for relocatable installations shipped in Debian GNU/Hurd.

* Fix the platform string for GNU/Hurd

Since version 9.4.7-1, ghc fails to build on the GNU/Hurd port of Debian,
see

https://buildd.debian.org/status/fetch.php?pkg=ghc&arch=hurd-i386&ver=9.4.7-1&stamp=1697717885&raw=0

Error, rule finished running but did not produce file:
  _build/stage0/lib/i386-gnu-ghc-9.4.6/ghc-boot-th-9.4.7/libHSghc-boot-th-9.4.7.a

and indeed, what did get produce was rather
_build/stage0/lib/i386-hurd-ghc-9.4.6/ghc-boot-th-9.4.7/libHSghc-boot-th-9.4.7.a
(i386-hurd instead of i386-gnu).

This is due to confusion between hurd and gnu in various places.  Apparently
previous versions of ghc were using gnu for the GNU/Hurd port, and thus
putting libraries etc. in i386-gnu. So we have to follow the existing
practice.

* Fix configuation of ldProgram

Standard GNU `ld` ues `--relocatable` while `ld.gold` uses a `-relocatable`
flag (with a single `-`). Code will now detect both versions.

* Chain configuration of ldProgram

`ldProgram` gets configured in two places, a seemingly default and
a GHC specific version. The later needs to be updated so that it
first calls the default configuration and then the new GHC version.

* Use linker capability detection to improve linker use

The function `comperSupportsGhciLibs` has been renamed to
`linkerSupportsGhciLibs` because its about the linker not the compiler.

The function `comperSupportsGhciLibs` was using the compiler version
as a proxy for whether the linker supports relocatable objects. Now
support for relocatable objects is detected by running the linker.

* add `merge+no rebase`

and a few typos while reviewing

* Add support for 64-bit SPARC as a separate architecture

Previously, sparc64 was defined as an alias for the 32-bit SPARC
architecture which was true while SPARC mainland was mostly 32
bits. More recently, 64-bit SPARC has become a port of its own,
so it needs to be treated as a separate architecture.

* Remove debug-conflict-sets flag from solver package

Fixes #8937.

The debug-conflict-sets build flag probably hasn't been used for a long time,
and it isn't currently tested. This commit removes the flag, converts the
ConflictSet type back to a newtype, and removes an unnecessary instance.

* Finish improvements to the CI configuration for documentation changes (#9460)

* Add bootstrap postjob to CI config

Add a new job to the bootstrap.yml GitHub action config.
This job succeeds if, and only if, all the other bootstrap
jobs succeed.

* Do not run bootstrap CI jobs for documentation changes

The approach was already introduced in #9355 for the validate jobs.
This commit introduces the same change also for the bootstrap jobs.

* Also ignore CONTRIBUTING.md and README.md in CI

We do not run the entire CI suite for documentation changes.
Previously, only changes which were restricted to the 'docs/'
subdirectory were considered to be documentation changes.
With this commit we also recognize changes to README.md and
CONTRIBUTING.md as documentation changes.

* Document improved CI for documentation in CONTRIBUTING.md

The CONTRIBUTING.md file now mentions that documentation changes
do not waste expensive CI resources.

* Recognize all README.md in subdirs as documentation

Expensive CI jobs should not run on changes which affect only
README.md files.

* formatting: Add style-commit makefile target

This target allows you to format a range of commits, for example:

```
make style-commit COMMIT=HEAD~1
> Last commit is formatted
make style-commit COMMIT=abcde
> Commits between HEAD and abcde are formatted
```

* Fix assertion failure when combining build-tool-depends and --enable-documentation

The `setDocumentation` function was modifying the elaborated package
after the hash was computed. This led to the assertion failing as the
computed hash was different to what was computed in the initial install
plan.

Therefore in order to fix this we either needed to:

1. Set elabBuildHaddocks = False at the point where the hash is
   initially computed.
2. Verify that elabBuildHaddocks = True will not lead to unexpected
   results.

The latter has been implemented.

The elabBuildHaddocks option is only consulted in
`hasValidHaddockTargets`, at which point documentation building the
executable component is disabled because elabHaddockExecutables is
False.

In the added test we ensure this by checking that we didn't build
documentation for the executable which is built because of
build-tool-depends.

Fixes #6006 #8313

* testsuite: Improve error message in findDependencyInStore

* Only move code to Simple/GHC/Build*

* CPP mingw32_HOST_OS for more imports

* cabal-install-solver: fix pkgconf 1.9 --modversion regression

Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes #8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)

* External commands: Add tests for #9402 #9403 #9404

This adds 4 tests which test the new external commands feature:

* ExternalCommand - Tests the expected usage of external command invoked
  via cabal-install
* ExternalCommandSetup - Tests that the ./Setup interface does not
  support external commands (#9403)
* ExternalCommandEnv - Tests that environment variables are set and
  preserved appropiately  (#9402)
* ExternalCommandHelp - Test that `cabal help <cmd>` is interpreted appropiately (#9404)

* Finish off the external commands feature

* Remove 'CommandDelegate' in favour of abstracting the fallback in
  'commandsRun', there is a new variant 'commdandRunWithFallback' which
  takes a continuation
  - This restores the modularity between the `Cabal` library and
    `cabal-install` as now `Cabal` doesn't need to know anything about
    the external command interface.
  - Fixes #9403
* Set the $CABAL environment variable to the current executable path
  - This allows external commands to be implemented by calling $CABAL,
    which is strongly preferred to linking against the Cabal library as
    there is no easy way to guantee your tool and `cabal-install` link
    against the same `Cabal` library.
  - Fixes #9402
* Pass the name of the argument
  - This allows external commands to be implemented as symlinks to an
    executable, and multiple commands can be interpreted by the same
    executable.
  - Fixes #9405
* `cabal help <cmd>` is interpreted as `cabal-<cmd> --help` for external
  commands.
  - This allows the `help` command to also work for external
  commands and hence they are better integrated into cabal-install.
  - Fixes #9404

The tests are updated to test all these additions.

These features bring the external command interface up to par with the
cargo external command interface.

* Use Base16 hash for script path.

Issue #9334 shows that `%` characters on Windows result in invalid
paths, also `/` characters on Linux create invalid paths.

This changes from using base64 to using base16 with the same length
we use for unit-ids.

* Migrate to haskell-actions/setup

As of 2023-09-09, haskell/action/setup is no longer maintained.

The comment

  # latest is mandatory for cabal-testsuite, see #8133

is removed; as the validate job was already fixing a version of cabal-install.

* testsuite: Introduce Cabal-tests library for common testsuite functions

I noticed that Distribution.Utils.TempTestDir was only used in the
testsuite but defined in the Cabal library. Rather than expose this in
the public interface of the `Cabal` library, it is cleaner to refactor
it into a separate library (`Cabal-tests`) which can be used by any
testsuite component.

Also, in future it gives a clearer place to put utility functions which
need to be shared across the testsuite but not exposed in Cabal.
Cabal-tests can also freely add dependencies (such as exceptions) which
we might want to avoid adding to the Cabal library.

Fixes #9453

* GHC 9.8 compat: pacify -Wx-partial

* GHC 9.8 compat: update hashes of data structures as computed by Structured

It seems, GHC 9.8 changed something in the code generation for data types.
Structured class is supposed to catch such cases.

* GHC 9.8 compat: bump base, update Unknown GHC

And bump Cabal's "supported version" of GHC

* CI: GHC 9.8

* merge master

* Hackage should be capitalized

---------

Co-authored-by: Artem Pelenitsyn <a.pelenitsyn@gmail.com>
Co-authored-by: Bryan Richter <bryan@haskell.foundation>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: Phil de Joux <philderbeast@gmail.com>
Co-authored-by: Yvan Sraka <yvan@sraka.xyz>
Co-authored-by: Andreas Abel <andreas.abel@ifi.lmu.de>
Co-authored-by: Jens Petersen <petersen@redhat.com>
Co-authored-by: Andrea Bedini <andrea.bedini@tweag.io>
Co-authored-by: Hamish Mackenzie <Hamish.K.Mackenzie@gmail.com>
Co-authored-by: Malte Neuss <malteneuss@users.noreply.github.com>
Co-authored-by: Bodigrim <andrew.lelechenko@gmail.com>
Co-authored-by: David Binder <david.binder@uni-tuebingen.de>
Co-authored-by: David Binder <binderd@informatik.uni-tuebingen.de>
Co-authored-by: Javier Sagredo <jasataco@gmail.com>
Co-authored-by: Andrea Bedini <andrea@andreabedini.com>
Co-authored-by: Matthew Pickering <matthewtpickering@gmail.com>
Co-authored-by: Fendor <power.walross@gmail.com>
Co-authored-by: Hécate Moonlight <Kleidukos@users.noreply.github.com>
Co-authored-by: Andreas Klebinger <klebinger.andreas@gmx.at>
Co-authored-by: Francesco Ariis <fa-ml@ariis.it>
Co-authored-by: Troels Henriksen <athas@sigkill.dk>
Co-authored-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Co-authored-by: Erik de Castro Lopo <erikd@mega-nerd.com>
Co-authored-by: brandon s allbery kf8nh <allbery.b@gmail.com>
Co-authored-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Co-authored-by: Kristen Kozak <grayjay@wordroute.com>
Co-authored-by: Javier Sagredo <javier.sagredo@iohk.io>
alt-romes pushed a commit to alt-romes/cabal that referenced this issue Dec 4, 2023
Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes haskell#8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)
alt-romes pushed a commit to alt-romes/cabal that referenced this issue Dec 4, 2023
…ange only. (haskell#9386)

* add more breadcrumbs for how to use remote packages.

* Hackage should be capitalized

* Update doc/cabal-project.rst

reword.

* Update doc/cabal-project.rst

reword.

* Update doc/cabal-project.rst

clearer.

* Update doc/cabal-project.rst

clearer!

* Update doc/cabal-project.rst

good mechanical description.

* wrap.

* Update doc/cabal-project.rst

add missing double ticks.

* clarify english, and follow a linguistic pattern better.

* Update doc/cabal-project.rst

* doc: render math with HTML to make it selectable (fix haskell#8453) (haskell#9361)

* doc: render math with HTML to make it selectable (fix haskell#8453)

* Update doc/conf.py

Co-authored-by: Bryan Richter <bryan@haskell.foundation>

---------

Co-authored-by: Bryan Richter <bryan@haskell.foundation>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Avoid double space in "Executing install plan ..."

* Add a change log entry for double space avoidance

* Ignore CmmSourcesExe Demo

Ignore because it warns about missing MachDeps.h

* [cabal-7825] Implement external command system

Fix haskell#2349 and haskell#7825

* Bump to latest dependencies for GHC 9.8.1

* cabal.project: clean out obsolete `allow-newer`s

* update GH validate workflow to ghc 9.2.8, 9.4.7, 9.6.3

* Revert haskell#3639 (Don't pass -package-db and -package flags to --abi-hash) (haskell#9384)

* Revert haskell#3639 (Don't pass -package-db and -package flags to --abi-hash)

With ghc>=9.6 `ghc --abi-hash` initialises the plugins so it will fail
if a cabal file specifies `ghc-options: -fplugin=Foo`.

Closes: haskell#9375

* Also revert in GHC.hs

---------

Co-authored-by: Hamish Mackenzie <Hamish.K.Mackenzie@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Use the newer haskell-actions organisation

* Restructure Cabal documentation top-level parts

The goal is for users to easier find pages for typical problems through search engines and page navigation.
- The top-level layout is based on the popular documentation structure by https://documentation.divio.com/ to give a
   clear structure to users and future documentation contributors:
  * Guides: Present a solution to a single, atomic, typical user problem.
  * Reference: Describe user API (CLI fields, syntax etc) with technical rigour and completeness.
  * Explanation: Discuss background information, scope, design decisions etc.
- Move existing documentation roughly into these categories with minimal editing as the basis for further editing.
- Rename guide titles to mention how-to for improving SEO.
- Rename some files to improve SEO since that name becomes part of the URL (often called slug).
  Important page keywords should appear in the slug as well to make pages rank higher in search engines.

* Rename master_doc to root_doc (changed in version 4.0 of Sphynx)

* Add instance Ord for Field, FieldLine, SectionArg and Name

* Do not run CI for documentation changes

The github workflows are not run if the
changes are completely contained within
the doc/ subdirectory. The only exception
is the users-guide.yml github action.

* Move Backpack section to user guides

* Remove TBW virtual modules section

* Add reinstall test to LinkerOptions/NonignoredConfigs

* Record install options

* Reject index-states after last known index-state (haskell#8944)

Co-authored-by: Javier Sagredo <jasataco@gmail.com>
Co-authored-by: Andrea Bedini <andrea.bedini@tweag.io>
Co-authored-by: Andrea Bedini <andrea@andreabedini.com>

* Note how to do "not equal" with constraints

* Use comma with then

Co-authored-by: Artem Pelenitsyn <a.pelenitsyn@gmail.com>

* Use narrow rather than upset

* Say something about hackage deprecations

* Fix AutogenModulesToggling test

By converting this to a setupTest we use the in-tree Cabal library
rather than relying on a proxy of the GHC version to provide the right
Cabal library version.

Supersedes haskell#9398

* Require version 3,11 of Cabal to support --semaphore flag

Fixes haskell#9197

* Add dependencies used by `PackageTests` to exe:cabal-tests

The runner allows the tests to use extra dependencies and the custom Prelude
from 'cabal-testsuite'.
However, if the tests use a dependency, say 'directory', and there are two
packages with the same unit id available in the store, the test fails since
it doesn't know which one to pick.
By including an extra dependency to directory, we force the test runner to
use a specific version directory, fixing the test failure.

* Use Paths_cabal_install for cabal-install version number (haskell#9421)

* Use PackageInfo for cabal-install version number

* Use Paths_cabal_install instead

* Adjust documentation

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Document --profiling-detail in setup-commands.

Fixes haskell#9182

* Add test requirement to PR template

Adding test becomes a checkmark instead of “bonus points”.

* A 'cabal path' command. (haskell#8879)

* Add a 'cabal path' command.

* Formatting fix.

* Another formatting fix.

* Categorise "cabal path" as global command.

* Allow individual paths to be printed.

* Less duplication.

* Add config-file to "cabal path".

* Use sum type instead of strings.

* cabal path: support --installdir.

* Add documentation.

* Better text.

* Formatting.

* Add some tests.

* Improve tests.

* Add changelog entry.

* Mention "cabal path" in directory documentation.

---------

Co-authored-by: Artem Pelenitsyn <a.pelenitsyn@gmail.com>

* Reimplement `cabal check` (haskell#8427)

* Fix Semigroup target instance

When two target names are the same, `mappend`ing them should not
error but just pick the first name.

* Add `desugarBuildToolSimple`

* Reimplement cabal check

* Reorder test output

* Fix autogen modules tests .cabal files

* Add a number of tests

* Add test for haskell#7423

i.e. Do not warn on -O2 if under off-by-default package configuration
flag conditional.

* Add a regression for:

    * Add another -WErrr test
        This is to make sure we do *not* report it if it is under
        a user, off-by-default flag.
    * Add test for non manual user flags.
    * Add “absolute path in extra-lib-dirs” test
    * Add if/else test
    * Add “dircheck on abspath” check
    * Add Package version internal test
    * Add PackageVersionsStraddle test

* Add changelog for haskell#8427

* Integrate various reviews

* Integrate Artem’s review

(review) Clarify `combineNames` documentation

By explaining the way it operates (working if the two names are equal
or one is empty) and renaming the function from `combineName` to
`combineNames`.

(review) Use guards instead of if/then/else

(review) Match inside argument list

(review) Replace “white” with “allow”

(review) Fix typo in comment

(review) Fix typo in Check module documentation

(review) Harmonise indentation for `data` decls

First field goes in a new line than the data constructor, so we
have more space.

(review) Rename `Prim` module to `Types`

(review) Add checkPackageFilesGPD

`checkPackageFiles` — which works on PD — was used to perform IO. We
introduce a function that does the same thing but works on GPD (which
is more principled).

`checkPackageFiles` cannot just be removed, since it is part of the
interface of Distribution.PackageDescription.Check. Deprecation can
be planned once “new check” is up and running.

* Integrate Andreas’ review

(review) Add named section to missing upper bound check

“miss upper bound” checks will now list target type and name (“On
executable 'myexe', these packages miss upper bounds”) for easier
fixing by the user.

(review) remove `cabal gen-bounds` suggestion

Reasonable as `cabal gen-bounds` is stricter than `cabal check`, see
haskell#8427 (comment)
Once `gen-bounds` behaves in line with `check` we can readd the
suggestion.

(review) Do not warn on shared bounds

When a target which depends on an internal library shares some
dependencies with the latter, do not warn on upper bounds.

An example is clearer

    library
     build-depends: text < 5
    ⁝
     build-depends: myPackage,        ← no warning, internal
                    text,             ← no warning, shared bound
                    monadacme         ← warning!

* Integrate Artem’s review /II

(review) Split Check.hs

Check.hs has been split in multiple file, each une sub 1000 lines:

Check              857 lines
Check.Common       147 lines
Check.Conditional  204 lines
Check.Monad        352 lines
Check.Paths        387 lines
Check.Target       765 lines
Check.Warning      865 lines

Migration guide:
- Check              GPD/PD checks plus work-tree checks.
- Check.Common       common types and functions that are
                     *not* part of monadic checking setup.
- Check.Conditional  checks on CondTree and related matter
                     (variables, duplicate modules).
- Check.Monad        Backbone of the checks, monadic inter-
                     face and related functions.
- Check.Paths        Checks on files, directories, globs.
- Check.Target       Checks on realised targets (libraries,
                     executables, benchmarks, testsuites).
- Check.Warning      Datatypes and strings for warnings
                     and severities.

(review) remove useless section header

(review) Fix typo

(review) Add warnings documentation (list)

For each warning, we document constructor/brief description
in the manual.  This might not be much useful as not but it
will come handy when introducing `--ignore=WARN` and similar
flags.

* (review Andreas) Clarify CheckExplanation comment

Whoever modifies `CheckExplanation` data constructors needs to be
aware that the documentation in  doc/cabal-commands.rst  has to be
updated too.

* Move internal Check modules to `other-modules`

No need to expose Distribution.PackageDescription.Check.*
to the world. API for checking, for cabal-install and other
tools, should be in Distribution.PackageDescription.Check.

* Make fourmolu happy

Cabal codebase has now a formatter/style standard (see haskell#8950).

“Ravioli ravioli, give me the formuoli”

* Do not check for OptO in scripts

See haskell#8963 for reason and clarification requests.

* Remove useless PackageId parameter

It is now in the Reader part of CheckM monad.

* Do not check PVP on internal targets

Internal: testsuite, benchmark.
See haskell#8361.

* Make hlint happy

* Fix haskell#9122

When checking internal version ranges, we need to make sure we
are not mistaking a libraries with the same name but from different
packages. See haskell#9132.

* Fix grammar

neither…nor, completing what done in haskell#9162

* Integrate Brandon’s review: grammar

* Remove unnecessary `-fvia-C` check

Brandon’s review/II.

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* ci: Enable windows tests for 9.6.3

There were two failing tests:

1. CCompilerOverride, was attempting to use gcc.exe rather than
   clang.exe without also overriding the C options which led to
   incorrect options being passed to gcc.exe. The fix is to override to
   clang.exe on ghc-9.4 or newer.
2. ForeignLibs exposes a bug in GHC
   (https://gitlab.haskell.org/ghc/ghc/-/issues/24185) and hence is
   skipped for GHCs newer than 9.4 where it was first introduced.

Towards fixing haskell#8451, we just need to fix the shared library issue now.

* testsuite: Be explicit about runtime test dependencies

Issue haskell#8356 reports occasional errors from running the testsuite about
multiple package versions available. This stems from the invokation of
`runghc` not being explicit about all dependencies of the testsuite.

The solution is provide a component in the cabal file which is explicit
about which packages the tests can depend on. This component has a
build-depends section which lists all the dependencies that the tests
require.

It would be better if this component was a library component but we
can't do this with a Custom setup because of limitations to do with
per-component builds.

Then we also enable `-hide-all-packages`, so the dependency will not be
available if it is not explicitly listed as a dependency.

You could also imagine a future where the Setup.hs script found the test
files and compiled a single executable which would run all the tests,
rather than invoking runghc on each one individually.

Fixes haskell#8356

* hurd: Enable using $ORIGIN in RPATH

GNU/Hurd fully supports RPATH and the $ORIGIN development, and we indeed
want to use it for relocatable installations shipped in Debian GNU/Hurd.

* Fix the platform string for GNU/Hurd

Since version 9.4.7-1, ghc fails to build on the GNU/Hurd port of Debian,
see

https://buildd.debian.org/status/fetch.php?pkg=ghc&arch=hurd-i386&ver=9.4.7-1&stamp=1697717885&raw=0

Error, rule finished running but did not produce file:
  _build/stage0/lib/i386-gnu-ghc-9.4.6/ghc-boot-th-9.4.7/libHSghc-boot-th-9.4.7.a

and indeed, what did get produce was rather
_build/stage0/lib/i386-hurd-ghc-9.4.6/ghc-boot-th-9.4.7/libHSghc-boot-th-9.4.7.a
(i386-hurd instead of i386-gnu).

This is due to confusion between hurd and gnu in various places.  Apparently
previous versions of ghc were using gnu for the GNU/Hurd port, and thus
putting libraries etc. in i386-gnu. So we have to follow the existing
practice.

* Fix configuation of ldProgram

Standard GNU `ld` ues `--relocatable` while `ld.gold` uses a `-relocatable`
flag (with a single `-`). Code will now detect both versions.

* Chain configuration of ldProgram

`ldProgram` gets configured in two places, a seemingly default and
a GHC specific version. The later needs to be updated so that it
first calls the default configuration and then the new GHC version.

* Use linker capability detection to improve linker use

The function `comperSupportsGhciLibs` has been renamed to
`linkerSupportsGhciLibs` because its about the linker not the compiler.

The function `comperSupportsGhciLibs` was using the compiler version
as a proxy for whether the linker supports relocatable objects. Now
support for relocatable objects is detected by running the linker.

* add `merge+no rebase`

and a few typos while reviewing

* Add support for 64-bit SPARC as a separate architecture

Previously, sparc64 was defined as an alias for the 32-bit SPARC
architecture which was true while SPARC mainland was mostly 32
bits. More recently, 64-bit SPARC has become a port of its own,
so it needs to be treated as a separate architecture.

* Remove debug-conflict-sets flag from solver package

Fixes haskell#8937.

The debug-conflict-sets build flag probably hasn't been used for a long time,
and it isn't currently tested. This commit removes the flag, converts the
ConflictSet type back to a newtype, and removes an unnecessary instance.

* Finish improvements to the CI configuration for documentation changes (haskell#9460)

* Add bootstrap postjob to CI config

Add a new job to the bootstrap.yml GitHub action config.
This job succeeds if, and only if, all the other bootstrap
jobs succeed.

* Do not run bootstrap CI jobs for documentation changes

The approach was already introduced in haskell#9355 for the validate jobs.
This commit introduces the same change also for the bootstrap jobs.

* Also ignore CONTRIBUTING.md and README.md in CI

We do not run the entire CI suite for documentation changes.
Previously, only changes which were restricted to the 'docs/'
subdirectory were considered to be documentation changes.
With this commit we also recognize changes to README.md and
CONTRIBUTING.md as documentation changes.

* Document improved CI for documentation in CONTRIBUTING.md

The CONTRIBUTING.md file now mentions that documentation changes
do not waste expensive CI resources.

* Recognize all README.md in subdirs as documentation

Expensive CI jobs should not run on changes which affect only
README.md files.

* formatting: Add style-commit makefile target

This target allows you to format a range of commits, for example:

```
make style-commit COMMIT=HEAD~1
> Last commit is formatted
make style-commit COMMIT=abcde
> Commits between HEAD and abcde are formatted
```

* Fix assertion failure when combining build-tool-depends and --enable-documentation

The `setDocumentation` function was modifying the elaborated package
after the hash was computed. This led to the assertion failing as the
computed hash was different to what was computed in the initial install
plan.

Therefore in order to fix this we either needed to:

1. Set elabBuildHaddocks = False at the point where the hash is
   initially computed.
2. Verify that elabBuildHaddocks = True will not lead to unexpected
   results.

The latter has been implemented.

The elabBuildHaddocks option is only consulted in
`hasValidHaddockTargets`, at which point documentation building the
executable component is disabled because elabHaddockExecutables is
False.

In the added test we ensure this by checking that we didn't build
documentation for the executable which is built because of
build-tool-depends.

Fixes haskell#6006 haskell#8313

* testsuite: Improve error message in findDependencyInStore

* Only move code to Simple/GHC/Build*

* CPP mingw32_HOST_OS for more imports

* cabal-install-solver: fix pkgconf 1.9 --modversion regression

Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes haskell#8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)

* External commands: Add tests for haskell#9402 haskell#9403 haskell#9404

This adds 4 tests which test the new external commands feature:

* ExternalCommand - Tests the expected usage of external command invoked
  via cabal-install
* ExternalCommandSetup - Tests that the ./Setup interface does not
  support external commands (haskell#9403)
* ExternalCommandEnv - Tests that environment variables are set and
  preserved appropiately  (haskell#9402)
* ExternalCommandHelp - Test that `cabal help <cmd>` is interpreted appropiately (haskell#9404)

* Finish off the external commands feature

* Remove 'CommandDelegate' in favour of abstracting the fallback in
  'commandsRun', there is a new variant 'commdandRunWithFallback' which
  takes a continuation
  - This restores the modularity between the `Cabal` library and
    `cabal-install` as now `Cabal` doesn't need to know anything about
    the external command interface.
  - Fixes haskell#9403
* Set the $CABAL environment variable to the current executable path
  - This allows external commands to be implemented by calling $CABAL,
    which is strongly preferred to linking against the Cabal library as
    there is no easy way to guantee your tool and `cabal-install` link
    against the same `Cabal` library.
  - Fixes haskell#9402
* Pass the name of the argument
  - This allows external commands to be implemented as symlinks to an
    executable, and multiple commands can be interpreted by the same
    executable.
  - Fixes haskell#9405
* `cabal help <cmd>` is interpreted as `cabal-<cmd> --help` for external
  commands.
  - This allows the `help` command to also work for external
  commands and hence they are better integrated into cabal-install.
  - Fixes haskell#9404

The tests are updated to test all these additions.

These features bring the external command interface up to par with the
cargo external command interface.

* Use Base16 hash for script path.

Issue haskell#9334 shows that `%` characters on Windows result in invalid
paths, also `/` characters on Linux create invalid paths.

This changes from using base64 to using base16 with the same length
we use for unit-ids.

* Migrate to haskell-actions/setup

As of 2023-09-09, haskell/action/setup is no longer maintained.

The comment

  # latest is mandatory for cabal-testsuite, see haskell#8133

is removed; as the validate job was already fixing a version of cabal-install.

* testsuite: Introduce Cabal-tests library for common testsuite functions

I noticed that Distribution.Utils.TempTestDir was only used in the
testsuite but defined in the Cabal library. Rather than expose this in
the public interface of the `Cabal` library, it is cleaner to refactor
it into a separate library (`Cabal-tests`) which can be used by any
testsuite component.

Also, in future it gives a clearer place to put utility functions which
need to be shared across the testsuite but not exposed in Cabal.
Cabal-tests can also freely add dependencies (such as exceptions) which
we might want to avoid adding to the Cabal library.

Fixes haskell#9453

* GHC 9.8 compat: pacify -Wx-partial

* GHC 9.8 compat: update hashes of data structures as computed by Structured

It seems, GHC 9.8 changed something in the code generation for data types.
Structured class is supposed to catch such cases.

* GHC 9.8 compat: bump base, update Unknown GHC

And bump Cabal's "supported version" of GHC

* CI: GHC 9.8

* merge master

* Hackage should be capitalized

---------

Co-authored-by: Artem Pelenitsyn <a.pelenitsyn@gmail.com>
Co-authored-by: Bryan Richter <bryan@haskell.foundation>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: Phil de Joux <philderbeast@gmail.com>
Co-authored-by: Yvan Sraka <yvan@sraka.xyz>
Co-authored-by: Andreas Abel <andreas.abel@ifi.lmu.de>
Co-authored-by: Jens Petersen <petersen@redhat.com>
Co-authored-by: Andrea Bedini <andrea.bedini@tweag.io>
Co-authored-by: Hamish Mackenzie <Hamish.K.Mackenzie@gmail.com>
Co-authored-by: Malte Neuss <malteneuss@users.noreply.github.com>
Co-authored-by: Bodigrim <andrew.lelechenko@gmail.com>
Co-authored-by: David Binder <david.binder@uni-tuebingen.de>
Co-authored-by: David Binder <binderd@informatik.uni-tuebingen.de>
Co-authored-by: Javier Sagredo <jasataco@gmail.com>
Co-authored-by: Andrea Bedini <andrea@andreabedini.com>
Co-authored-by: Matthew Pickering <matthewtpickering@gmail.com>
Co-authored-by: Fendor <power.walross@gmail.com>
Co-authored-by: Hécate Moonlight <Kleidukos@users.noreply.github.com>
Co-authored-by: Andreas Klebinger <klebinger.andreas@gmx.at>
Co-authored-by: Francesco Ariis <fa-ml@ariis.it>
Co-authored-by: Troels Henriksen <athas@sigkill.dk>
Co-authored-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Co-authored-by: Erik de Castro Lopo <erikd@mega-nerd.com>
Co-authored-by: brandon s allbery kf8nh <allbery.b@gmail.com>
Co-authored-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Co-authored-by: Kristen Kozak <grayjay@wordroute.com>
Co-authored-by: Javier Sagredo <javier.sagredo@iohk.io>
alt-romes pushed a commit to alt-romes/cabal that referenced this issue Dec 4, 2023
Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes haskell#8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)
alt-romes pushed a commit to alt-romes/cabal that referenced this issue Dec 4, 2023
…ange only. (haskell#9386)

* add more breadcrumbs for how to use remote packages.

* Hackage should be capitalized

* Update doc/cabal-project.rst

reword.

* Update doc/cabal-project.rst

reword.

* Update doc/cabal-project.rst

clearer.

* Update doc/cabal-project.rst

clearer!

* Update doc/cabal-project.rst

good mechanical description.

* wrap.

* Update doc/cabal-project.rst

add missing double ticks.

* clarify english, and follow a linguistic pattern better.

* Update doc/cabal-project.rst

* doc: render math with HTML to make it selectable (fix haskell#8453) (haskell#9361)

* doc: render math with HTML to make it selectable (fix haskell#8453)

* Update doc/conf.py

Co-authored-by: Bryan Richter <bryan@haskell.foundation>

---------

Co-authored-by: Bryan Richter <bryan@haskell.foundation>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Avoid double space in "Executing install plan ..."

* Add a change log entry for double space avoidance

* Ignore CmmSourcesExe Demo

Ignore because it warns about missing MachDeps.h

* [cabal-7825] Implement external command system

Fix haskell#2349 and haskell#7825

* Bump to latest dependencies for GHC 9.8.1

* cabal.project: clean out obsolete `allow-newer`s

* update GH validate workflow to ghc 9.2.8, 9.4.7, 9.6.3

* Revert haskell#3639 (Don't pass -package-db and -package flags to --abi-hash) (haskell#9384)

* Revert haskell#3639 (Don't pass -package-db and -package flags to --abi-hash)

With ghc>=9.6 `ghc --abi-hash` initialises the plugins so it will fail
if a cabal file specifies `ghc-options: -fplugin=Foo`.

Closes: haskell#9375

* Also revert in GHC.hs

---------

Co-authored-by: Hamish Mackenzie <Hamish.K.Mackenzie@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Use the newer haskell-actions organisation

* Restructure Cabal documentation top-level parts

The goal is for users to easier find pages for typical problems through search engines and page navigation.
- The top-level layout is based on the popular documentation structure by https://documentation.divio.com/ to give a
   clear structure to users and future documentation contributors:
  * Guides: Present a solution to a single, atomic, typical user problem.
  * Reference: Describe user API (CLI fields, syntax etc) with technical rigour and completeness.
  * Explanation: Discuss background information, scope, design decisions etc.
- Move existing documentation roughly into these categories with minimal editing as the basis for further editing.
- Rename guide titles to mention how-to for improving SEO.
- Rename some files to improve SEO since that name becomes part of the URL (often called slug).
  Important page keywords should appear in the slug as well to make pages rank higher in search engines.

* Rename master_doc to root_doc (changed in version 4.0 of Sphynx)

* Add instance Ord for Field, FieldLine, SectionArg and Name

* Do not run CI for documentation changes

The github workflows are not run if the
changes are completely contained within
the doc/ subdirectory. The only exception
is the users-guide.yml github action.

* Move Backpack section to user guides

* Remove TBW virtual modules section

* Add reinstall test to LinkerOptions/NonignoredConfigs

* Record install options

* Reject index-states after last known index-state (haskell#8944)

Co-authored-by: Javier Sagredo <jasataco@gmail.com>
Co-authored-by: Andrea Bedini <andrea.bedini@tweag.io>
Co-authored-by: Andrea Bedini <andrea@andreabedini.com>

* Note how to do "not equal" with constraints

* Use comma with then

Co-authored-by: Artem Pelenitsyn <a.pelenitsyn@gmail.com>

* Use narrow rather than upset

* Say something about hackage deprecations

* Fix AutogenModulesToggling test

By converting this to a setupTest we use the in-tree Cabal library
rather than relying on a proxy of the GHC version to provide the right
Cabal library version.

Supersedes haskell#9398

* Require version 3,11 of Cabal to support --semaphore flag

Fixes haskell#9197

* Add dependencies used by `PackageTests` to exe:cabal-tests

The runner allows the tests to use extra dependencies and the custom Prelude
from 'cabal-testsuite'.
However, if the tests use a dependency, say 'directory', and there are two
packages with the same unit id available in the store, the test fails since
it doesn't know which one to pick.
By including an extra dependency to directory, we force the test runner to
use a specific version directory, fixing the test failure.

* Use Paths_cabal_install for cabal-install version number (haskell#9421)

* Use PackageInfo for cabal-install version number

* Use Paths_cabal_install instead

* Adjust documentation

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Document --profiling-detail in setup-commands.

Fixes haskell#9182

* Add test requirement to PR template

Adding test becomes a checkmark instead of “bonus points”.

* A 'cabal path' command. (haskell#8879)

* Add a 'cabal path' command.

* Formatting fix.

* Another formatting fix.

* Categorise "cabal path" as global command.

* Allow individual paths to be printed.

* Less duplication.

* Add config-file to "cabal path".

* Use sum type instead of strings.

* cabal path: support --installdir.

* Add documentation.

* Better text.

* Formatting.

* Add some tests.

* Improve tests.

* Add changelog entry.

* Mention "cabal path" in directory documentation.

---------

Co-authored-by: Artem Pelenitsyn <a.pelenitsyn@gmail.com>

* Reimplement `cabal check` (haskell#8427)

* Fix Semigroup target instance

When two target names are the same, `mappend`ing them should not
error but just pick the first name.

* Add `desugarBuildToolSimple`

* Reimplement cabal check

* Reorder test output

* Fix autogen modules tests .cabal files

* Add a number of tests

* Add test for haskell#7423

i.e. Do not warn on -O2 if under off-by-default package configuration
flag conditional.

* Add a regression for:

    * Add another -WErrr test
        This is to make sure we do *not* report it if it is under
        a user, off-by-default flag.
    * Add test for non manual user flags.
    * Add “absolute path in extra-lib-dirs” test
    * Add if/else test
    * Add “dircheck on abspath” check
    * Add Package version internal test
    * Add PackageVersionsStraddle test

* Add changelog for haskell#8427

* Integrate various reviews

* Integrate Artem’s review

(review) Clarify `combineNames` documentation

By explaining the way it operates (working if the two names are equal
or one is empty) and renaming the function from `combineName` to
`combineNames`.

(review) Use guards instead of if/then/else

(review) Match inside argument list

(review) Replace “white” with “allow”

(review) Fix typo in comment

(review) Fix typo in Check module documentation

(review) Harmonise indentation for `data` decls

First field goes in a new line than the data constructor, so we
have more space.

(review) Rename `Prim` module to `Types`

(review) Add checkPackageFilesGPD

`checkPackageFiles` — which works on PD — was used to perform IO. We
introduce a function that does the same thing but works on GPD (which
is more principled).

`checkPackageFiles` cannot just be removed, since it is part of the
interface of Distribution.PackageDescription.Check. Deprecation can
be planned once “new check” is up and running.

* Integrate Andreas’ review

(review) Add named section to missing upper bound check

“miss upper bound” checks will now list target type and name (“On
executable 'myexe', these packages miss upper bounds”) for easier
fixing by the user.

(review) remove `cabal gen-bounds` suggestion

Reasonable as `cabal gen-bounds` is stricter than `cabal check`, see
haskell#8427 (comment)
Once `gen-bounds` behaves in line with `check` we can readd the
suggestion.

(review) Do not warn on shared bounds

When a target which depends on an internal library shares some
dependencies with the latter, do not warn on upper bounds.

An example is clearer

    library
     build-depends: text < 5
    ⁝
     build-depends: myPackage,        ← no warning, internal
                    text,             ← no warning, shared bound
                    monadacme         ← warning!

* Integrate Artem’s review /II

(review) Split Check.hs

Check.hs has been split in multiple file, each une sub 1000 lines:

Check              857 lines
Check.Common       147 lines
Check.Conditional  204 lines
Check.Monad        352 lines
Check.Paths        387 lines
Check.Target       765 lines
Check.Warning      865 lines

Migration guide:
- Check              GPD/PD checks plus work-tree checks.
- Check.Common       common types and functions that are
                     *not* part of monadic checking setup.
- Check.Conditional  checks on CondTree and related matter
                     (variables, duplicate modules).
- Check.Monad        Backbone of the checks, monadic inter-
                     face and related functions.
- Check.Paths        Checks on files, directories, globs.
- Check.Target       Checks on realised targets (libraries,
                     executables, benchmarks, testsuites).
- Check.Warning      Datatypes and strings for warnings
                     and severities.

(review) remove useless section header

(review) Fix typo

(review) Add warnings documentation (list)

For each warning, we document constructor/brief description
in the manual.  This might not be much useful as not but it
will come handy when introducing `--ignore=WARN` and similar
flags.

* (review Andreas) Clarify CheckExplanation comment

Whoever modifies `CheckExplanation` data constructors needs to be
aware that the documentation in  doc/cabal-commands.rst  has to be
updated too.

* Move internal Check modules to `other-modules`

No need to expose Distribution.PackageDescription.Check.*
to the world. API for checking, for cabal-install and other
tools, should be in Distribution.PackageDescription.Check.

* Make fourmolu happy

Cabal codebase has now a formatter/style standard (see haskell#8950).

“Ravioli ravioli, give me the formuoli”

* Do not check for OptO in scripts

See haskell#8963 for reason and clarification requests.

* Remove useless PackageId parameter

It is now in the Reader part of CheckM monad.

* Do not check PVP on internal targets

Internal: testsuite, benchmark.
See haskell#8361.

* Make hlint happy

* Fix haskell#9122

When checking internal version ranges, we need to make sure we
are not mistaking a libraries with the same name but from different
packages. See haskell#9132.

* Fix grammar

neither…nor, completing what done in haskell#9162

* Integrate Brandon’s review: grammar

* Remove unnecessary `-fvia-C` check

Brandon’s review/II.

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* ci: Enable windows tests for 9.6.3

There were two failing tests:

1. CCompilerOverride, was attempting to use gcc.exe rather than
   clang.exe without also overriding the C options which led to
   incorrect options being passed to gcc.exe. The fix is to override to
   clang.exe on ghc-9.4 or newer.
2. ForeignLibs exposes a bug in GHC
   (https://gitlab.haskell.org/ghc/ghc/-/issues/24185) and hence is
   skipped for GHCs newer than 9.4 where it was first introduced.

Towards fixing haskell#8451, we just need to fix the shared library issue now.

* testsuite: Be explicit about runtime test dependencies

Issue haskell#8356 reports occasional errors from running the testsuite about
multiple package versions available. This stems from the invokation of
`runghc` not being explicit about all dependencies of the testsuite.

The solution is provide a component in the cabal file which is explicit
about which packages the tests can depend on. This component has a
build-depends section which lists all the dependencies that the tests
require.

It would be better if this component was a library component but we
can't do this with a Custom setup because of limitations to do with
per-component builds.

Then we also enable `-hide-all-packages`, so the dependency will not be
available if it is not explicitly listed as a dependency.

You could also imagine a future where the Setup.hs script found the test
files and compiled a single executable which would run all the tests,
rather than invoking runghc on each one individually.

Fixes haskell#8356

* hurd: Enable using $ORIGIN in RPATH

GNU/Hurd fully supports RPATH and the $ORIGIN development, and we indeed
want to use it for relocatable installations shipped in Debian GNU/Hurd.

* Fix the platform string for GNU/Hurd

Since version 9.4.7-1, ghc fails to build on the GNU/Hurd port of Debian,
see

https://buildd.debian.org/status/fetch.php?pkg=ghc&arch=hurd-i386&ver=9.4.7-1&stamp=1697717885&raw=0

Error, rule finished running but did not produce file:
  _build/stage0/lib/i386-gnu-ghc-9.4.6/ghc-boot-th-9.4.7/libHSghc-boot-th-9.4.7.a

and indeed, what did get produce was rather
_build/stage0/lib/i386-hurd-ghc-9.4.6/ghc-boot-th-9.4.7/libHSghc-boot-th-9.4.7.a
(i386-hurd instead of i386-gnu).

This is due to confusion between hurd and gnu in various places.  Apparently
previous versions of ghc were using gnu for the GNU/Hurd port, and thus
putting libraries etc. in i386-gnu. So we have to follow the existing
practice.

* Fix configuation of ldProgram

Standard GNU `ld` ues `--relocatable` while `ld.gold` uses a `-relocatable`
flag (with a single `-`). Code will now detect both versions.

* Chain configuration of ldProgram

`ldProgram` gets configured in two places, a seemingly default and
a GHC specific version. The later needs to be updated so that it
first calls the default configuration and then the new GHC version.

* Use linker capability detection to improve linker use

The function `comperSupportsGhciLibs` has been renamed to
`linkerSupportsGhciLibs` because its about the linker not the compiler.

The function `comperSupportsGhciLibs` was using the compiler version
as a proxy for whether the linker supports relocatable objects. Now
support for relocatable objects is detected by running the linker.

* add `merge+no rebase`

and a few typos while reviewing

* Add support for 64-bit SPARC as a separate architecture

Previously, sparc64 was defined as an alias for the 32-bit SPARC
architecture which was true while SPARC mainland was mostly 32
bits. More recently, 64-bit SPARC has become a port of its own,
so it needs to be treated as a separate architecture.

* Remove debug-conflict-sets flag from solver package

Fixes haskell#8937.

The debug-conflict-sets build flag probably hasn't been used for a long time,
and it isn't currently tested. This commit removes the flag, converts the
ConflictSet type back to a newtype, and removes an unnecessary instance.

* Finish improvements to the CI configuration for documentation changes (haskell#9460)

* Add bootstrap postjob to CI config

Add a new job to the bootstrap.yml GitHub action config.
This job succeeds if, and only if, all the other bootstrap
jobs succeed.

* Do not run bootstrap CI jobs for documentation changes

The approach was already introduced in haskell#9355 for the validate jobs.
This commit introduces the same change also for the bootstrap jobs.

* Also ignore CONTRIBUTING.md and README.md in CI

We do not run the entire CI suite for documentation changes.
Previously, only changes which were restricted to the 'docs/'
subdirectory were considered to be documentation changes.
With this commit we also recognize changes to README.md and
CONTRIBUTING.md as documentation changes.

* Document improved CI for documentation in CONTRIBUTING.md

The CONTRIBUTING.md file now mentions that documentation changes
do not waste expensive CI resources.

* Recognize all README.md in subdirs as documentation

Expensive CI jobs should not run on changes which affect only
README.md files.

* formatting: Add style-commit makefile target

This target allows you to format a range of commits, for example:

```
make style-commit COMMIT=HEAD~1
> Last commit is formatted
make style-commit COMMIT=abcde
> Commits between HEAD and abcde are formatted
```

* Fix assertion failure when combining build-tool-depends and --enable-documentation

The `setDocumentation` function was modifying the elaborated package
after the hash was computed. This led to the assertion failing as the
computed hash was different to what was computed in the initial install
plan.

Therefore in order to fix this we either needed to:

1. Set elabBuildHaddocks = False at the point where the hash is
   initially computed.
2. Verify that elabBuildHaddocks = True will not lead to unexpected
   results.

The latter has been implemented.

The elabBuildHaddocks option is only consulted in
`hasValidHaddockTargets`, at which point documentation building the
executable component is disabled because elabHaddockExecutables is
False.

In the added test we ensure this by checking that we didn't build
documentation for the executable which is built because of
build-tool-depends.

Fixes haskell#6006 haskell#8313

* testsuite: Improve error message in findDependencyInStore

* Only move code to Simple/GHC/Build*

* CPP mingw32_HOST_OS for more imports

* cabal-install-solver: fix pkgconf 1.9 --modversion regression

Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes haskell#8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)

* External commands: Add tests for haskell#9402 haskell#9403 haskell#9404

This adds 4 tests which test the new external commands feature:

* ExternalCommand - Tests the expected usage of external command invoked
  via cabal-install
* ExternalCommandSetup - Tests that the ./Setup interface does not
  support external commands (haskell#9403)
* ExternalCommandEnv - Tests that environment variables are set and
  preserved appropiately  (haskell#9402)
* ExternalCommandHelp - Test that `cabal help <cmd>` is interpreted appropiately (haskell#9404)

* Finish off the external commands feature

* Remove 'CommandDelegate' in favour of abstracting the fallback in
  'commandsRun', there is a new variant 'commdandRunWithFallback' which
  takes a continuation
  - This restores the modularity between the `Cabal` library and
    `cabal-install` as now `Cabal` doesn't need to know anything about
    the external command interface.
  - Fixes haskell#9403
* Set the $CABAL environment variable to the current executable path
  - This allows external commands to be implemented by calling $CABAL,
    which is strongly preferred to linking against the Cabal library as
    there is no easy way to guantee your tool and `cabal-install` link
    against the same `Cabal` library.
  - Fixes haskell#9402
* Pass the name of the argument
  - This allows external commands to be implemented as symlinks to an
    executable, and multiple commands can be interpreted by the same
    executable.
  - Fixes haskell#9405
* `cabal help <cmd>` is interpreted as `cabal-<cmd> --help` for external
  commands.
  - This allows the `help` command to also work for external
  commands and hence they are better integrated into cabal-install.
  - Fixes haskell#9404

The tests are updated to test all these additions.

These features bring the external command interface up to par with the
cargo external command interface.

* Use Base16 hash for script path.

Issue haskell#9334 shows that `%` characters on Windows result in invalid
paths, also `/` characters on Linux create invalid paths.

This changes from using base64 to using base16 with the same length
we use for unit-ids.

* Migrate to haskell-actions/setup

As of 2023-09-09, haskell/action/setup is no longer maintained.

The comment

  # latest is mandatory for cabal-testsuite, see haskell#8133

is removed; as the validate job was already fixing a version of cabal-install.

* testsuite: Introduce Cabal-tests library for common testsuite functions

I noticed that Distribution.Utils.TempTestDir was only used in the
testsuite but defined in the Cabal library. Rather than expose this in
the public interface of the `Cabal` library, it is cleaner to refactor
it into a separate library (`Cabal-tests`) which can be used by any
testsuite component.

Also, in future it gives a clearer place to put utility functions which
need to be shared across the testsuite but not exposed in Cabal.
Cabal-tests can also freely add dependencies (such as exceptions) which
we might want to avoid adding to the Cabal library.

Fixes haskell#9453

* GHC 9.8 compat: pacify -Wx-partial

* GHC 9.8 compat: update hashes of data structures as computed by Structured

It seems, GHC 9.8 changed something in the code generation for data types.
Structured class is supposed to catch such cases.

* GHC 9.8 compat: bump base, update Unknown GHC

And bump Cabal's "supported version" of GHC

* CI: GHC 9.8

* merge master

* Hackage should be capitalized

---------

Co-authored-by: Artem Pelenitsyn <a.pelenitsyn@gmail.com>
Co-authored-by: Bryan Richter <bryan@haskell.foundation>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: Phil de Joux <philderbeast@gmail.com>
Co-authored-by: Yvan Sraka <yvan@sraka.xyz>
Co-authored-by: Andreas Abel <andreas.abel@ifi.lmu.de>
Co-authored-by: Jens Petersen <petersen@redhat.com>
Co-authored-by: Andrea Bedini <andrea.bedini@tweag.io>
Co-authored-by: Hamish Mackenzie <Hamish.K.Mackenzie@gmail.com>
Co-authored-by: Malte Neuss <malteneuss@users.noreply.github.com>
Co-authored-by: Bodigrim <andrew.lelechenko@gmail.com>
Co-authored-by: David Binder <david.binder@uni-tuebingen.de>
Co-authored-by: David Binder <binderd@informatik.uni-tuebingen.de>
Co-authored-by: Javier Sagredo <jasataco@gmail.com>
Co-authored-by: Andrea Bedini <andrea@andreabedini.com>
Co-authored-by: Matthew Pickering <matthewtpickering@gmail.com>
Co-authored-by: Fendor <power.walross@gmail.com>
Co-authored-by: Hécate Moonlight <Kleidukos@users.noreply.github.com>
Co-authored-by: Andreas Klebinger <klebinger.andreas@gmx.at>
Co-authored-by: Francesco Ariis <fa-ml@ariis.it>
Co-authored-by: Troels Henriksen <athas@sigkill.dk>
Co-authored-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Co-authored-by: Erik de Castro Lopo <erikd@mega-nerd.com>
Co-authored-by: brandon s allbery kf8nh <allbery.b@gmail.com>
Co-authored-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Co-authored-by: Kristen Kozak <grayjay@wordroute.com>
Co-authored-by: Javier Sagredo <javier.sagredo@iohk.io>
mergify bot pushed a commit that referenced this issue Dec 14, 2023
Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes #8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)

(cherry picked from commit 3832bea)

# Conflicts:
#	cabal-install-solver/src/Distribution/Solver/Types/PkgConfigDb.hs
jasagredo pushed a commit that referenced this issue Dec 14, 2023
Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes #8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)

(cherry picked from commit 3832bea)

# Conflicts:
#	cabal-install-solver/src/Distribution/Solver/Types/PkgConfigDb.hs
Mikolaj pushed a commit that referenced this issue Dec 15, 2023
Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes #8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)

(cherry picked from commit 3832bea)

# Conflicts:
#	cabal-install-solver/src/Distribution/Solver/Types/PkgConfigDb.hs
@vdukhovni
Copy link

I have worked around this issue for my use case by wrapping pkg-config with a script that fails when given more than one argument, so triggering the fallback code path in cabal that calls pkg-config once for each package:

Thanks for that, though the fix for cabal 3.10 has been committed, it is not yet released, so I have to resort to the work-around. An improved version below (simpler and with correct quoting of $@).

#! /bin/bash
[[ $# < 3 || $1 != "--modversion" ]] && exec /usr/bin/pkg-config "$@"

erikd pushed a commit to erikd/cabal that referenced this issue Apr 22, 2024
Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes haskell#8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)
erikd added a commit to erikd/cabal that referenced this issue Apr 22, 2024
…ange only. (haskell#9386)

* add more breadcrumbs for how to use remote packages.

* Hackage should be capitalized

* Update doc/cabal-project.rst

reword.

* Update doc/cabal-project.rst

reword.

* Update doc/cabal-project.rst

clearer.

* Update doc/cabal-project.rst

clearer!

* Update doc/cabal-project.rst

good mechanical description.

* wrap.

* Update doc/cabal-project.rst

add missing double ticks.

* clarify english, and follow a linguistic pattern better.

* Update doc/cabal-project.rst

* doc: render math with HTML to make it selectable (fix haskell#8453) (haskell#9361)

* doc: render math with HTML to make it selectable (fix haskell#8453)

* Update doc/conf.py

Co-authored-by: Bryan Richter <bryan@haskell.foundation>

---------

Co-authored-by: Bryan Richter <bryan@haskell.foundation>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Avoid double space in "Executing install plan ..."

* Add a change log entry for double space avoidance

* Ignore CmmSourcesExe Demo

Ignore because it warns about missing MachDeps.h

* [cabal-7825] Implement external command system

Fix haskell#2349 and haskell#7825

* Bump to latest dependencies for GHC 9.8.1

* cabal.project: clean out obsolete `allow-newer`s

* update GH validate workflow to ghc 9.2.8, 9.4.7, 9.6.3

* Revert haskell#3639 (Don't pass -package-db and -package flags to --abi-hash) (haskell#9384)

* Revert haskell#3639 (Don't pass -package-db and -package flags to --abi-hash)

With ghc>=9.6 `ghc --abi-hash` initialises the plugins so it will fail
if a cabal file specifies `ghc-options: -fplugin=Foo`.

Closes: haskell#9375

* Also revert in GHC.hs

---------

Co-authored-by: Hamish Mackenzie <Hamish.K.Mackenzie@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Use the newer haskell-actions organisation

* Restructure Cabal documentation top-level parts

The goal is for users to easier find pages for typical problems through search engines and page navigation.
- The top-level layout is based on the popular documentation structure by https://documentation.divio.com/ to give a
   clear structure to users and future documentation contributors:
  * Guides: Present a solution to a single, atomic, typical user problem.
  * Reference: Describe user API (CLI fields, syntax etc) with technical rigour and completeness.
  * Explanation: Discuss background information, scope, design decisions etc.
- Move existing documentation roughly into these categories with minimal editing as the basis for further editing.
- Rename guide titles to mention how-to for improving SEO.
- Rename some files to improve SEO since that name becomes part of the URL (often called slug).
  Important page keywords should appear in the slug as well to make pages rank higher in search engines.

* Rename master_doc to root_doc (changed in version 4.0 of Sphynx)

* Add instance Ord for Field, FieldLine, SectionArg and Name

* Do not run CI for documentation changes

The github workflows are not run if the
changes are completely contained within
the doc/ subdirectory. The only exception
is the users-guide.yml github action.

* Move Backpack section to user guides

* Remove TBW virtual modules section

* Add reinstall test to LinkerOptions/NonignoredConfigs

* Record install options

* Reject index-states after last known index-state (haskell#8944)

Co-authored-by: Javier Sagredo <jasataco@gmail.com>
Co-authored-by: Andrea Bedini <andrea.bedini@tweag.io>
Co-authored-by: Andrea Bedini <andrea@andreabedini.com>

* Note how to do "not equal" with constraints

* Use comma with then

Co-authored-by: Artem Pelenitsyn <a.pelenitsyn@gmail.com>

* Use narrow rather than upset

* Say something about hackage deprecations

* Fix AutogenModulesToggling test

By converting this to a setupTest we use the in-tree Cabal library
rather than relying on a proxy of the GHC version to provide the right
Cabal library version.

Supersedes haskell#9398

* Require version 3,11 of Cabal to support --semaphore flag

Fixes haskell#9197

* Add dependencies used by `PackageTests` to exe:cabal-tests

The runner allows the tests to use extra dependencies and the custom Prelude
from 'cabal-testsuite'.
However, if the tests use a dependency, say 'directory', and there are two
packages with the same unit id available in the store, the test fails since
it doesn't know which one to pick.
By including an extra dependency to directory, we force the test runner to
use a specific version directory, fixing the test failure.

* Use Paths_cabal_install for cabal-install version number (haskell#9421)

* Use PackageInfo for cabal-install version number

* Use Paths_cabal_install instead

* Adjust documentation

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* Document --profiling-detail in setup-commands.

Fixes haskell#9182

* Add test requirement to PR template

Adding test becomes a checkmark instead of “bonus points”.

* A 'cabal path' command. (haskell#8879)

* Add a 'cabal path' command.

* Formatting fix.

* Another formatting fix.

* Categorise "cabal path" as global command.

* Allow individual paths to be printed.

* Less duplication.

* Add config-file to "cabal path".

* Use sum type instead of strings.

* cabal path: support --installdir.

* Add documentation.

* Better text.

* Formatting.

* Add some tests.

* Improve tests.

* Add changelog entry.

* Mention "cabal path" in directory documentation.

---------

Co-authored-by: Artem Pelenitsyn <a.pelenitsyn@gmail.com>

* Reimplement `cabal check` (haskell#8427)

* Fix Semigroup target instance

When two target names are the same, `mappend`ing them should not
error but just pick the first name.

* Add `desugarBuildToolSimple`

* Reimplement cabal check

* Reorder test output

* Fix autogen modules tests .cabal files

* Add a number of tests

* Add test for haskell#7423

i.e. Do not warn on -O2 if under off-by-default package configuration
flag conditional.

* Add a regression for:

    * Add another -WErrr test
        This is to make sure we do *not* report it if it is under
        a user, off-by-default flag.
    * Add test for non manual user flags.
    * Add “absolute path in extra-lib-dirs” test
    * Add if/else test
    * Add “dircheck on abspath” check
    * Add Package version internal test
    * Add PackageVersionsStraddle test

* Add changelog for haskell#8427

* Integrate various reviews

* Integrate Artem’s review

(review) Clarify `combineNames` documentation

By explaining the way it operates (working if the two names are equal
or one is empty) and renaming the function from `combineName` to
`combineNames`.

(review) Use guards instead of if/then/else

(review) Match inside argument list

(review) Replace “white” with “allow”

(review) Fix typo in comment

(review) Fix typo in Check module documentation

(review) Harmonise indentation for `data` decls

First field goes in a new line than the data constructor, so we
have more space.

(review) Rename `Prim` module to `Types`

(review) Add checkPackageFilesGPD

`checkPackageFiles` — which works on PD — was used to perform IO. We
introduce a function that does the same thing but works on GPD (which
is more principled).

`checkPackageFiles` cannot just be removed, since it is part of the
interface of Distribution.PackageDescription.Check. Deprecation can
be planned once “new check” is up and running.

* Integrate Andreas’ review

(review) Add named section to missing upper bound check

“miss upper bound” checks will now list target type and name (“On
executable 'myexe', these packages miss upper bounds”) for easier
fixing by the user.

(review) remove `cabal gen-bounds` suggestion

Reasonable as `cabal gen-bounds` is stricter than `cabal check`, see
haskell#8427 (comment)
Once `gen-bounds` behaves in line with `check` we can readd the
suggestion.

(review) Do not warn on shared bounds

When a target which depends on an internal library shares some
dependencies with the latter, do not warn on upper bounds.

An example is clearer

    library
     build-depends: text < 5
    ⁝
     build-depends: myPackage,        ← no warning, internal
                    text,             ← no warning, shared bound
                    monadacme         ← warning!

* Integrate Artem’s review /II

(review) Split Check.hs

Check.hs has been split in multiple file, each une sub 1000 lines:

Check              857 lines
Check.Common       147 lines
Check.Conditional  204 lines
Check.Monad        352 lines
Check.Paths        387 lines
Check.Target       765 lines
Check.Warning      865 lines

Migration guide:
- Check              GPD/PD checks plus work-tree checks.
- Check.Common       common types and functions that are
                     *not* part of monadic checking setup.
- Check.Conditional  checks on CondTree and related matter
                     (variables, duplicate modules).
- Check.Monad        Backbone of the checks, monadic inter-
                     face and related functions.
- Check.Paths        Checks on files, directories, globs.
- Check.Target       Checks on realised targets (libraries,
                     executables, benchmarks, testsuites).
- Check.Warning      Datatypes and strings for warnings
                     and severities.

(review) remove useless section header

(review) Fix typo

(review) Add warnings documentation (list)

For each warning, we document constructor/brief description
in the manual.  This might not be much useful as not but it
will come handy when introducing `--ignore=WARN` and similar
flags.

* (review Andreas) Clarify CheckExplanation comment

Whoever modifies `CheckExplanation` data constructors needs to be
aware that the documentation in  doc/cabal-commands.rst  has to be
updated too.

* Move internal Check modules to `other-modules`

No need to expose Distribution.PackageDescription.Check.*
to the world. API for checking, for cabal-install and other
tools, should be in Distribution.PackageDescription.Check.

* Make fourmolu happy

Cabal codebase has now a formatter/style standard (see haskell#8950).

“Ravioli ravioli, give me the formuoli”

* Do not check for OptO in scripts

See haskell#8963 for reason and clarification requests.

* Remove useless PackageId parameter

It is now in the Reader part of CheckM monad.

* Do not check PVP on internal targets

Internal: testsuite, benchmark.
See haskell#8361.

* Make hlint happy

* Fix haskell#9122

When checking internal version ranges, we need to make sure we
are not mistaking a libraries with the same name but from different
packages. See haskell#9132.

* Fix grammar

neither…nor, completing what done in haskell#9162

* Integrate Brandon’s review: grammar

* Remove unnecessary `-fvia-C` check

Brandon’s review/II.

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

* ci: Enable windows tests for 9.6.3

There were two failing tests:

1. CCompilerOverride, was attempting to use gcc.exe rather than
   clang.exe without also overriding the C options which led to
   incorrect options being passed to gcc.exe. The fix is to override to
   clang.exe on ghc-9.4 or newer.
2. ForeignLibs exposes a bug in GHC
   (https://gitlab.haskell.org/ghc/ghc/-/issues/24185) and hence is
   skipped for GHCs newer than 9.4 where it was first introduced.

Towards fixing haskell#8451, we just need to fix the shared library issue now.

* testsuite: Be explicit about runtime test dependencies

Issue haskell#8356 reports occasional errors from running the testsuite about
multiple package versions available. This stems from the invokation of
`runghc` not being explicit about all dependencies of the testsuite.

The solution is provide a component in the cabal file which is explicit
about which packages the tests can depend on. This component has a
build-depends section which lists all the dependencies that the tests
require.

It would be better if this component was a library component but we
can't do this with a Custom setup because of limitations to do with
per-component builds.

Then we also enable `-hide-all-packages`, so the dependency will not be
available if it is not explicitly listed as a dependency.

You could also imagine a future where the Setup.hs script found the test
files and compiled a single executable which would run all the tests,
rather than invoking runghc on each one individually.

Fixes haskell#8356

* hurd: Enable using $ORIGIN in RPATH

GNU/Hurd fully supports RPATH and the $ORIGIN development, and we indeed
want to use it for relocatable installations shipped in Debian GNU/Hurd.

* Fix the platform string for GNU/Hurd

Since version 9.4.7-1, ghc fails to build on the GNU/Hurd port of Debian,
see

https://buildd.debian.org/status/fetch.php?pkg=ghc&arch=hurd-i386&ver=9.4.7-1&stamp=1697717885&raw=0

Error, rule finished running but did not produce file:
  _build/stage0/lib/i386-gnu-ghc-9.4.6/ghc-boot-th-9.4.7/libHSghc-boot-th-9.4.7.a

and indeed, what did get produce was rather
_build/stage0/lib/i386-hurd-ghc-9.4.6/ghc-boot-th-9.4.7/libHSghc-boot-th-9.4.7.a
(i386-hurd instead of i386-gnu).

This is due to confusion between hurd and gnu in various places.  Apparently
previous versions of ghc were using gnu for the GNU/Hurd port, and thus
putting libraries etc. in i386-gnu. So we have to follow the existing
practice.

* Fix configuation of ldProgram

Standard GNU `ld` ues `--relocatable` while `ld.gold` uses a `-relocatable`
flag (with a single `-`). Code will now detect both versions.

* Chain configuration of ldProgram

`ldProgram` gets configured in two places, a seemingly default and
a GHC specific version. The later needs to be updated so that it
first calls the default configuration and then the new GHC version.

* Use linker capability detection to improve linker use

The function `comperSupportsGhciLibs` has been renamed to
`linkerSupportsGhciLibs` because its about the linker not the compiler.

The function `comperSupportsGhciLibs` was using the compiler version
as a proxy for whether the linker supports relocatable objects. Now
support for relocatable objects is detected by running the linker.

* add `merge+no rebase`

and a few typos while reviewing

* Add support for 64-bit SPARC as a separate architecture

Previously, sparc64 was defined as an alias for the 32-bit SPARC
architecture which was true while SPARC mainland was mostly 32
bits. More recently, 64-bit SPARC has become a port of its own,
so it needs to be treated as a separate architecture.

* Remove debug-conflict-sets flag from solver package

Fixes haskell#8937.

The debug-conflict-sets build flag probably hasn't been used for a long time,
and it isn't currently tested. This commit removes the flag, converts the
ConflictSet type back to a newtype, and removes an unnecessary instance.

* Finish improvements to the CI configuration for documentation changes (haskell#9460)

* Add bootstrap postjob to CI config

Add a new job to the bootstrap.yml GitHub action config.
This job succeeds if, and only if, all the other bootstrap
jobs succeed.

* Do not run bootstrap CI jobs for documentation changes

The approach was already introduced in haskell#9355 for the validate jobs.
This commit introduces the same change also for the bootstrap jobs.

* Also ignore CONTRIBUTING.md and README.md in CI

We do not run the entire CI suite for documentation changes.
Previously, only changes which were restricted to the 'docs/'
subdirectory were considered to be documentation changes.
With this commit we also recognize changes to README.md and
CONTRIBUTING.md as documentation changes.

* Document improved CI for documentation in CONTRIBUTING.md

The CONTRIBUTING.md file now mentions that documentation changes
do not waste expensive CI resources.

* Recognize all README.md in subdirs as documentation

Expensive CI jobs should not run on changes which affect only
README.md files.

* formatting: Add style-commit makefile target

This target allows you to format a range of commits, for example:

```
make style-commit COMMIT=HEAD~1
> Last commit is formatted
make style-commit COMMIT=abcde
> Commits between HEAD and abcde are formatted
```

* Fix assertion failure when combining build-tool-depends and --enable-documentation

The `setDocumentation` function was modifying the elaborated package
after the hash was computed. This led to the assertion failing as the
computed hash was different to what was computed in the initial install
plan.

Therefore in order to fix this we either needed to:

1. Set elabBuildHaddocks = False at the point where the hash is
   initially computed.
2. Verify that elabBuildHaddocks = True will not lead to unexpected
   results.

The latter has been implemented.

The elabBuildHaddocks option is only consulted in
`hasValidHaddockTargets`, at which point documentation building the
executable component is disabled because elabHaddockExecutables is
False.

In the added test we ensure this by checking that we didn't build
documentation for the executable which is built because of
build-tool-depends.

Fixes haskell#6006 haskell#8313

* testsuite: Improve error message in findDependencyInStore

* Only move code to Simple/GHC/Build*

* CPP mingw32_HOST_OS for more imports

* cabal-install-solver: fix pkgconf 1.9 --modversion regression

Check that the numbers of *versions* output is equal to the number of pkgconf's

fixes haskell#8923

The pkgconf behavior was reverted upstream in 2.0

(this should cover the case too of checking that equal pkgList lines are output also)

* External commands: Add tests for haskell#9402 haskell#9403 haskell#9404

This adds 4 tests which test the new external commands feature:

* ExternalCommand - Tests the expected usage of external command invoked
  via cabal-install
* ExternalCommandSetup - Tests that the ./Setup interface does not
  support external commands (haskell#9403)
* ExternalCommandEnv - Tests that environment variables are set and
  preserved appropiately  (haskell#9402)
* ExternalCommandHelp - Test that `cabal help <cmd>` is interpreted appropiately (haskell#9404)

* Finish off the external commands feature

* Remove 'CommandDelegate' in favour of abstracting the fallback in
  'commandsRun', there is a new variant 'commdandRunWithFallback' which
  takes a continuation
  - This restores the modularity between the `Cabal` library and
    `cabal-install` as now `Cabal` doesn't need to know anything about
    the external command interface.
  - Fixes haskell#9403
* Set the $CABAL environment variable to the current executable path
  - This allows external commands to be implemented by calling $CABAL,
    which is strongly preferred to linking against the Cabal library as
    there is no easy way to guantee your tool and `cabal-install` link
    against the same `Cabal` library.
  - Fixes haskell#9402
* Pass the name of the argument
  - This allows external commands to be implemented as symlinks to an
    executable, and multiple commands can be interpreted by the same
    executable.
  - Fixes haskell#9405
* `cabal help <cmd>` is interpreted as `cabal-<cmd> --help` for external
  commands.
  - This allows the `help` command to also work for external
  commands and hence they are better integrated into cabal-install.
  - Fixes haskell#9404

The tests are updated to test all these additions.

These features bring the external command interface up to par with the
cargo external command interface.

* Use Base16 hash for script path.

Issue haskell#9334 shows that `%` characters on Windows result in invalid
paths, also `/` characters on Linux create invalid paths.

This changes from using base64 to using base16 with the same length
we use for unit-ids.

* Migrate to haskell-actions/setup

As of 2023-09-09, haskell/action/setup is no longer maintained.

The comment

  # latest is mandatory for cabal-testsuite, see haskell#8133

is removed; as the validate job was already fixing a version of cabal-install.

* testsuite: Introduce Cabal-tests library for common testsuite functions

I noticed that Distribution.Utils.TempTestDir was only used in the
testsuite but defined in the Cabal library. Rather than expose this in
the public interface of the `Cabal` library, it is cleaner to refactor
it into a separate library (`Cabal-tests`) which can be used by any
testsuite component.

Also, in future it gives a clearer place to put utility functions which
need to be shared across the testsuite but not exposed in Cabal.
Cabal-tests can also freely add dependencies (such as exceptions) which
we might want to avoid adding to the Cabal library.

Fixes haskell#9453

* GHC 9.8 compat: pacify -Wx-partial

* GHC 9.8 compat: update hashes of data structures as computed by Structured

It seems, GHC 9.8 changed something in the code generation for data types.
Structured class is supposed to catch such cases.

* GHC 9.8 compat: bump base, update Unknown GHC

And bump Cabal's "supported version" of GHC

* CI: GHC 9.8

* merge master

* Hackage should be capitalized

---------

Co-authored-by: Artem Pelenitsyn <a.pelenitsyn@gmail.com>
Co-authored-by: Bryan Richter <bryan@haskell.foundation>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: Phil de Joux <philderbeast@gmail.com>
Co-authored-by: Yvan Sraka <yvan@sraka.xyz>
Co-authored-by: Andreas Abel <andreas.abel@ifi.lmu.de>
Co-authored-by: Jens Petersen <petersen@redhat.com>
Co-authored-by: Andrea Bedini <andrea.bedini@tweag.io>
Co-authored-by: Hamish Mackenzie <Hamish.K.Mackenzie@gmail.com>
Co-authored-by: Malte Neuss <malteneuss@users.noreply.github.com>
Co-authored-by: Bodigrim <andrew.lelechenko@gmail.com>
Co-authored-by: David Binder <david.binder@uni-tuebingen.de>
Co-authored-by: David Binder <binderd@informatik.uni-tuebingen.de>
Co-authored-by: Javier Sagredo <jasataco@gmail.com>
Co-authored-by: Andrea Bedini <andrea@andreabedini.com>
Co-authored-by: Matthew Pickering <matthewtpickering@gmail.com>
Co-authored-by: Fendor <power.walross@gmail.com>
Co-authored-by: Hécate Moonlight <Kleidukos@users.noreply.github.com>
Co-authored-by: Andreas Klebinger <klebinger.andreas@gmx.at>
Co-authored-by: Francesco Ariis <fa-ml@ariis.it>
Co-authored-by: Troels Henriksen <athas@sigkill.dk>
Co-authored-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Co-authored-by: Erik de Castro Lopo <erikd@mega-nerd.com>
Co-authored-by: brandon s allbery kf8nh <allbery.b@gmail.com>
Co-authored-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Co-authored-by: Kristen Kozak <grayjay@wordroute.com>
Co-authored-by: Javier Sagredo <javier.sagredo@iohk.io>
@juhp
Copy link
Collaborator

juhp commented Jul 21, 2024

(Just confirming that this fix is in cabal-install-solver-3.10.3.0 (released 21st March), thank you -- hopefully also in the next lts-22...;-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cabal-install: solver re: pkg-config Concerning pkg-config and pkgconfig-depends constraints type: bug
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants