Skip to content

ghc-pkg package config validation too strict

Registration of a package using the following config works:

name: frob
version: 0.1.0.0
id: frob-0.1.0.0-inplace
key: frob-0.1.0.0-inplace
exposed: True
exposed-modules:
    Baz from base-4.11.1.0:Data.Bool,
    Foo from base-4.11.1.0:Data.List,
    Frob
depends:
    base-4.11.1.0

But while GHC is happy to work with the following variant of the above configuration added by hand to the package database, it's not possible to add it via ghc-pkg register, because it's rejected at validation phase:

name: frob
version: 0.1.0.0
id: frob-0.1.0.0-inplace
key: frob-0.1.0.0-inplace
exposed: True
exposed-modules:
    Baz from base:Data.Bool,
    Foo from base:Data.List,
    Frob
depends:
    base

We get the following error:

$ ghc-pkg register frob.conf
frob-0.1.0.0: module reexport refers to a non-existent defining package: base (use --force to override)

This is unfortunate, because in general unit-id's don't just have version numbers but also hashes, and in some settings these can be hard to guess.

The general point is that ghc-pkg should be exactly as permissive as GHC itself, not less or more. One way to achieve that is to make the checkModule function in utils/ghc-pkg/Main.hs (called by validatePackageConfig) use lookupPackageName as a fallback to lookupUnitId, and say that if lookupPackageName returns exactly one result (i.e. the name is unambiguous) then that should be considered okay. Perhaps not A-okay, because the name could become ambiguous in the future when more entries are added to the database, but that should at most be a warning, not an error, I think.

Note: in principle we should be able to use the --force flag here to bypass the results of configuration validation. But oddly enough, --force filters out entries that it objects about, rather than just letting them pass through. So --force is not a workable workaround.

Trac metadata
Trac field Value
Version 8.4.3
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC ezyang
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information