Copyright | (c) 2003-2005 Isaac Jones Malcolm Wallace |
---|---|
License | BSD3 |
Maintainer | cabal-devel@haskell.org |
Portability | portable |
Safe Haskell | None |
Language | Haskell2010 |
This module defines PPSuffixHandler
, which is a combination of a file
extension and a function for configuring a PreProcessor
. It also defines
a bunch of known built-in preprocessors like cpp
, cpphs
, c2hs
,
hsc2hs
, happy
, alex
etc and lists them in knownSuffixHandlers
.
On top of this it provides a function for actually preprocessing some sources
given a bunch of known suffix handlers.
This module is not as good as it could be, it could really do with a rewrite
to address some of the problems we have with pre-processors.
Synopsis
- preprocessComponent :: PackageDescription -> Component -> LocalBuildInfo -> ComponentLocalBuildInfo -> Bool -> Verbosity -> [PPSuffixHandler] -> IO ()
- preprocessExtras :: Verbosity -> Component -> LocalBuildInfo -> IO [SymbolicPath Pkg 'File]
- preprocessFile :: Maybe (SymbolicPath CWD ('Dir Pkg)) -> [SymbolicPath Pkg ('Dir Source)] -> SymbolicPath Pkg ('Dir Build) -> Bool -> RelativePath Source 'File -> Verbosity -> [Suffix] -> [(Suffix, PreProcessor)] -> Bool -> IO ()
- knownSuffixHandlers :: [PPSuffixHandler]
- ppSuffixes :: [PPSuffixHandler] -> [Suffix]
- type PPSuffixHandler = (Suffix, BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor)
- newtype Suffix = Suffix String
- builtinHaskellSuffixes :: [Suffix]
- builtinHaskellBootSuffixes :: [Suffix]
- data PreProcessor = PreProcessor {
- platformIndependent :: Bool
- ppOrdering :: Verbosity -> [SymbolicPath Pkg ('Dir Source)] -> [ModuleName] -> IO [ModuleName]
- runPreProcessor :: PreProcessCommand
- mkSimplePreProcessor :: (FilePath -> FilePath -> Verbosity -> IO ()) -> (FilePath, FilePath) -> (FilePath, FilePath) -> Verbosity -> IO ()
- runSimplePreProcessor :: PreProcessor -> FilePath -> FilePath -> Verbosity -> IO ()
- ppCpp :: BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor
- ppCpp' :: [String] -> BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor
- ppGreenCard :: BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor
- ppC2hs :: BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor
- ppHsc2hs :: BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor
- ppHappy :: BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor
- ppAlex :: BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor
- ppUnlit :: PreProcessor
- platformDefines :: LocalBuildInfo -> [String]
- unsorted :: Verbosity -> [path] -> [ModuleName] -> IO [ModuleName]
Documentation
preprocessComponent :: PackageDescription -> Component -> LocalBuildInfo -> ComponentLocalBuildInfo -> Bool -> Verbosity -> [PPSuffixHandler] -> IO () Source #
Apply preprocessors to the sources from hsSourceDirs
for a given
component (lib, exe, or test suite).
XXX: This is terrible
preprocessExtras :: Verbosity -> Component -> LocalBuildInfo -> IO [SymbolicPath Pkg 'File] Source #
Find any extra C sources generated by preprocessing that need to be added to the component (addresses issue #238).
:: Maybe (SymbolicPath CWD ('Dir Pkg)) | package directory location |
-> [SymbolicPath Pkg ('Dir Source)] | source directories |
-> SymbolicPath Pkg ('Dir Build) | build directory |
-> Bool | preprocess for sdist |
-> RelativePath Source 'File | module file name |
-> Verbosity | verbosity |
-> [Suffix] | builtin suffixes |
-> [(Suffix, PreProcessor)] | possible preprocessors |
-> Bool | fail on missing file |
-> IO () |
Find the first extension of the file that exists, and preprocess it if required.
knownSuffixHandlers :: [PPSuffixHandler] Source #
Standard preprocessors: GreenCard, c2hs, hsc2hs, happy, alex and cpphs.
ppSuffixes :: [PPSuffixHandler] -> [Suffix] Source #
Convenience function; get the suffixes of these preprocessors.
type PPSuffixHandler = (Suffix, BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor) Source #
A preprocessor for turning non-Haskell files with the given Suffix
(i.e. file extension) into plain Haskell source files.
A suffix (or file extension).
Mostly used to decide which preprocessor to use, e.g. files with suffix "y"
are usually processed by the "happy"
build tool.
Instances
Pretty Suffix Source # | |||||
Defined in Distribution.Simple.PreProcess.Types | |||||
Structured Suffix Source # | |||||
Defined in Distribution.Simple.PreProcess.Types | |||||
Binary Suffix Source # | |||||
IsString Suffix Source # | |||||
Defined in Distribution.Simple.PreProcess.Types fromString :: String -> Suffix # | |||||
Generic Suffix Source # | |||||
Defined in Distribution.Simple.PreProcess.Types
| |||||
Show Suffix Source # | |||||
Eq Suffix Source # | |||||
Ord Suffix Source # | |||||
type Rep Suffix Source # | |||||
Defined in Distribution.Simple.PreProcess.Types |
data PreProcessor Source #
The interface to a preprocessor, which may be implemented using an external program, but need not be. The arguments are the name of the input file, the name of the output file and a verbosity level. Here is a simple example that merely prepends a comment to the given source file:
ppTestHandler :: PreProcessor ppTestHandler = PreProcessor { platformIndependent = True, runPreProcessor = mkSimplePreProcessor $ \inFile outFile verbosity -> do info verbosity (inFile++" has been preprocessed to "++outFile) stuff <- readFile inFile writeFile outFile ("-- preprocessed as a test\n\n" ++ stuff) return ExitSuccess
We split the input and output file names into a base directory and the rest of the file name. The input base dir is the path in the list of search dirs that this file was found in. The output base dir is the build dir where all the generated source files are put.
The reason for splitting it up this way is that some pre-processors don't simply generate one output .hs file from one input file but have dependencies on other generated files (notably c2hs, where building one .hs file may require reading other .chi files, and then compiling the .hs file may require reading a generated .h file). In these cases the generated files need to embed relative path names to each other (eg the generated .hs file mentions the .h file in the FFI imports). This path must be relative to the base directory where the generated files are located, it cannot be relative to the top level of the build tree because the compilers do not look for .h files relative to there, ie we do not use "-I .", instead we use "-I dist/build" (or whatever dist dir has been set by the user)
Most pre-processors do not care of course, so mkSimplePreProcessor and runSimplePreProcessor functions handle the simple case.
PreProcessor | |
|
mkSimplePreProcessor :: (FilePath -> FilePath -> Verbosity -> IO ()) -> (FilePath, FilePath) -> (FilePath, FilePath) -> Verbosity -> IO () Source #
runSimplePreProcessor :: PreProcessor -> FilePath -> FilePath -> Verbosity -> IO () Source #
ppCpp :: BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor Source #
ppCpp' :: [String] -> BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor Source #
ppC2hs :: BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor Source #
ppHappy :: BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor Source #
ppAlex :: BuildInfo -> LocalBuildInfo -> ComponentLocalBuildInfo -> PreProcessor Source #
platformDefines :: LocalBuildInfo -> [String] Source #
unsorted :: Verbosity -> [path] -> [ModuleName] -> IO [ModuleName] Source #
Just present the modules in the order given; this is the default and it is appropriate for preprocessors which do not have any sort of dependencies between modules.