module Main(main) where import System.Directory import System.Environment import IO import Util.Extra import Flags import Core.View import System.FilePath import Make import Error import Package -- read the base path from the environment variable -- the include files will be search for from that location -- otherwise use the base file path getBasePath :: IO String getBasePath = catch (getEnv "YHC_BASE_PATH") errHandle where errHandle e = do res <- findExecutable "yhc" case res of Nothing -> do putStrLn $ "Warning: the environment variable YHC_BASE_PATH is not set\n" ++ " and yhc cannot be found on the path" return "" Just x -> return $ takeDirectory $ takeDirectory x -- program start point main :: IO () main = do basePath <- getBasePath args <- getArgs let flags = fixFlags basePath (processArgs args) let yhcVERSION = "(unversioned)" if sVersion flags then putStrLn $ "yhc: The York Haskell Compiler version " ++ yhcVERSION else if sHelp flags then putStr $ printUsage True else if not $ null $ sViewCore flags then mapM_ (\x -> getFile ["ycr"] x >>= viewCore) (sViewCore flags) else if null (sRootFile flags) then putStr $ printUsage False else do realFile <- getHaskellFile (sRootFile flags) make flags realFile where fixFlags base flags = flags { sPreludes = (base ++ "/include") : sPreludes flags, sBasePath = base } -- | From the file path the user gave, figure out the file path they meant -- in particular add .hs or .lhs if they missed it getHaskellFile :: FilePath -> IO FilePath getHaskellFile = getFile ["hs","lhs"] getFile :: [String] -> FilePath -> IO FilePath getFile exts orig = do full <- canonicalizePath orig b <- doesFileExist full if b then return full else do res <- mapM (f full) exts case concat res of [] -> getOneModule orig [x] -> return x xs -> raiseError $ ErrorFileMany noErrPos "Typed at the console" full xs where f full ext = do let s2 = full <.> ext b <- doesFileExist s2 return [s2 | b]