haskell / haskell/cabal

`cabal install` fails to statically link executable

Open
#11,163 2 comments 0 reactions 0 assignees View on GitHub
cabal-install: cmd/install type: bug
Dominant language
Haskell
Stars
1.7k
Forks
750
Avg merge
4d 3h
Merged PRs (30d)
28

Description

**Describe the bug**

`cabal build` produces an executable file without problems.
`cabal install` fails to produce an executable file.

The [project where this was observed](https://github.com/hadolint/hadolint) consists of a library and an executable file and builds fine when dynamically linked. However when linking statically, only `cabal build` manages to locate the interface files. `cabal install` fails with errors:

```
Build profile: -w ghc-9.10.1 -O1
In order, the following will be built (use -v for more details):
- hadolint-2.13.1 (lib) (requires build)
- hadolint-2.13.1 (exe:hadolint) (requires build)
Starting hadolint-2.13.1 (lib)
Building hadolint-2.13.1 (lib)
Installing hadolint-2.13.1 (lib)
Completed hadolint-2.13.1 (lib)
Starting hadolint-2.13.1 (exe:hadolint)
Building hadolint-2.13.1 (exe:hadolint)

Failed to build exe:hadolint from hadolint-2.13.1.
Build log (
/github/home/.cache/cabal/logs/ghc-9.10.1/hadolint-2.13.1-e-hadolint-b66140065e6932d4dc419722b7fda95da4107374fa16b6ad3c74db93ca8133d0.log
):
Warning: hadolint.cabal:3:33: version with tags
Configuring executable 'hadolint' for hadolint-2.13.1...
Preprocessing executable 'hadolint' for hadolint-2.13.1...
Building executable 'hadolint' for hadolint-2.13.1...
[1 of 2] Compiling Main ( app/Main.hs, dist/build/hadolint/hadolint-tmp/Main.o, dist/build/hadolint/hadolint-tmp/Main.dyn_o )
app/Main.hs:5:1: error: [GHC-47808]
Failed to load dynamic interface file for Hadolint:
Exception when reading interface file /github/home/.local/state/cabal/store/ghc-9.10.1-8a6a/hadolint-2.13.1-e2c9b9e2bdef0372783b4fb8e8c42b2d7dae1a668a72a7a0854571ae36005c61/lib/Hadolint.dyn_hi
/github/home/.local/state/cabal/store/ghc-9.10.1-8a6a/hadolint-2.13.1-e2c9b9e2bdef0372783b4fb8e8c42b2d7dae1a668a72a7a0854571ae36005c61/lib/Hadolint.dyn_hi: withBinaryFile: does not exist (No such file or directory)
|
5 | import Hadolint (OutputFormat (..), printResults, DLSeverity (..))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

app/Main.hs:6:1: error: [GHC-47808]
Failed to load dynamic interface file for Hadolint.Config:
Exception when reading interface file /github/home/.local/state/cabal/store/ghc-9.10.1-8a6a/hadolint-2.13.1-e2c9b9e2bdef0372783b4fb8e8c42b2d7dae1a668a72a7a0854571ae36005c61/lib/Hadolint/Config.dyn_hi
/github/home/.local/state/cabal/store/ghc-9.10.1-8a6a/hadolint-2.13.1-e2c9b9e2bdef0372783b4fb8e8c42b2d7dae1a668a72a7a0854571ae36005c61/lib/Hadolint/Config.dyn_hi: withBinaryFile: does not exist (No such file or directory)
|
6 | import Hadolint.Config
| ^^^^^^^^^^^^^^^^^^^^^^

app/Main.hs:11:1: error: [GHC-47808]
Failed to load dynamic interface file for Hadolint.Rule:
Exception when reading interface file /github/home/.local/state/cabal/store/ghc-9.10.1-8a6a/hadolint-2.13.1-e2c9b9e2bdef0372783b4fb8e8c42b2d7dae1a668a72a7a0854571ae36005c61/lib/Hadolint/Rule.dyn_hi
/github/home/.local/state/cabal/store/ghc-9.10.1-8a6a/hadolint-2.13.1-e2c9b9e2bdef0372783b4fb8e8c42b2d7dae1a668a72a7a0854571ae36005c61/lib/Hadolint/Rule.dyn_hi: withBinaryFile: does not exist (No such file or directory)
|
11 | import qualified Hadolint.Rule as Rule
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

[2 of 2] Compiling Paths_hadolint ( dist/build/hadolint/autogen/Paths_hadolint.hs, dist/build/hadolint/hadolint-tmp/Paths_hadolint.o, dist/build/hadolint/hadolint-tmp/Paths_hadolint.dyn_o )
Error: [Cabal-7125]
Failed to build exe:hadolint from hadolint-2.13.1. See the build log above for details.
```

**To Reproduce**

Observed e.g. with https://github.com/hadolint/hadolint

```
$ cabal build --only-dependencies --disable-shared --ghc-options='-split-sections -optl-static -fPIC'
$ cabal install --installdir="$HOME/.local/bin" --install-method=copy --overwrite-policy=always --enable-executable-static --disable-executable-dynamic --disable-shared --ghc-options='-split-sections -optl-static -optl-pthread -fPIC'
```

**Expected behavior**

`cabal install` should not fail on a build error, when `cabal build` works fine.

**System information**

OS: openSUSE Leap 15.6, Alpine 3.21.4
Cabal:
```
cabal-install version 3.12.1.0
compiled using version 3.12.1.0 of the Cabal library
```
GHC: `The Glorious Glasgow Haskell Compilation System, version 9.10.1`

**Additional context**

Observed e.g. in CI pipelines here: https://github.com/m-ildefons/hadolint/actions/runs/16911622370/job/47914561261

Workaround is to simply use `cabal build` to produce the executable file and use `cabal list-bin` to locate the build result. Then manually install the build result.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.