Skip to content

Multitude of different error messages when installed package is missing a module

(I might clean this up later)

Key points:

  • missing module in 'exposed-modules' field of .cabal file
  • package name equals some (functioning) installed package
  • ghc-pkg happily registers the package
  • errors don't show up until one tries to use the module
  • error messages are all different and all quite terrible

Makefile to reproduce:

GHCPKG=ghc-pkg
#GHC=ghc-8.0.0.20160127
GHC=ghc-7.10.3
PACKAGEDB=../.cabal-sandbox/x86_64-linux-$(GHC)-packages.conf.d/

all : 
	$(MAKE) --no-print-directory clean
	$(MAKE) --no-print-directory setup
	$(MAKE) --no-print-directory setup1
	$(MAKE) --no-print-directory run1

	@echo
	@echo

	$(MAKE) --no-print-directory clean
	$(MAKE) --no-print-directory setup
	$(MAKE) --no-print-directory setup2
	$(MAKE) --no-print-directory run2

clean :
	rm -rf .cabal-sandbox cabal.sandbox.config
	rm -rf temp dist System *.cabal

setup :
	mkdir temp
	mkdir -p System/FilePath
	cabal -v0 sandbox init

	echo "name:                filepath     " >> filepath.cabal
	echo "version:             99999.1.0    " >> filepath.cabal
	echo "build-type:          Simple       " >> filepath.cabal
	echo "cabal-version:       >=1.10       " >> filepath.cabal
	echo "library                           " >> filepath.cabal
	echo "  exposed-modules:                " >> filepath.cabal
	echo "    System.FilePath               " >> filepath.cabal
	echo "    System.FilePath.Posix         " >> filepath.cabal
	echo "  build-depends:       base >=4.8 " >> filepath.cabal
	echo "  default-language:    Haskell2010" >> filepath.cabal

	echo "module System.FilePath (module System.FilePath.Posix) where" >> System/FilePath.hs
	echo "import System.FilePath.Posix                               " >> System/FilePath.hs

	echo "module System.FilePath.Posix where" >> System/FilePath/Posix.hs
	echo "takeFileName = id                 " >> System/FilePath/Posix.hs

setup1 :
	@echo
	@echo 111111111111111111111111111111111
	@echo - Remove a module from 'exposed-modules'
	@echo - Install package
	@echo - Run some tests
	@echo
	sed -i '/System.FilePath.Posix/d' filepath.cabal
	cabal install -v0 --with-ghc="$(GHC)"

run1 :
	@echo
	@echo FAILURE MODE 1A
	@echo
	-cd temp && "$(GHC)" -v0 -package-db="$(PACKAGEDB)" -e 'import System.FilePath.Posix'
	@echo
	@echo FAILURE MODE 1B
	@echo
	-cd temp && "$(GHC)" -v0 -package-db="$(PACKAGEDB)" -e 'import System.FilePath' -e 'takeFileName "foo/bar"'
	@echo
	@echo FAILURE MODE 1C
	@echo
	echo 'import System.FilePath' > temp/Foo.hs
	echo 'main = print $$ takeFileName "foo/bar"' >> temp/Foo.hs
	-cd temp && "$(GHC)" -v0 -package-db="$(PACKAGEDB)" Foo.hs -fforce-recomp

setup2 :
	@echo
	@echo 222222222222222222222222222222222
	@echo - Install package
	@echo - Remove a module from 'exposed-modules'
	@echo - Reinstall package
	@echo - Run some tests
	@echo
	cabal install -v0 --with-ghc="$(GHC)"
	sed -i '/System.FilePath.Posix/d' filepath.cabal
	cabal install -v0 --with-ghc="$(GHC)"

run2 :
	@echo
	@echo FAILURE MODE 2A, same as 1A
	@echo
	-cd temp && "$(GHC)" -package-db="$(PACKAGEDB)" -e 'import System.FilePath.Posix'
	@echo
	@echo FAILURE MODE 2B
	@echo
	-cd temp && "$(GHC)" -package-db="$(PACKAGEDB)" -e 'import System.FilePath' -e 'takeFileName "foo/bar"'
	@echo
	@echo FAILURE MODE 2C
	@echo
	echo 'import System.FilePath' > temp/Foo.hs
	echo 'main = print $$ takeFileName "foo/bar"' >> temp/Foo.hs
	-cd temp && "$(GHC)" -package-db="$(PACKAGEDB)" Foo.hs -fforce-recomp

Output (run make):

