Skip to content

Commit e9a012a

Browse files
Merge pull request #268 from everythingfunctional/fix_hfpm_dependencies
Fix dependency tracking issue in bootstrap version
2 parents af67eae + d16cbbf commit e9a012a

File tree

5 files changed

+53
-26
lines changed

5 files changed

+53
-26
lines changed

bootstrap/src/Build.hs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ module Build
77
)
88
where
99

10-
import BuildModel ( CompileTimeInfo(..)
10+
import BuildModel ( AvailableModule(..)
11+
, CompileTimeInfo(..)
1112
, RawSource(..)
1213
, Source(..)
1314
, constructCompileTimeInfo
@@ -45,6 +46,7 @@ import Development.Shake.FilePath ( exe
4546
, (<.>)
4647
)
4748
import System.Environment ( setEnv )
49+
import System.FilePath ( takeBaseName )
4850
import System.Process ( system )
4951
import System.Directory ( createDirectoryIfMissing
5052
, makeAbsolute
@@ -70,6 +72,7 @@ buildProgram
7072
-> IO ()
7173
buildProgram programDirectory' libraryDirectories sourceExtensions buildDirectory' (CompilerSettings { compilerSettingsCompiler = compiler, compilerSettingsFlags = flags, compilerSettingsModuleFlag = moduleFlag, compilerSettingsIncludeFlag = includeFlag }) programName programSource archives
7274
= do
75+
libraryModules <- findAvailableModules libraryDirectories
7376
let programDirectory = foldl1 (</>) (splitDirectories programDirectory')
7477
let buildDirectory = foldl1 (</>) (splitDirectories buildDirectory')
7578
let includeFlags = map (includeFlag ++) libraryDirectories
@@ -80,7 +83,7 @@ buildProgram programDirectory' libraryDirectories sourceExtensions buildDirector
8083
programSourceFileName p == programDirectory </> programSource
8184
isThisProgramOrNotProgram _ = True
8285
let sources = filter isThisProgramOrNotProgram sources'
83-
let availableModules = getAvailableModules sources
86+
let availableModules = (getAvailableModules sources buildDirectory) ++ libraryModules
8487
let compileTimeInfo = map
8588
(\s -> constructCompileTimeInfo s availableModules buildDirectory)
8689
sources
@@ -126,11 +129,12 @@ buildLibrary
126129
-> IO (FilePath)
127130
buildLibrary libraryDirectory sourceExtensions buildDirectory (CompilerSettings { compilerSettingsCompiler = compiler, compilerSettingsFlags = flags, compilerSettingsModuleFlag = moduleFlag, compilerSettingsIncludeFlag = includeFlag }) libraryName otherLibraryDirectories
128131
= do
132+
otherModules <- findAvailableModules otherLibraryDirectories
129133
let includeFlags = map (includeFlag ++) otherLibraryDirectories
130134
sourceFiles <- getDirectoriesFiles [libraryDirectory] sourceExtensions
131135
rawSources <- mapM sourceFileToRawSource sourceFiles
132136
let sources = map processRawSource rawSources
133-
let availableModules = getAvailableModules sources
137+
let availableModules = (getAvailableModules sources buildDirectory) ++ otherModules
134138
let compileTimeInfo = map
135139
(\s -> constructCompileTimeInfo s availableModules buildDirectory)
136140
sources
@@ -227,3 +231,9 @@ removeDriveLetter path | ':' `elem` path = (tail . dropWhile (/= ':')) path
227231

228232
changeSeparators :: String -> String
229233
changeSeparators = replace "\\" "/"
234+
235+
findAvailableModules :: [FilePath] -> IO [AvailableModule]
236+
findAvailableModules directories = do
237+
moduleFiles <- getDirectoriesFiles directories ["*.mod"]
238+
let availableModules = map (\mf -> AvailableModule { availableModuleName = takeBaseName mf, availableModuleFile = mf }) moduleFiles
239+
return availableModules

bootstrap/src/BuildModel.hs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ data CompileTimeInfo = CompileTimeInfo {
6868
, compileTimeInfoDirectDependencies :: [FilePath]
6969
}
7070

71+
data AvailableModule = AvailableModule {
72+
availableModuleName :: String
73+
, availableModuleFile :: FilePath
74+
}
75+
7176
processRawSource :: RawSource -> Source
7277
processRawSource rawSource =
7378
let
@@ -102,11 +107,14 @@ processRawSource rawSource =
102107
}
103108
else undefined
104109

105-
getAvailableModules :: [Source] -> [String]
106-
getAvailableModules = mapMaybe maybeModuleName
110+
getAvailableModules :: [Source] -> FilePath -> [AvailableModule]
111+
getAvailableModules sources buildDirectory = mapMaybe maybeModule sources
107112
where
108-
maybeModuleName m@(Module{}) = Just $ moduleName m
109-
maybeModuleName _ = Nothing
113+
maybeModule m@(Module{}) =
114+
let mName = moduleName m
115+
modFile = buildDirectory </> mName <.> "mod"
116+
in Just $ AvailableModule { availableModuleName = mName, availableModuleFile = modFile }
117+
maybeModule _ = Nothing
110118

111119
getAllObjectFiles :: FilePath -> [Source] -> [FilePath]
112120
getAllObjectFiles buildDirectory sources = map getObjectFile sources
@@ -120,16 +128,16 @@ getSourceFileName p@(Program{} ) = programSourceFileName p
120128
getSourceFileName m@(Module{} ) = moduleSourceFileName m
121129
getSourceFileName s@(Submodule{}) = submoduleSourceFileName s
122130

123-
constructCompileTimeInfo :: Source -> [String] -> FilePath -> CompileTimeInfo
131+
constructCompileTimeInfo :: Source -> [AvailableModule] -> FilePath -> CompileTimeInfo
124132
constructCompileTimeInfo p@(Program{}) availableModules buildDirectory =
125133
CompileTimeInfo
126134
{ compileTimeInfoSourceFileName = programSourceFileName p
127135
, compileTimeInfoObjectFileProduced = (programObjectFileName p)
128136
buildDirectory
129137
, compileTimeInfoOtherFilesProduced = []
130138
, compileTimeInfoDirectDependencies = map
131-
(\mName -> buildDirectory </> mName <.> "mod")
132-
(filter (`elem` availableModules) (programModulesUsed p))
139+
(\am -> availableModuleFile am)
140+
(filter (\am -> (availableModuleName am) `elem` (programModulesUsed p)) availableModules)
133141
}
134142
constructCompileTimeInfo m@(Module{}) availableModules buildDirectory =
135143
CompileTimeInfo
@@ -141,8 +149,8 @@ constructCompileTimeInfo m@(Module{}) availableModules buildDirectory =
141149
then [buildDirectory </> moduleName m <.> "smod"]
142150
else []
143151
, compileTimeInfoDirectDependencies = map
144-
(\mName -> buildDirectory </> mName <.> "mod")
145-
(filter (`elem` availableModules) (moduleModulesUsed m))
152+
(\am -> availableModuleFile am)
153+
(filter (\am -> (availableModuleName am) `elem` (moduleModulesUsed m)) availableModules)
146154
}
147155
constructCompileTimeInfo s@(Submodule{}) availableModules buildDirectory =
148156
CompileTimeInfo
@@ -157,8 +165,8 @@ constructCompileTimeInfo s@(Submodule{}) availableModules buildDirectory =
157165
]
158166
, compileTimeInfoDirectDependencies =
159167
(buildDirectory </> submoduleParentName s <.> "smod")
160-
: (map (\mName -> buildDirectory </> mName <.> "mod")
161-
(filter (`elem` availableModules) (submoduleModulesUsed s))
168+
: (map (\am -> availableModuleFile am)
169+
(filter (\am -> (availableModuleName am) `elem` (submoduleModulesUsed s)) availableModules)
162170
)
163171
}
164172

bootstrap/unit_test/ModuleToCompileInfoTest.hs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ module ModuleToCompileInfoTest
33
)
44
where
55

6-
import BuildModel ( CompileTimeInfo(..)
6+
import BuildModel ( AvailableModule(..)
7+
, CompileTimeInfo(..)
78
, Source(..)
89
, constructCompileTimeInfo
910
)
@@ -43,10 +44,12 @@ exampleModule = Module
4344
moduleSourceFileName' :: FilePath
4445
moduleSourceFileName' = "some" </> "file" </> "somewhere.f90"
4546

46-
availableModules :: [String]
47-
availableModules = ["module1", "module3"]
47+
availableModules :: [AvailableModule]
48+
availableModules = [ AvailableModule {availableModuleName = "module1", availableModuleFile = "build_dir" </> "module1.mod"}
49+
, AvailableModule {availableModuleName = "module3", availableModuleFile = "build_dir" </> "module3.mod"}
50+
]
4851

49-
doCompileTimeTransformation :: (Source, [String]) -> CompileTimeInfo
52+
doCompileTimeTransformation :: (Source, [AvailableModule]) -> CompileTimeInfo
5053
doCompileTimeTransformation (programSource, otherSources) =
5154
constructCompileTimeInfo programSource otherSources "build_dir"
5255

bootstrap/unit_test/ProgramToCompileInfoTest.hs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ module ProgramToCompileInfoTest
33
)
44
where
55

6-
import BuildModel ( CompileTimeInfo(..)
6+
import BuildModel ( AvailableModule(..)
7+
, CompileTimeInfo(..)
78
, Source(..)
89
, constructCompileTimeInfo
910
)
@@ -42,10 +43,12 @@ exampleProgram = Program
4243
programSourceFileName' :: FilePath
4344
programSourceFileName' = "some" </> "file" </> "somewhere.f90"
4445

45-
availableModules :: [String]
46-
availableModules = ["module1", "module3"]
46+
availableModules :: [AvailableModule]
47+
availableModules = [ AvailableModule {availableModuleName = "module1", availableModuleFile = "build_dir" </> "module1.mod"}
48+
, AvailableModule {availableModuleName = "module3", availableModuleFile = "build_dir" </> "module3.mod"}
49+
]
4750

48-
doCompileTimeTransformation :: (Source, [String]) -> CompileTimeInfo
51+
doCompileTimeTransformation :: (Source, [AvailableModule]) -> CompileTimeInfo
4952
doCompileTimeTransformation (programSource, otherSources) =
5053
constructCompileTimeInfo programSource otherSources "build_dir"
5154

bootstrap/unit_test/SubmoduleToCompileInfoTest.hs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ module SubmoduleToCompileInfoTest
33
)
44
where
55

6-
import BuildModel ( CompileTimeInfo(..)
6+
import BuildModel ( AvailableModule(..)
7+
, CompileTimeInfo(..)
78
, Source(..)
89
, constructCompileTimeInfo
910
)
@@ -45,10 +46,12 @@ exampleSubmodule = Submodule
4546
submoduleSourceFileName' :: FilePath
4647
submoduleSourceFileName' = "some" </> "file" </> "somewhere.f90"
4748

48-
availableModules :: [String]
49-
availableModules = ["module1", "module3"]
49+
availableModules :: [AvailableModule]
50+
availableModules = [ AvailableModule {availableModuleName = "module1", availableModuleFile = "build_dir" </> "module1.mod"}
51+
, AvailableModule {availableModuleName = "module3", availableModuleFile = "build_dir" </> "module3.mod"}
52+
]
5053

51-
doCompileTimeTransformation :: (Source, [String]) -> CompileTimeInfo
54+
doCompileTimeTransformation :: (Source, [AvailableModule]) -> CompileTimeInfo
5255
doCompileTimeTransformation (programSource, otherSources) =
5356
constructCompileTimeInfo programSource otherSources "build_dir"
5457

0 commit comments

Comments
 (0)