Hi Kathleen,
> Is it possible to have a directory with multiple cabal files, telling
> cabal which file to use for a given install request by passing in a
> flag, say something like:
>
> cabal install -f pads.cabal
>
> or
>
> cabal install -f forest.cabal
>
> In other words, something like the -f option in make.
I would like to have that feature in cabal, too, and at first glance it looks
like a trivial thing to support. Unfortunately, it is not that easy. When we
think of build instructions for Cabal, we tend to think of the "pkgname.cabal"
file, but in fact that file is only half of it. The other half is "Setup.hs".
Now, the vast majority of Haskell packages doesn't use Setup.hs, because
building those packages is simple and the default settings hard-coded into
Cabal get the job done just fine. There are packages, however, that ship custom
written Setup.hs files that contains plenty of complex build know-how.
So, instead of saying "cabal install -f pads.cabal", we would really have to
say "cabal install -f1 pads.cabal -f2 Setup-pads.hs" or something like that. We
*could* do that, of course, but obviously the makers of Cabal felt that it's
easier to expect that separate packages live in separate directories, so that
Setup.hs can be called "Setup.hs" in every package.
Arguably, the choice to include the package name in the name of the Cabal file
is inconsistent with that decision, and that inconsistency is confusing. If you
look at a random package, then "foo.cabal" feels like a file that's specific to
this package, but "Setup.hs" feels like a file that is generic. In fact, both
are specific to this package, even though the name of the latter file doesn't
make that clear.
Take care,
Peter