@@ -97,6 +97,7 @@ compile' :: (Functor m, Applicative m, MonadError MultipleErrors m, MonadWriter
97 => Environment -> [Module] -> [String] -> m (String, String, Environment)
97 => Environment -> [Module] -> [String] -> m (String, String, Environment)
98compile' env ms prefix = do
98compile' env ms prefix = do
99 noPrelude <- asks optionsNoPrelude
99 noPrelude <- asks optionsNoPrelude
100+ unless noPrelude (checkPreludeIsDefined ms)
100 additional <- asks optionsAdditional
101 additional <- asks optionsAdditional
101 mainModuleIdent <- asks (fmap moduleNameFromString . optionsMain)
102 mainModuleIdent <- asks (fmap moduleNameFromString . optionsMain)
102 (sorted, _) <- sortModules $ map importPrim $ if noPrelude then ms else map importPrelude ms
103 (sorted, _) <- sortModules $ map importPrim $ if noPrelude then ms else map importPrelude ms
@@ -175,6 +176,7 @@ make :: forall m. (Functor m, Applicative m, Monad m, MonadMake m)
175 => FilePath -> [(Either RebuildPolicy FilePath, Module)] -> [String] -> m Environment
176 => FilePath -> [(Either RebuildPolicy FilePath, Module)] -> [String] -> m Environment
176make outputDir ms prefix = do
177make outputDir ms prefix = do
177 noPrelude <- asks optionsNoPrelude
178 noPrelude <- asks optionsNoPrelude
179+ unless noPrelude (checkPreludeIsDefined (map snd ms))
178 let filePathMap = M.fromList (map (\(fp, Module _ mn _ _) -> (mn, fp)) ms)
180 let filePathMap = M.fromList (map (\(fp, Module _ mn _ _) -> (mn, fp)) ms)
180 (sorted, graph) <- sortModules $ map importPrim $ if noPrelude then map snd ms else map (importPrelude . snd) ms
182 (sorted, graph) <- sortModules $ map importPrim $ if noPrelude then map snd ms else map (importPrelude . snd) ms
@@ -248,6 +250,12 @@ make outputDir ms prefix = do
248 [m'@(Module _ moduleName'' _ _)] | moduleName'' == moduleName' -> (:) (False, m') <$> rebuildIfNecessary graph toRebuild ms'
250 [m'@(Module _ moduleName'' _ _)] | moduleName'' == moduleName' -> (:) (False, m') <$> rebuildIfNecessary graph toRebuild ms'
249 _ -> throwError . errorMessage . InvalidExternsFile $ externsFile
251 _ -> throwError . errorMessage . InvalidExternsFile $ externsFile
253+checkPreludeIsDefined :: (MonadWriter MultipleErrors m) => [Module] -> m ()
254+checkPreludeIsDefined ms = do
255+ let mns = map getModuleName ms
256+ unless (preludeModuleName `elem` mns) $
257+ tell (errorMessage PreludeNotPresent)
251reverseDependencies :: ModuleGraph -> M.Map ModuleName [ModuleName]
259reverseDependencies :: ModuleGraph -> M.Map ModuleName [ModuleName]
252reverseDependencies g = combine [ (dep, mn) | (mn, deps) <- g, dep <- deps ]
260reverseDependencies g = combine [ (dep, mn) | (mn, deps) <- g, dep <- deps ]
@@ -269,8 +277,11 @@ addDefaultImport toImport m@(Module coms mn decls exps) =
269importPrim :: Module -> Module
277importPrim :: Module -> Module
270importPrim = addDefaultImport (ModuleName [ProperName C.prim])
278importPrim = addDefaultImport (ModuleName [ProperName C.prim])
280+preludeModuleName :: ModuleName
281+preludeModuleName = ModuleName [ProperName C.prelude]
272importPrelude :: Module -> Module
283importPrelude :: Module -> Module
273−importPrelude = addDefaultImport (ModuleName [ProperName C.prelude])
284+importPrelude = addDefaultImport preludeModuleName
275version :: Version
286version :: Version
276version = Paths.version
287version = Paths.version