clr-host-0.1.0.0: Setup.hs
import Distribution.PackageDescription
import Distribution.Simple
import Distribution.Simple.Configure(configure)
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Setup
import Distribution.Simple.Program
import Distribution.Verbosity as Verbosity
import Control.Applicative
import Control.Monad.Trans.Maybe
import Data.Maybe
import System.Directory
import System.FilePath
main = defaultMainWithHooks simpleUserHooks { confHook = configureClrHost
, buildHook = buildClrHost }
buildClrHost :: PackageDescription -> LocalBuildInfo -> UserHooks -> BuildFlags -> IO ()
buildClrHost pd lbi hooks bflags = do
let verbosity = fromFlagOrDefault Verbosity.normal (buildVerbosity bflags)
let progDb = withPrograms lbi
currentDir <- getCurrentDirectory
let src = currentDir </> "src" </> "Driver.cs"
let out = currentDir </> "src" </> "Driver.dll"
runDbProgram verbosity csharpCompiler progDb ["-filealign:512", "-optimize+", "-out:" ++ out, "-target:library", src]
buildHook simpleUserHooks pd lbi hooks bflags
configureClrHost :: (GenericPackageDescription, HookedBuildInfo) -> ConfigFlags -> IO LocalBuildInfo
configureClrHost (gpd,hbi) cf = do
lbi <- confHook simpleUserHooks (gpd, hbi) cf
let verbosity = fromFlagOrDefault Verbosity.normal (configVerbosity (configFlags lbi))
(cfgdProg, progDb) <- requireProgram verbosity csharpCompiler (withPrograms lbi)
let lbi' = lbi { withPrograms = progDb } :: LocalBuildInfo
return lbi'
cscFindLocation :: Verbosity -> ProgramSearchPath -> IO (Maybe (FilePath, [FilePath]))
cscFindLocation verb path = runMaybeT $ findExec "mcs"
<|> findExec "csc"
<|> findExec "C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\csc"
where findExec name = MaybeT $ findProgramOnSearchPath verb path name
csharpCompiler :: Program
csharpCompiler = (simpleProgram "csc") { programFindLocation = cscFindLocation }