import Control.Applicative import Control.Monad import Data.List import Distribution.Simple import Distribution.Simple.LocalBuildInfo import Distribution.Simple.Setup import Distribution.Simple.Utils import System.Directory main = defaultMainWithHooks hooks hooks :: UserHooks hooks = simpleUserHooks { buildHook = \pkgDesc localBuildInfo hooks flags -> do let paths = (absoluteInstallDirs pkgDesc localBuildInfo dest) {- libsubdir = "" , datasubdir = "" -} dest = maybe NoCopyDest CopyTo $ flagToMaybe $ buildDistPref flags buildSystemDConfig localBuildInfo paths buildHook simpleUserHooks pkgDesc localBuildInfo hooks flags , copyHook = \pkgDesc localBuildInfo hooks flags -> do let paths = (absoluteInstallDirs pkgDesc localBuildInfo (fromFlag $ copyDest flags)) {- libsubdir = "" , datasubdir = "" -} dest = maybe NoCopyDest CopyTo $ flagToMaybe $ copyDistPref flags copySystemDConfig localBuildInfo paths flags copyHook simpleUserHooks pkgDesc localBuildInfo hooks flags } -- Drop a /-terminated prefix from a Filepath. The / is not dropped. dropPrefix :: String -> FilePath -> FilePath dropPrefix prefix s | prefix `isPrefixOf` s = drop (length prefix - 1) s | otherwise = s exestart :: FilePath -> InstallDirs FilePath -> String -> String exestart buildprefix paths cmd | "ExecStart=" `isPrefixOf` cmd = "ExecStart="++(dropPrefix buildprefix $ bindir paths) ++ "/presence" | otherwise = cmd buildSystemDConfig :: LocalBuildInfo -> InstallDirs FilePath -> IO () buildSystemDConfig buildInfo paths = do template <- lines <$> readFile "presence.service" let buildprefix = takeWhile (/='/') (buildDir buildInfo) ++ "/" service = map (exestart buildprefix paths) template createDirectoryIfMissing True (buildDir buildInfo) writeFile (buildDir buildInfo ++ "/presence.service") $ unlines service preferredSystemDPath prefix = case removeSlashes prefix of "" -> "/lib/systemd/system" "usr" -> "/lib/systemd/system" _ -> "/etc/systemd/system" removeSlashes prefix = reverse $ dropWhile (=='/') $ reverse $ dropWhile (=='/') prefix -- InstallDirs {prefix = "dest/usr/local" -- , bindir = "dest/usr/local/bin" -- , libdir = "dest/usr/local/lib/x86_64-linux-ghc-8.0.2/presence-0.0.1-1fqjx0Frxyf1ESoA9cNUiZ" -- , libsubdir = "" -- , dynlibdir = "dest/usr/local/lib/x86_64-linux-ghc-8.0.2" -- , libexecdir = "dest/usr/local/libexec" -- , includedir = "dest/usr/local/lib/x86_64-linux-ghc-8.0.2/presence-0.0.1-1fqjx0Frxyf1ESoA9cNUiZ/include" -- , datadir = "dest/usr/local/share/x86_64-linux-ghc-8.0.2/presence-0.0.1" -- , datasubdir = "" -- , docdir = "dest/usr/local/share/doc/x86_64-linux-ghc-8.0.2/presence-0.0.1" -- , mandir = "dest/usr/local/share/man" -- , htmldir = "dest/usr/local/share/doc/x86_64-linux-ghc-8.0.2/presence-0.0.1/html" -- , haddockdir = "dest/usr/local/share/doc/x86_64-linux-ghc-8.0.2/presence-0.0.1/html" -- , sysconfdir = "dest/usr/local/etc"} -- CopyFlags -- { copyDest = Flag (CopyTo "dest/") -- , copyDistPref = Flag "dist" -- , copyVerbosity = Flag Verbose} -- realprefix = dest/usr/local copySystemDConfig :: LocalBuildInfo -> InstallDirs FilePath -> CopyFlags -> IO () copySystemDConfig buildInfo paths flags = do -- print paths -- print flags let verbosity = fromFlag (copyVerbosity flags) built = buildDir buildInfo ++ "/presence.service" realprefix = dropPrefix dest (prefix paths) dest = case fromFlag (copyDest flags) of NoCopyDest -> "" CopyTo p -> p sysddir = dest ++ drop 1 (preferredSystemDPath realprefix) sysdpath = sysddir ++ "/presence.service" -- putStrLn $ "realprefix = " ++ realprefix -- putStrLn $ "no slashes = " ++ removeSlashes realprefix -- putStrLn $ "sysdpath = " ++ sysdpath createDirectoryIfMissing True sysddir installOrdinaryFile verbosity built sysdpath