# FAILURE MODE 1A
# 
# cd temp && "ghc-7.10.3" -v0 -package-db="../.cabal-sandbox/x86_64-linux-ghc-7.10.3-packages.conf.d/" -e 'import System.FilePath.Posix'
# 
# <no location info>:
#     Could not find module ‘System.FilePath.Posix’
#     It is a member of the hidden package ‘filepath-1.4.0.0@filep_Ey7a1in9roBAE8bUFJ5R9m’.
# make[1]: [run1] Error 1 (ignored)
# 
# FAILURE MODE 1B
# 
# cd temp && "ghc-7.10.3" -v0 -package-db="../.cabal-sandbox/x86_64-linux-ghc-7.10.3-packages.conf.d/" -e 'import System.FilePath' -e 'takeFileName "foo/bar"'
# <interactive>: Failed to load interface for ‘System.FilePath.Posix’
# Perhaps you haven't installed the "dyn" libraries for package ‘filepath-99999.1.0’?
# Use -v to see a list of the files searched for.
# make[1]: [run1] Error 1 (ignored)
# 
# FAILURE MODE 1C
# 
# echo 'import System.FilePath' > temp/Foo.hs
# echo 'main = print $ takeFileName "foo/bar"' >> temp/Foo.hs
# cd temp && "ghc-7.10.3" -v0 -package-db="../.cabal-sandbox/x86_64-linux-ghc-7.10.3-packages.conf.d/" Foo.hs -fforce-recomp
# Failed to load interface for ‘System.FilePath.Posix’
# There are files missing in the ‘filepath-99999.1.0’ package,
# try running 'ghc-pkg check'.
# Use -v to see a list of the files searched for.
# make[1]: [run1] Error 1 (ignored)

More output:

# FAILURE MODE 2A, same as 1A
# 
# cd temp && "ghc-7.10.3" -package-db="../.cabal-sandbox/x86_64-linux-ghc-7.10.3-packages.conf.d/" -e 'import System.FilePath.Posix'
# 
# <no location info>:
#     Could not find module ‘System.FilePath.Posix’
#     It is a member of the hidden package ‘filepath-1.4.0.0@filep_Ey7a1in9roBAE8bUFJ5R9m’.
# make[1]: [run2] Error 1 (ignored)
# 
# FAILURE MODE 2B
# 
# cd temp && "ghc-7.10.3" -package-db="../.cabal-sandbox/x86_64-linux-ghc-7.10.3-packages.conf.d/" -e 'import System.FilePath' -e 'takeFileName "foo/bar"'
# <interactive>: 
# ByteCodeLink.lookupCE
# During interactive linking, GHCi couldn't find the following symbol:
#   filepzuDQlytQXekB83614cuzzvF62_SystemziFilePathziPosix_takeFileName_closure
# This may be due to you not asking GHCi to load extra object files,
# archives or DLLs needed by your current session.  Restart GHCi, specifying
# the missing library using the -L/path/to/object/dir and -lmissinglibname
# flags, or simply by naming the relevant files on the GHCi command line.
# Alternatively, this link failure might indicate a bug in GHCi.
# If you suspect the latter, please send a bug report to:
#   glasgow-haskell-bugs@haskell.org
# 
# make[1]: [run2] Error 1 (ignored)
# 
# FAILURE MODE 2C
# 
# echo 'import System.FilePath' > temp/Foo.hs
# echo 'main = print $ takeFileName "foo/bar"' >> temp/Foo.hs
# cd temp && "ghc-7.10.3" -package-db="../.cabal-sandbox/x86_64-linux-ghc-7.10.3-packages.conf.d/" Foo.hs -fforce-recomp
# [1 of 1] Compiling Main             ( Foo.hs, Foo.o )
# Linking Foo ...
# Foo.o: In function `sKS_info':
# (.text+0xae): undefined reference to `filepzuDQlytQXekB83614cuzzvF62_SystemziFilePathziPosix_takeFileName_closure'
# Foo.o: In function `SLc_srt':
# (.data+0x88): undefined reference to `filepzuDQlytQXekB83614cuzzvF62_SystemziFilePathziPosix_takeFileName_closure'
# collect2: error: ld returned 1 exit status
# make[1]: [run2] Error 1 (ignored)

Analysis

  • 1A: why mention a hidden (global) package, when it is hidden by a *broken* package.
  • 1B: misleading suggestion about "dyn" libraries
  • 1C: why does GHC say I should run ghc-pkg, but 'ghc-pkg check' says everything is fine?
  • 2A: same as 1A
  • 2B: scary: ByteCodeLink.lookupCE
  • 2C: terrible: undefined reference

Bonus

With ghc-8.0.1-rc1, failure modes 1B, 1C, 2B and 2C look like this:

# [1 of 1] Compiling Main             ( Foo.hs, Foo.o )
#
# Foo.hs:1:1: error:
#     Bad interface file: /home/thomas/tmp/test/filepath/.cabal-sandbox/lib/x86_64-linux-ghc-8.0.0.20160127/filepath-1.4.1.0-87VdeZTuOMDJQ40Wd1kNnE/System/FilePath.hi
#         Something is amiss; requested module  filepath-1.4.1.0@filepath-1.4.1.0-435e90352be17e51f8e362eb5810bcd5:System.FilePath differs from name found in the interface file filep_87VdeZTuOMDJQ40Wd1kNnE:System.FilePath
# make: [run2] Error 1 (ignored)

Related tickets:

#8060 (closed) was closed with:

GHC is not really in the business of checking the well-formedness of archive files installed in the package database, so there is not much GHC can do here.

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