fficxx-0.2.1: sample/mysample-generator/MySampleGen.hs
{-# LANGUAGE ScopedTypeVariables #-}
import Data.Default (def)
import Data.Monoid (mempty)
import System.FilePath ((</>))
import System.Directory (getCurrentDirectory)
import Text.StringTemplate hiding (render)
--
import FFICXX.Generate.Builder (mkCabalFile)
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 qualified FFICXX.Paths_fficxx as F
mysampleclasses = [ ]
mycabal = Cabal { cabal_pkgname = "MySample"
, cabal_cheaderprefix = "MySample"
, cabal_moduleprefix = "MySample"
}
myclass = Class mycabal
a :: Class
a = myclass "A" [] mempty Nothing
[ Constructor [] Nothing
, Virtual void_ "Foo" [ ] Nothing
, Virtual void_ "Foo2" [ long "t" ] Nothing
]
b :: Class
b = myclass "B" [a] mempty Nothing
[ Constructor [] Nothing
, Virtual void_ "Bar" [] Nothing
]
myclasses = [ a, b]
toplevelfunctions = [ ]
main :: IO ()
main = do
putStrLn "generate mysample"
cwd <- getCurrentDirectory
let mycabalattr = def
{ cabalattr_extralibdirs = [cwd </> ".." </> "cxxlib" </> "lib"]
, cabalattr_extraincludedirs = [cwd </> ".." </> "cxxlib" </> "include"]
}
cfg = FFICXXConfig { fficxxconfig_scriptBaseDir = cwd
, fficxxconfig_workingDir = cwd </> "working"
, fficxxconfig_installBaseDir = cwd </> "MySample"
}
workingDir = fficxxconfig_workingDir cfg
installDir = fficxxconfig_installBaseDir cfg
pkgname = "MySample"
(mods,cihs,tih) = mkAll_ClassModules_CIH_TIH ("MySample", (\c->([],[HdrName $ class_name c ++ ".h"]))) (myclasses,toplevelfunctions)
hsbootlst = mkHSBOOTCandidateList mods
cglobal = mkGlobal myclasses
summarymodule = "MySample"
cabalFileName = "MySample.cabal"
extralibs = ["mysample"]
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 (mycabal, mycabalattr) summarymodule (tih, mods) extralibs (workingDir </> cabalFileName)
--
putStrLn "header file generation"
writeTypeDeclHeaders templates workingDir (TypMcro "__MYSAMPLE__") pkgname cihs
mapM_ (writeDeclHeaders templates workingDir (TypMcro "__MYSAMPLE__") 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 tih
--
putStrLn "copying"
copyFileWithMD5Check (workingDir </> cabalFileName) (installDir </> cabalFileName)
-- copyPredefined templateDir (srcDir ibase) pkgname
copyCppFiles workingDir (csrcDir installDir) pkgname (tih,cihs)
mapM_ (copyModule workingDir (srcDir installDir) summarymodule) mods