[Hackage] #161: 'sdist' cannot find some modules that 'build' finds ok

Hackage trac at galois.com
Wed Mar 12 17:37:04 EDT 2008


#161: 'sdist' cannot find some modules that 'build' finds ok
----------------------------+-----------------------------------------------
  Reporter:  guest          |        Owner:                 
      Type:  defect         |       Status:  closed         
  Priority:  high           |    Milestone:  Cabal-1.4      
 Component:  Cabal library  |      Version:  1.2.0          
  Severity:  normal         |   Resolution:  fixed          
  Keywords:                 |   Difficulty:  easy (<4 hours)
Ghcversion:  6.6            |     Platform:  Linux          
----------------------------+-----------------------------------------------
Changes (by duncan):

  * status:  new => closed
  * resolution:  => fixed

Comment:

 Ok, discovered the problem and why the behavior was inconsistent.

 Turns out it __should__ fail in the `build` step too. The `sdist` was
 behaving properly and building (or rather pre-processing) should not have
 found that file.

 So it turns out that
 {{{
 hs-source-dirs: tests .
 }}}
 in the executable section is not just a workaround but the correct thing
 to do.

 Let's look at the .cabal file again:

 {{{
 ... snip ...
 build-depends:    base, bytestring, HUnit, network
 exposed-modules:  Network.Socket.ByteString
 extensions:       CPP, ForeignFunctionInterface

 executable:       tests
 main-is:          UnitTests.hs
 hs-source-dirs:   tests
 other-modules:    Network.Socket.ByteString
 extensions:       CPP, ForeignFunctionInterface
 }}}

 And we have these files:
 {{{
 Network/SocketByteString.cpphs
 tests/UnitTests.hs
 }}}

 The meaning of `hs-source-dirs` is to look in just those directories for
 source files. If it is not specified then it defaults to `.` however note
 that `.` is __not__ added to the list if `hs-source-dirs` is specified
 explicitly.

 So it's actually quite right that `Network/SocketByteString.cpphs` is not
 found for the executable which specifies `hs-source-dirs: tests`. Indeed
 if we change the file to  `Network/SocketByteString.hs` then we'll see
 that ghc cannot find the file, because we're passing `-i -itests` which
 means to clear the search path completely and then add `tests` to the
 search path.

 So why does it get found when we use a `.cpphs` file rather than a `.hs`
 file? Well that's the bug. The pre-processing code for executables was
 combining the search path for the executable with the search path for the
 library:

 {{{
 nub $ (hsSourceDirs bi)
   ++ (maybe [] (hsSourceDirs . libBuildInfo) (library pkg_descr)))
 }}}

 So the `.cpphs` source file got found and the pre-processed output then
 goes into a directory that we do tell ghc to look in and that's why it was
 being found.

 The consistent thing to do here is to use just `(hsSourceDirs bi)`. (`bi`
 here refers to the build info for the executable in question).

 So I think that fixes the inconsistency by bringing pre-processing into
 line with everything else.

-- 
Ticket URL: <http://hackage.haskell.org/trac/hackage/ticket/161#comment:5>
Hackage <http://haskell.org/cabal/>
Hackage: Cabal and related projects


More information about the cabal-devel mailing list