Created
June 9, 2013 04:54
-
-
Save wavewave/5737709 to your computer and use it in GitHub Desktop.
fficxx example for snappy library
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {-# 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