Skip to content

Instantly share code, notes, and snippets.

@wavewave
Created June 9, 2013 04:54
Show Gist options
  • Save wavewave/5737709 to your computer and use it in GitHub Desktop.
Save wavewave/5737709 to your computer and use it in GitHub Desktop.
fficxx example for snappy library
{-# LANGUAGE ScopedTypeVariables #-}
import Data.Monoid (mempty)
import System.FilePath ((</>))
import System.Directory (getCurrentDirectory)
import Text.StringTemplate hiding (render)
--
import FFICXX.Generate.Code.Cabal
import FFICXX.Generate.Code.Cpp
import FFICXX.Generate.Code.Dependency
import FFICXX.Generate.Config
import FFICXX.Generate.Code.Cpp
import FFICXX.Generate.Code.Dependency
import FFICXX.Generate.Config
import FFICXX.Generate.Generator.ContentMaker
import FFICXX.Generate.Generator.Driver
import FFICXX.Generate.Type.Annotate
import FFICXX.Generate.Type.Class
import FFICXX.Generate.Type.PackageInterface
import FFICXX.Generate.Util
--
import qualified FFICXX.Paths_fficxx as F
snappyclasses = [ ]
mycabal = Cabal { cabal_pkgname = "Snappy"
, cabal_cheaderprefix = "Snappy"
, cabal_moduleprefix = "Snappy" }
-- myclass = Class mycabal
source :: Class
source =
AbstractClass mycabal "Source" [] mempty
[ Virtual ulong_ "Available" []
, Virtual (cstar_ CTChar) "Peek" [ star CTULong "len" ]
, Virtual void_ "Skip" [ ulong "n" ]
]
sink :: Class
sink =
Class mycabal "Sink" [] mempty
[ Virtual void_ "Append" [ cstar CTChar "bytes", ulong "n" ]
, Virtual (cstar_ CTChar) "GetAppendBuffer" [ ulong "len", star CTChar "scratch" ]
]
byteArraySource :: Class
byteArraySource =
Class mycabal "ByteArraySource" [source] mempty
[ Constructor [ cstar CTChar "p", ulong "n" ]
]
uncheckedByteArraySink :: Class
uncheckedByteArraySink =
Class mycabal "UncheckedByteArraySink" [sink] mempty
[ Constructor [ star CTChar "dest" ]
, NonVirtual (star_ CTChar) "CurrentDestination" []
]
myclasses = [ source, sink, byteArraySource, uncheckedByteArraySink]
-- |
cabalTemplate :: String
cabalTemplate = "Pkg.cabal"
-- |
mkCabalFile :: FFICXXConfig
-> STGroup String
-> [ClassModule]
-> FilePath
-> IO ()
mkCabalFile config templates classmodules cabalfile = do
cpath <- getCurrentDirectory
let str = renderTemplateGroup
templates
[ ("pkgname", "Snappy")
, ("version", "0.0")
, ("license", "" )
, ("buildtype", "Simple")
, ("deps", "" )
, ("csrcFiles", genCsrcFiles classmodules)
, ("includeFiles", genIncludeFiles "Snappy" classmodules)
, ("cppFiles", genCppFiles classmodules)
, ("exposedModules", genExposedModules "Snappy" classmodules)
, ("otherModules", genOtherModules classmodules)
, ("extralibdirs", "" )
, ("extraincludedirs", "" )
, ("extralib", ", snappy")
, ("cabalIndentation", cabalIndentation)
]
cabalTemplate
writeFile cabalfile str
main :: IO ()
main = do
putStrLn "generate snappy"
cwd <- getCurrentDirectory
let cfg = FFICXXConfig { fficxxconfig_scriptBaseDir = cwd
, fficxxconfig_workingDir = cwd </> "working"
, fficxxconfig_installBaseDir = cwd </> "Snappy"
}
workingDir = fficxxconfig_workingDir cfg
installDir = fficxxconfig_installBaseDir cfg
pkgname = "Snappy"
(mods,cihs) = mkAllClassModulesAndCIH ("Snappy", (const ([NS "snappy"],["snappy-sinksource.h"]))) myclasses
hsbootlst = mkHSBOOTCandidateList mods
cglobal = mkGlobal myclasses
summarymodule = "Snappy"
cabalFileName = "Snappy.cabal"
templateDir <- F.getDataDir >>= return . (</> "template")
(templates :: STGroup String) <- directoryGroup templateDir
--
notExistThenCreate workingDir
notExistThenCreate installDir
notExistThenCreate (installDir </> "src")
notExistThenCreate (installDir </> "csrc")
--
putStrLn "cabal file generation"
mkCabalFile cfg templates mods (workingDir </> cabalFileName)
--
putStrLn "header file generation"
writeTypeDeclHeaders templates workingDir (TypMcro "__SNAPPY__") pkgname cihs
mapM_ (writeDeclHeaders templates workingDir (TypMcro "__SNAPPY__") pkgname) cihs
--
putStrLn "cpp file generation"
mapM_ (writeCppDef templates workingDir) cihs
--
putStrLn "RawType.hs file generation"
mapM_ (writeRawTypeHs templates workingDir) mods
--
putStrLn "FFI.hsc file generation"
mapM_ (writeFFIHsc templates workingDir) mods
--
putStrLn "Interface.hs file generation"
mapM_ (writeInterfaceHs mempty templates workingDir) mods
--
putStrLn "Cast.hs file generation"
mapM_ (writeCastHs templates workingDir) mods
--
putStrLn "Implementation.hs file generation"
mapM_ (writeImplementationHs mempty templates workingDir) mods
--
putStrLn "hs-boot file generation"
mapM_ (writeInterfaceHSBOOT templates workingDir) hsbootlst
--
putStrLn "module file generation"
mapM_ (writeModuleHs templates workingDir) mods
--
putStrLn "summary module generation generation"
writePkgHs summarymodule templates workingDir mods
--
putStrLn "copying"
copyFileWithMD5Check (workingDir </> cabalFileName) (installDir </> cabalFileName)
-- copyPredefined templateDir (srcDir ibase) pkgname
mapM_ (copyCppFiles workingDir (csrcDir installDir) pkgname) cihs
mapM_ (copyModule workingDir (srcDir installDir) summarymodule) mods
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment