Skip to content

Instantly share code, notes, and snippets.

@23Skidoo
Last active December 31, 2015 03:59
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save 23Skidoo/7930870 to your computer and use it in GitHub Desktop.
Internal custom preprocessor example.
module A where
a :: String
a = "hello from A"
module Main where
import A
main :: IO ()
main = putStrLn a
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
module Main where
import System.Directory
import System.Environment
main :: IO ()
main = do
(source:target:_) <- getArgs
copyFile source target
{-# 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment