Like the venerable MakeMaker, the Haskell Cabal build system greatly simplifies the task of writing distributable Haskell library. However, just like early version for MakeMaker, it is a pain to write a portable Pugs.cabal across 1.0 (shipped with GHC 6.4 and 6.4.1), 1.1.3 (shipped with some distros), and 1.1.4 (shipped with GHC 6.4.2).
One particularly annoying misfeature of Cabal 1.0 is that it does not support multiple location of source files; this was responsible for the accumulated third-party code under the src/ tree. However, that also created numerous build problems, such as the dreadful "Syck_stub.o not found".
In Israel, we worked around these issues by forcing a rebuild of our Syck binding (Data.Yaml.Syck) on every "make", and then massage the resulting object file back to libHSPugs.a by manually invoking ar. It's all in all very fragile.
Motivated by the licensing-cleanup effort of moving all non-Pugs modules from src/ to third-party/, and dakkar++'s report of a new crop of build failures with Cabal 1.1.3, I refactored out Syck into its own subdirectory, built automatically as part of "perl Makefile.PL". (It may move to "make" time in the future. Not sure...)
ohis not only sped up build time (by 20 seconds here) and removed a primary fragile spot from our build system, but also let other lambdafolks write YAML bindings with much more ease. Yay! :-)