patch applied (packages/regex-base): Make setupscriptcompileagain after recent Cabal changes

Claus Reinke claus.reinke at talk21.com
Sat Sep 1 18:48:34 EDT 2007


> That wouldn't work, as packages can't re-export modules.  And even if
> they could, this method would be very awkward.  This is about the third
> time that base has shrunk, and hopefully not the last.  This protocol
> would leave us with some rather awkward names.

that sounds like a design flaw (and i believe it isn't the first time
module re-export has come up?). yes, proxies are awkward, but
less so than breakage. and nice names that don't do what they say
are not nice at all, either. it is the problem itself that is awkward,
and proxies are the only solution i know that works without relying
on all clients following your development changes manually.

the idea of such proxies is to allow refactorings to cross externally
visible apis, from library code to client code, without breaking code:
you refactor your library, so that the old api becomes a thin proxy
over your new api; then you release your new library, together with
the proxy; then you deprecate the proxy; clients who can't or don't
want to refactor their code can keep using the proxies, whereas
clients who do get around to cleaning up their code can continue
the refactoring you started in your library code, in their client code,
eliminating their uses of the proxy.

i just did a little experiment, with ghc-6.6.1. consider:

    -- Y.hs
    module Main where
    import Data.Time
    main = print =<< getCurrentTime


this module will not compile without '-package time' or --make:

    $ ghc  Y.hs
    Y.o(.text+0xb1):fake: undefined reference to 
`timezm1zi1zi1_DataziTimeziLocalTimeziLocalTime_zdf1_cl
osure'
    Y.o(.text+0x115):fake: undefined reference to 
`timezm1zi1zi1_DataziTimeziClock_getCurrentTime_closur
e'
    Y.o(.rodata+0xc):fake: undefined reference to 
`timezm1zi1zi1_DataziTimeziLocalTimeziLocalTime_zdf1_c
losure'
    Y.o(.rodata+0x10):fake: undefined reference to 
`timezm1zi1zi1_DataziTimeziClock_getCurrentTime_closu
re'
    collect2: ld returned 1 exit status

now, consider this cabal package, the only purpose of which will
be to make Y.hs compileable:

    -- P.cabal
    License:        BSD3
    Author:
    Homepage:
    Category:
    Build-Depends:  base, time
    Synopsis:       testing proxy packaging
    Exposed-modules: Data
    Extensions:

    -- Setup.hs
    import Distribution.Simple
    main = defaultMain

    -- Data.hs (yes..)
    module Data(module Time) where
    import Data.Time as Time

configure, build, install, and 'ghc -package P Y.hs' seems to work.

    $ ghc -package P Y.hs

    $ ./main.exe
    2007-09-01 22:35:05 UTC

would something like this work for base splitting?

> Cabal really is a special case.  The API is still much too immature to
> stabilize, which is why it's handled differently from the other libraries.
> It was never claimed to be stable.

it is now in use. therefore (apart from differences between theory
and practice;-) there should be a stable version. i assume most
cabal-specific breakage is due to early use beyond that stable api?

claus





More information about the Libraries mailing list