module Ros.Internal.SetupUtil (rosBuild, rosConf) where
import Control.Applicative
import Data.List (intercalate)
import Distribution.Simple
import Distribution.Simple.InstallDirs
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Setup
import Distribution.PackageDescription hiding (Library)
import System.Directory (getCurrentDirectory)
import System.FilePath ((</>))
import Ros.Internal.DepFinder
data Buildable = LibraryAndExecutables [String]
| Executables [String]
addRosMsgPaths :: Buildable -> IO HookedBuildInfo
addRosMsgPaths targets =
do dir <- getCurrentDirectory
msgPaths <- map (</>"msg"</>"haskell") <$> findPackageDeps dir
writeFile ".ghci" $ ":set -i"++ intercalate ":" msgPaths
let binfo = emptyBuildInfo { hsSourceDirs = msgPaths }
case targets of
LibraryAndExecutables exes -> return (Just binfo, map (,binfo) exes)
Executables exes -> return (Nothing, map (,binfo) exes)
rosBuild :: PackageDescription -> LocalBuildInfo -> UserHooks ->
BuildFlags -> IO ()
rosBuild pkg lbi uh bfs = do binfo <- addRosMsgPaths targets
let pkg' = updatePackageDescription binfo pkg
(buildHook simpleUserHooks) pkg' lbi uh bfs
where exeTargets = map exeName $ executables pkg
targets = case library pkg of
Nothing -> Executables exeTargets
Just _ -> LibraryAndExecutables exeTargets
rosConf :: (GenericPackageDescription, HookedBuildInfo) -> ConfigFlags ->
IO LocalBuildInfo
rosConf x cf = do lbi <- (confHook simpleUserHooks) x cf
let oldDirs = installDirTemplates lbi
customDirs = oldDirs { bindir = toPathTemplate "bin" }
lbi' = lbi { installDirTemplates = customDirs }
return lbi'