diff --git a/ghc-mod.cabal b/ghc-mod.cabal index 7ae5944..e8be16a 100644 --- a/ghc-mod.cabal +++ b/ghc-mod.cabal @@ -184,15 +184,18 @@ Executable ghc-modi Main-Is: GHCModi.hs Other-Modules: Paths_ghc_mod Misc + Utils GHC-Options: -Wall -threaded -fno-warn-deprecations if os(windows) Cpp-Options: -DWINDOWS Default-Extensions: ConstraintKinds, FlexibleContexts - HS-Source-Dirs: src + HS-Source-Dirs: src, . Build-Depends: base >= 4.0 && < 5 , directory , filepath , process + , time + , old-time Test-Suite doctest Type: exitcode-stdio-1.0 diff --git a/src/GHCModi.hs b/src/GHCModi.hs index 3f5c90a..161bc76 100644 --- a/src/GHCModi.hs +++ b/src/GHCModi.hs @@ -5,16 +5,51 @@ module Main where +import Control.Applicative +import Control.Monad +import Control.Exception +import Data.Version +import Data.Maybe +import System.IO import System.Exit import System.Process import System.FilePath import System.Environment import Paths_ghc_mod +import Utils +import Prelude main :: IO () main = do + hPutStrLn stderr $ + "Warning: ghc-modi is deprecated please use 'ghc-mod legacy-interactive' instead" + args <- getArgs bindir <- getBinDir - (_, _, _, h) <- - createProcess $ proc (bindir "ghc-mod") $ ["legacy-interactive"] ++ args - exitWith =<< waitForProcess h + let installedExe = bindir "ghc-mod" + mexe <- mplus <$> mightExist installedExe <*> pathExe + case mexe of + Nothing -> do + hPutStrLn stderr $ + "ghc-modi: Could not find '"++installedExe++"', check your installation!" + exitWith $ ExitFailure 1 + + Just exe -> do + (_, _, _, h) <- + createProcess $ proc exe $ ["legacy-interactive"] ++ args + exitWith =<< waitForProcess h + +pathExe :: IO (Maybe String) +pathExe = do + ev <- try $ words <$> readProcess "ghc-mod" ["--version"] "" + let mexe = case ev of + Left (SomeException _) -> Nothing + Right ["ghc-mod", "version", ver + , "compiled", "by", "GHC", _] + | showVersion version == ver -> do + Just "ghc-mod" + Right _ -> Nothing + + when (isNothing mexe) $ + hPutStrLn stderr "ghc-modi: ghc-mod executable on PATH has different version, check your installation!" + return mexe