[Haskell-cafe] Optional C dependencies / build-time feature toggles

Edward Z. Yang ezyang at mit.edu
Tue Dec 13 06:14:27 UTC 2016


Excerpts from Tobias Dammers's message of 2016-12-11 17:53:07 +0100:
> The pipe dream would be for those dependencies to be optional *at run
> time*, such that the application would test for their presence on
> startup, or load them dynamically when and if they're needed.

It's not completely unthinkable to directly interface with dlopen()
and similar functions to dynamically load symbols.  posix even has
a (not very widely used) module for precisely this:
https://hackage.haskell.org/package/unix-2.7.2.1/docs/System-Posix-DynamicLinker.html

> However, I'm also fine with making them compile-time feature toggles,
> such that users can enable only the ones they need.

This is certainly what flags in Cabal files can be used for. More below.

> Doing some sort of autotools-style dependency discovery would of
> course be cool as well (i.e., only enable mysql support if
> libmysqlclient is present).

This is also possible using build-type: Configure, see:

http://cabal.readthedocs.io/en/latest/developing-packages.html#system-dependent-parameters

> > Question: I like to let the user enable extended functionality using a
> > Cabal flag. Is this the right way?
> >
> > Answer: Certainly not. Since other packages can distinguish packages
> > only according to their name and their version, it is not a good idea
> > to allow different APIs for the same package version. Cumbersome as it
> > is you have to move extra features to a separate package.
> 
> Moving the features to a separate package wouldn't really solve anything
> AFAICT, because I'd still have to bring them together somehow.

Yeah, this is something that gets a bit of push and pull, even amongst
Cabal developers.  It is definitely true that there's no way to depend
on a library, AND say that it must have some feature flag toggled, which
makes it impossible to accurately specify the dependency.  But for
an executable application, this seems like less of a problem because no
one can depend on you.  Seems a lot more reasonable in this situation.

Edward


More information about the Haskell-Cafe mailing list