Skip to content

Commit ed6222b

Browse files
authored
Merge branch 'master' into fix-window-run-test
2 parents 7f1611d + 447b4b2 commit ed6222b

14 files changed

+881
-139
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

fpm/fpm.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,7 @@ name = "fpm-test"
2929
source-dir = "test/fpm_test"
3030
main = "main.f90"
3131

32-
32+
[[test]]
33+
name = "help-test"
34+
source-dir = "test/help_test"
35+
main = "help_test.f90"

fpm/src/fpm.f90

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ module fpm
99
FPM_SCOPE_UNKNOWN, FPM_SCOPE_LIB, &
1010
FPM_SCOPE_DEP, FPM_SCOPE_APP, FPM_SCOPE_TEST, &
1111
FPM_TARGET_EXECUTABLE, FPM_TARGET_ARCHIVE
12+
use fpm_compiler, only: add_compile_flag_defaults
13+
1214

1315
use fpm_sources, only: add_executable_sources, add_sources_from_dir
1416
use fpm_targets, only: targets_from_sources, resolve_module_dependencies, &
@@ -153,11 +155,17 @@ subroutine build_model(model, settings, package, error)
153155
type(fpm_build_settings), intent(in) :: settings
154156
type(package_config_t), intent(in) :: package
155157
type(error_t), allocatable, intent(out) :: error
158+
type(string_t), allocatable :: package_list(:)
156159

157160
integer :: i
158-
type(string_t), allocatable :: package_list(:)
161+
162+
if(settings%verbose)then
163+
write(*,*)'<INFO>BUILD_NAME:',settings%build_name
164+
write(*,*)'<INFO>COMPILER: ',settings%compiler
165+
endif
159166

160167
model%package_name = package%name
168+
161169
if (allocated(package%build%link)) then
162170
model%link_libraries = package%build%link
163171
else
@@ -167,25 +175,17 @@ subroutine build_model(model, settings, package, error)
167175
allocate(package_list(1))
168176
package_list(1)%s = package%name
169177

170-
! #TODO: Choose flags and output directory based on cli settings & manifest inputs
171-
model%fortran_compiler = 'gfortran'
172-
173-
if(settings%release)then
174-
model%output_directory = join_path('build','gfortran_release')
175-
model%fortran_compile_flags=' &
176-
& -O3 &
177-
& -Wimplicit-interface &
178-
& -fPIC &
179-
& -fmax-errors=1 &
180-
& -ffast-math &
181-
& -funroll-loops ' // &
182-
& '-J'//join_path(model%output_directory,model%package_name)
178+
179+
if(settings%compiler.eq.'')then
180+
model%fortran_compiler = 'gfortran'
183181
else
184-
model%output_directory = join_path('build','gfortran_debug')
185-
model%fortran_compile_flags = ' -Wall -Wextra -Wimplicit-interface -fPIC -fmax-errors=1 -g '// &
186-
'-fbounds-check -fcheck-array-temporaries -fbacktrace '// &
187-
'-J'//join_path(model%output_directory,model%package_name)
182+
model%fortran_compiler = settings%compiler
188183
endif
184+
185+
model%output_directory = join_path('build',basename(model%fortran_compiler)//'_'//settings%build_name)
186+
187+
call add_compile_flag_defaults(settings%build_name, basename(model%fortran_compiler), model)
188+
189189
model%link_flags = ''
190190

191191
! Add sources from executable directories

fpm/src/fpm_backend.f90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ subroutine build_target(model,target)
204204
select case(target%target_type)
205205

206206
case (FPM_TARGET_OBJECT)
207-
call run("gfortran -c " // target%source%file_name // model%fortran_compile_flags &
207+
call run(model%fortran_compiler//" -c " // target%source%file_name // model%fortran_compile_flags &
208208
// " -o " // target%output_file)
209209

210210
case (FPM_TARGET_EXECUTABLE)
@@ -223,7 +223,7 @@ subroutine build_target(model,target)
223223
end if
224224
end if
225225

226-
call run("gfortran " // model%fortran_compile_flags &
226+
call run(model%fortran_compiler// " " // model%fortran_compile_flags &
227227
//" "//link_flags// " -o " // target%output_file)
228228

229229
case (FPM_TARGET_ARCHIVE)

0 commit comments

Comments
 (0)