How to add use custom preprocessor in cabal

Hi folks, I am trying to integrate my own preprocessor into a cabal build process. But there are several points that I get stuck with. Could someone help me, please? A simplification of my problem: I have files "Abc.foo" and each of them should be transformed into "Abc.hs" by calling function "transform". The resulting "Abc.hs" files should then be exposed as Haskell library modules. 1. Question: How do I tell cabal that the file Abc.foo belongs to the package? After reading the User's Guide I had the impression that I should write something like Library Eposed-Modules: Abc.foo But this leads to a parse error. Adding a Data-Files: Abc.foo to the heading, on the other hand, does not seem to do anything. 2. Question: How to add the preprocessor? I have tried main = defaultMainWithHooks simpleUserHooks{hookedPreProcessors=[("foo",transformation)]} transformation :: BuildInfo -> LocalBuildInfo -> PreProcessor But under which circumstances will this function be called? Up to now I have not succeeded in making cabal call this function. Thanks for your time! Bernd

On Thu, 2009-10-08 at 17:28 +0200, Bernd Brassel wrote:
Hi folks,
I am trying to integrate my own preprocessor into a cabal build process. But there are several points that I get stuck with. Could someone help me, please?
A simplification of my problem: I have files "Abc.foo" and each of them should be transformed into "Abc.hs" by calling function "transform". The resulting "Abc.hs" files should then be exposed as Haskell library modules.
1. Question: How do I tell cabal that the file Abc.foo belongs to the package? After reading the User's Guide I had the impression that I should write something like
Library Eposed-Modules: Abc.foo
But this leads to a parse error.
Use Library Exposed-Modules: Abc It is a list of modules, not files.
Adding a
Data-Files: Abc.foo
to the heading, on the other hand, does not seem to do anything.
Right, those are for files that will be installed with the app and used at runtime.
2. Question: How to add the preprocessor? I have tried
main = defaultMainWithHooks simpleUserHooks{hookedPreProcessors=[("foo",transformation)]}
transformation :: BuildInfo -> LocalBuildInfo -> PreProcessor
That looks right. Here's how to complete it (example taken from the Cabal haddock docs for the PreProcess module): transformation _ _ = PreProcessor { platformIndependent = True, runPreProcessor = mkSimplePreProcessor $ \inFile outFile verbosity -> do fail $ "transformation: " ++ inFile ++ " " ++ outFile } and it works fine: runghc Setup.hs build Preprocessing library foo-1.0... Setup.hs: transformation: Abc.foo dist/build/Abc.hs
But under which circumstances will this function be called? Up to now I have not succeeded in making cabal call this function.
It calls it when it goes and looks for the module Abc (ie Abc.hs or .lhs), and since if does not find it, it'll check through the list of preprocessors and go looking for the corresponding files, ie Abc.foo. Duncan
participants (2)
-
Bernd Brassel
-
Duncan Coutts