[GHC] #11536: Multitude of different error messages when installed package is missing a module
GHC
ghc-devs at haskell.org
Thu Feb 4 03:47:54 UTC 2016
#11536: Multitude of different error messages when installed package is missing a
module
-------------------------------------+-------------------------------------
Reporter: thomie | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.10.3
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets: #8060, #9009,
| #11023
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
(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 at 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 at 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 at 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 at 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:
* https://github.com/haskell/cabal/issues/2982: Cabal will build and
install broken library if other-modules is not complete
* https://github.com/haskell/cabal/issues/3093: Missing files in package
* #9009 Confusing error message when loading package with TH
* #11023: ghci and ghc-pkg disagree about what's exposed
* #8060: Undefined symbols when using Template Haskell linked from another
object with unexposed modules
#8060 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.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11536>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list