haskell / haskell/cabal

Cabal accepts invalid sublibrary names.

Open
#10,778 0 comments 0 reactions 0 assignees View on GitHub
needs triage type: bug
Dominant language
Haskell
Stars
1.7k
Forks
750
Avg merge
4d 3h
Merged PRs (30d)
28

Description

See https://github.com/phadej/cabal-sublib-bug

**Describe the bug**

Cabal parser accepts

```haskell
cabal-version: 3.8
name: cabal-sublib-bug
version: 0

library james-bond-007
default-language: Haskell2010
hs-source-dirs: src-a
build-depends: base <5
exposed-modules: A

library
default-language: Haskell2010
hs-source-dirs: src-a
build-depends: base <5
exposed-modules: B

-- note: for private libraries this is not an issue,
-- as we cannot depend on them, the field below doesn't parse
-- public libraries couldnt' be used either, but we'll catch that too late!
-- build-depends: cabal-sublib-bug:james-bond-007
```

in particular the `library james-bond-007`.

This doesn't work. We cannot use it `build-depends: cabal-sublib-bug:james-bond-007` fails to parse. But if we don't add the dependency it will fail to compile:

```
Error: [Cabal-7125]
Failed to build cabal-sublib-bug-0.
Failed to build lib:james-bond-007 from cabal-sublib-bug-0. The failure occurred during the final install step. The exception was:
Error: [Cabal-7038]
Couldn't parse the output of 'setup register --gen-pkg-config':".:1:58: \nunexpected end of input\n\n"
```

**To Reproduce**

See https://github.com/phadej/cabal-sublib-bug

**Expected behavior**

I think `.cabal` parser should reject the invalid library name early.

**Additional context**

I think, that the (private) library names were restricted to the same rules as library/package names, as we could use them unqualified (just `james-bond-007` - but that looks like package id - there's a version). In latest `cabal-version`s we can only use qualified names (`cabal-sublib-bug:james-bond-007`), so maybe it would be possible to relax library names in some future cabal spec version. But I think it's not worth the subtleties.

Now, with *public* sublibraries, it's possible that someone accidentally creates an unusable public library.
The build failure of failing to register (see above) is confusing.

I found this issue because I was creating (private) test library components, like `test-01`, `test-02` etc and not yet using them, and spent good chunk of time wondering what's wrong.

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.