public
Last active

Internal custom preprocessor example.

  • Download Gist
A.pre
1 2 3 4
module A where
 
a :: String
a = "hello from A"
Hello.hs
Haskell
1 2 3 4 5 6
module Main where
 
import A
 
main :: IO ()
main = putStrLn a
MyCustomPreprocessor.hs
Haskell
1 2 3 4 5 6 7 8 9
module Main where
 
import System.Directory
import System.Environment
 
main :: IO ()
main = do
(source:target:_) <- getArgs
copyFile source target
Setup.hs
Haskell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
{-# OPTIONS_GHC -Wall #-}
 
import Distribution.PackageDescription
import Distribution.Simple
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.PreProcess
import Distribution.Simple.Utils
import System.Exit
import System.FilePath
import System.Process (rawSystem)
 
main :: IO ()
main = defaultMainWithHooks
simpleUserHooks { hookedPreProcessors = [("pre", myCustomPreprocessor)] }
where
myCustomPreprocessor :: BuildInfo -> LocalBuildInfo -> PreProcessor
myCustomPreprocessor _bi lbi =
PreProcessor {
platformIndependent = True,
runPreProcessor = mkSimplePreProcessor $ \inFile outFile verbosity ->
do info verbosity ("Preprocessing " ++ inFile ++ " to " ++ outFile)
callProcess progPath [inFile, outFile]
}
where
builddir = buildDir lbi
progName = "my-custom-preprocessor"
progPath = builddir </> progName </> progName
 
-- Backwards compat with process < 1.2.
callProcess :: FilePath -> [String] -> IO ()
callProcess path args =
do exitCode <- rawSystem path args
case exitCode of ExitSuccess -> return ()
f@(ExitFailure _) -> fail $ "callProcess " ++ show path
++ " " ++ show args ++ " failed: "
++ show f
internal-preprocessor-test.cabal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
name: internal-preprocessor-test
version: 0.1.0.0
synopsis: Internal custom preprocessor example.
description: See https://github.com/haskell/cabal/issues/1541#issuecomment-30155513
license: GPL-3
author: Mikhail Glushenkov
maintainer: mikhail.glushenkov@gmail.com
category: Testing
build-type: Custom
cabal-version: >=1.10
 
-- Note that exe comes before the library.
-- The reason is backwards compat: old versions of Cabal (< 1.18)
-- don't have a proper component build graph, so components are
-- built in declaration order.
executable my-custom-preprocessor
main-is: MyCustomPreprocessor.hs
build-depends: base >=4.6 && <4.7, directory >= 1.0
default-language: Haskell2010
 
library
exposed-modules: A
build-depends: base >=4.6 && <4.7
build-tools: my-custom-preprocessor
-- ^ Note the internal dependency.
default-language: Haskell2010
 
executable hello-world
main-is: Hello.hs
build-depends: base >=4.6 && <4.7, internal-preprocessor-test
default-language: Haskell2010

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.