[Haskell-cafe] Optional C dependencies / build-time feature toggles
simon at joyful.com
Wed Dec 14 16:06:26 UTC 2016
On 12/11/16 8:53 AM, Tobias Dammers wrote:
> 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. However,
> I'm also fine with making them compile-time feature toggles, such that
> users can enable only the ones they need. 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).
I asked for this, but indeed it's not easy to see how to implement it. I
will say that the C libs required by sprinkles are all widely used so
installing them wasn't too hard; and, it's nice having all of the power
available from the start.
Still, you may add more C-based storage back ends in future, and even
one C lib does create friction and slow down adoption.
compile-time cabal flags (cabal install sprinkles -fmysql -fpostgres)
add complexity for maintainer, tools and users. I suppose they might be
justified here. You'd have to decide on manual vs automatic flags
(toggleable by Cabal), and enabled or disabled by default. (If they are
enabled and automatic, and the required C lib is missing, will Cabal
quietly skip that feature or give an error ?).
The build-type: Configure suggestion sounds intriguing. A custom
Setup.hs for fancy install behaviour might also be interesting, at
minimum you could detect the C lib status and give more useful user
advice. These also add complexity.
Or, you could publish multiple semi-redundant packages - sprinkles,
sprinkles-postgres, sprinkles-mysql, sprinkles-sqlite, sprinkles-all,
sprinkles-lib... simpler packages, but more of them.
More information about the Haskell-Cafe