Using --make with -odir and hierarchical modules

Sven Panne Sven.Panne@informatik.uni-muenchen.de
Sat, 18 Jan 2003 12:40:49 +0100


Henrik Nilsson wrote:

 > [...] Well, ar does not support directories anyway, so if the objective
 > here is to build a link library, the leaf names had better be distinct.
 > (At least GNU make does seem to allow putting two object files with the
 > same name into a link library if done as a single operation, but my guess
 > is that doing so is asking for trouble.) [...]

Allowing leaf names to be equal is essential for the whole hierarchical
module business! Otherwise you would get evil non-local interactions
between different modules. And in practice it doesn't seem to be a problem
for ar/ld, because the base package and the GLUT package have lots of
examples for equal leaf names (see below). I'm not sure how ar/ld handle
this exactly, but I guess it works because of an index in the archive. From
the Linux ar man page:

        ...
        ar creates an index to the symbols defined in  relocatable
        object  modules  in the archive when you specify the modi
        fier s.  Once  created,  this  index  is  updated  in  the
        archive  whenever  ar makes a change to its contents (save
        for the q update operation).   An  archive  with  such  an
        index  speeds  up  linking to the library, and allows rou
        tines in the library to call each other without regard  to
        their placement in the archive.

        You  may  use nm -s or nm --print-armap to list this index
        table.  If an archive lacks the table, another form of  ar
        called ranlib can be used to add just the table.
        ...

Newer ar versions to add this index automatically, other need an explicit
ranlib. The GHC installation process takes care of that automatically.

Cheers,
    S.

---------------------------------------------------------------------------
Leaf name "clashes" in the current GHC version:

libHSGLUT.a:
    Graphics.UI.GLUT.Window
    Graphics.UI.GLUT.Callbacks.Window

libHSbase.a:
    Data.Array
    Foreign.Marshal.Array

    Data.Array.Base
    GHC.Base

    Data.Char
    Text.ParserCombinators.Parsec.Char

    Control.Monad.Error
    Foreign.C.Error
    Foreign.Marshal.Error
    System.IO.Error
    Text.ParserCombinators.Parsec.Error

    Control.Exception
    GHC.Exception

    Data.Array.IO
    GHC.IO
    System.IO

    Data.Int
    GHC.Int

    Control.Monad.ST.Lazy
    Data.STRef.Lazy

    Control.Monad.List
    Data.List
    GHC.List

    GHC.Posix
    Text.Regex.Posix

    Foreign.Ptr
    GHC.Ptr

    GHC.Read
    Text.Read

    Data.STRef
    GHC.STRef

    Control.Monad.ST
    Data.Array.ST
    GHC.ST

    GHC.Show
    Text.Show

    Data.Array.Storable
    Foreign.Storable
    GHC.Storable

    Control.Monad.ST.Strict
    Data.STRef.Strict

    Foreign.C.Types
    System.Posix.Types

    Debug.QuickCheck.Utils
    Foreign.Marshal.Utils

    GHC.Weak
    System.Mem.Weak