aboutsummaryrefslogtreecommitdiff
path: root/bootstrap/src
diff options
context:
space:
mode:
Diffstat (limited to 'bootstrap/src')
-rw-r--r--bootstrap/src/Build.hs16
-rw-r--r--bootstrap/src/BuildModel.hs30
2 files changed, 32 insertions, 14 deletions
diff --git a/bootstrap/src/Build.hs b/bootstrap/src/Build.hs
index e4f9992..32d1979 100644
--- a/bootstrap/src/Build.hs
+++ b/bootstrap/src/Build.hs
@@ -7,7 +7,8 @@ module Build
)
where
-import BuildModel ( CompileTimeInfo(..)
+import BuildModel ( AvailableModule(..)
+ , CompileTimeInfo(..)
, RawSource(..)
, Source(..)
, constructCompileTimeInfo
@@ -45,6 +46,7 @@ import Development.Shake.FilePath ( exe
, (<.>)
)
import System.Environment ( setEnv )
+import System.FilePath ( takeBaseName )
import System.Process ( system )
import System.Directory ( createDirectoryIfMissing
, makeAbsolute
@@ -70,6 +72,7 @@ buildProgram
-> IO ()
buildProgram programDirectory' libraryDirectories sourceExtensions buildDirectory' (CompilerSettings { compilerSettingsCompiler = compiler, compilerSettingsFlags = flags, compilerSettingsModuleFlag = moduleFlag, compilerSettingsIncludeFlag = includeFlag }) programName programSource archives
= do
+ libraryModules <- findAvailableModules libraryDirectories
let programDirectory = foldl1 (</>) (splitDirectories programDirectory')
let buildDirectory = foldl1 (</>) (splitDirectories buildDirectory')
let includeFlags = map (includeFlag ++) libraryDirectories
@@ -80,7 +83,7 @@ buildProgram programDirectory' libraryDirectories sourceExtensions buildDirector
programSourceFileName p == programDirectory </> programSource
isThisProgramOrNotProgram _ = True
let sources = filter isThisProgramOrNotProgram sources'
- let availableModules = getAvailableModules sources
+ let availableModules = (getAvailableModules sources buildDirectory) ++ libraryModules
let compileTimeInfo = map
(\s -> constructCompileTimeInfo s availableModules buildDirectory)
sources
@@ -126,11 +129,12 @@ buildLibrary
-> IO (FilePath)
buildLibrary libraryDirectory sourceExtensions buildDirectory (CompilerSettings { compilerSettingsCompiler = compiler, compilerSettingsFlags = flags, compilerSettingsModuleFlag = moduleFlag, compilerSettingsIncludeFlag = includeFlag }) libraryName otherLibraryDirectories
= do
+ otherModules <- findAvailableModules otherLibraryDirectories
let includeFlags = map (includeFlag ++) otherLibraryDirectories
sourceFiles <- getDirectoriesFiles [libraryDirectory] sourceExtensions
rawSources <- mapM sourceFileToRawSource sourceFiles
let sources = map processRawSource rawSources
- let availableModules = getAvailableModules sources
+ let availableModules = (getAvailableModules sources buildDirectory) ++ otherModules
let compileTimeInfo = map
(\s -> constructCompileTimeInfo s availableModules buildDirectory)
sources
@@ -227,3 +231,9 @@ removeDriveLetter path | ':' `elem` path = (tail . dropWhile (/= ':')) path
changeSeparators :: String -> String
changeSeparators = replace "\\" "/"
+
+findAvailableModules :: [FilePath] -> IO [AvailableModule]
+findAvailableModules directories = do
+ moduleFiles <- getDirectoriesFiles directories ["*.mod"]
+ let availableModules = map (\mf -> AvailableModule { availableModuleName = takeBaseName mf, availableModuleFile = mf }) moduleFiles
+ return availableModules
diff --git a/bootstrap/src/BuildModel.hs b/bootstrap/src/BuildModel.hs
index 95d3cac..4ca5959 100644
--- a/bootstrap/src/BuildModel.hs
+++ b/bootstrap/src/BuildModel.hs
@@ -68,6 +68,11 @@ data CompileTimeInfo = CompileTimeInfo {
, compileTimeInfoDirectDependencies :: [FilePath]
}
+data AvailableModule = AvailableModule {
+ availableModuleName :: String
+ , availableModuleFile :: FilePath
+}
+
processRawSource :: RawSource -> Source
processRawSource rawSource =
let
@@ -102,11 +107,14 @@ processRawSource rawSource =
}
else undefined
-getAvailableModules :: [Source] -> [String]
-getAvailableModules = mapMaybe maybeModuleName
+getAvailableModules :: [Source] -> FilePath -> [AvailableModule]
+getAvailableModules sources buildDirectory = mapMaybe maybeModule sources
where
- maybeModuleName m@(Module{}) = Just $ moduleName m
- maybeModuleName _ = Nothing
+ maybeModule m@(Module{}) =
+ let mName = moduleName m
+ modFile = buildDirectory </> mName <.> "mod"
+ in Just $ AvailableModule { availableModuleName = mName, availableModuleFile = modFile }
+ maybeModule _ = Nothing
getAllObjectFiles :: FilePath -> [Source] -> [FilePath]
getAllObjectFiles buildDirectory sources = map getObjectFile sources
@@ -120,7 +128,7 @@ getSourceFileName p@(Program{} ) = programSourceFileName p
getSourceFileName m@(Module{} ) = moduleSourceFileName m
getSourceFileName s@(Submodule{}) = submoduleSourceFileName s
-constructCompileTimeInfo :: Source -> [String] -> FilePath -> CompileTimeInfo
+constructCompileTimeInfo :: Source -> [AvailableModule] -> FilePath -> CompileTimeInfo
constructCompileTimeInfo p@(Program{}) availableModules buildDirectory =
CompileTimeInfo
{ compileTimeInfoSourceFileName = programSourceFileName p
@@ -128,8 +136,8 @@ constructCompileTimeInfo p@(Program{}) availableModules buildDirectory =
buildDirectory
, compileTimeInfoOtherFilesProduced = []
, compileTimeInfoDirectDependencies = map
- (\mName -> buildDirectory </> mName <.> "mod")
- (filter (`elem` availableModules) (programModulesUsed p))
+ (\am -> availableModuleFile am)
+ (filter (\am -> (availableModuleName am) `elem` (programModulesUsed p)) availableModules)
}
constructCompileTimeInfo m@(Module{}) availableModules buildDirectory =
CompileTimeInfo
@@ -141,8 +149,8 @@ constructCompileTimeInfo m@(Module{}) availableModules buildDirectory =
then [buildDirectory </> moduleName m <.> "smod"]
else []
, compileTimeInfoDirectDependencies = map
- (\mName -> buildDirectory </> mName <.> "mod")
- (filter (`elem` availableModules) (moduleModulesUsed m))
+ (\am -> availableModuleFile am)
+ (filter (\am -> (availableModuleName am) `elem` (moduleModulesUsed m)) availableModules)
}
constructCompileTimeInfo s@(Submodule{}) availableModules buildDirectory =
CompileTimeInfo
@@ -157,8 +165,8 @@ constructCompileTimeInfo s@(Submodule{}) availableModules buildDirectory =
]
, compileTimeInfoDirectDependencies =
(buildDirectory </> submoduleParentName s <.> "smod")
- : (map (\mName -> buildDirectory </> mName <.> "mod")
- (filter (`elem` availableModules) (submoduleModulesUsed s))
+ : (map (\am -> availableModuleFile am)
+ (filter (\am -> (availableModuleName am) `elem` (submoduleModulesUsed s)) availableModules)
)
}