Skip to content

Commit c2e043b

Browse files
Merge pull request #289 from everythingfunctional/bootstrap_compiler_support
Add support for same compilers as Fortran version to Haskell version
2 parents deffb94 + 3ee23d8 commit c2e043b

File tree

2 files changed

+201
-5
lines changed

2 files changed

+201
-5
lines changed

bootstrap/src/Build.hs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ buildProgram programDirectory' libraryDirectories sourceExtensions buildDirector
7575
libraryModules <- findAvailableModules libraryDirectories
7676
let programDirectory = foldl1 (</>) (splitDirectories programDirectory')
7777
let buildDirectory = foldl1 (</>) (splitDirectories buildDirectory')
78-
let includeFlags = map (includeFlag ++) libraryDirectories
78+
let includeFlags = (includeFlag ++ buildDirectory) : map (includeFlag ++) libraryDirectories
7979
sourceFiles <- getDirectoriesFiles [programDirectory] sourceExtensions
8080
rawSources <- mapM sourceFileToRawSource sourceFiles
8181
let sources' = map processRawSource rawSources
@@ -108,7 +108,7 @@ buildProgram programDirectory' libraryDirectories sourceExtensions buildDirector
108108
in fileMatcher &?> \(objectFile : _) -> do
109109
need (sourceFile : directDependencies)
110110
cmd compiler
111-
["-c", moduleFlag ++ buildDirectory]
111+
["-c", moduleFlag, buildDirectory]
112112
includeFlags
113113
flags
114114
["-o", objectFile, sourceFile]
@@ -130,7 +130,7 @@ buildLibrary
130130
buildLibrary libraryDirectory sourceExtensions buildDirectory (CompilerSettings { compilerSettingsCompiler = compiler, compilerSettingsFlags = flags, compilerSettingsModuleFlag = moduleFlag, compilerSettingsIncludeFlag = includeFlag }) libraryName otherLibraryDirectories
131131
= do
132132
otherModules <- findAvailableModules otherLibraryDirectories
133-
let includeFlags = map (includeFlag ++) otherLibraryDirectories
133+
let includeFlags = (includeFlag ++ buildDirectory) : map (includeFlag ++) otherLibraryDirectories
134134
sourceFiles <- getDirectoriesFiles [libraryDirectory] sourceExtensions
135135
rawSources <- mapM sourceFileToRawSource sourceFiles
136136
let sources = map processRawSource rawSources
@@ -160,7 +160,7 @@ buildLibrary libraryDirectory sourceExtensions buildDirectory (CompilerSettings
160160
in fileMatcher &?> \(objectFile : _) -> do
161161
need (sourceFile : directDependencies)
162162
cmd compiler
163-
["-c", moduleFlag ++ buildDirectory]
163+
["-c", moduleFlag, buildDirectory]
164164
includeFlags
165165
flags
166166
["-o", objectFile, sourceFile]

bootstrap/src/Fpm.hs

Lines changed: 197 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ import System.Exit ( ExitCode(..)
7171
, exitWith
7272
)
7373
import System.Process ( readProcess
74+
, readProcessWithExitCode
7475
, system
7576
)
7677
import Toml ( TomlCodec
@@ -733,6 +734,185 @@ defineCompilerSettings specifiedFlags compiler release
733734
, compilerSettingsModuleFlag = "-J"
734735
, compilerSettingsIncludeFlag = "-I"
735736
}
737+
| "f95" `isInfixOf` compiler
738+
= let flags = case specifiedFlags of
739+
[] -> if release
740+
then
741+
[ "-O3"
742+
, "-Wimplicit-interface"
743+
, "-fPIC"
744+
, "-fmax-errors=1"
745+
, "-ffast-math"
746+
, "-funroll-loops"
747+
]
748+
else
749+
[ "-Wall"
750+
, "-Wextra"
751+
, "-Wimplicit-interface"
752+
, "-fPIC"
753+
, "-fmax-errors=1"
754+
, "-g"
755+
, "-fbounds-check"
756+
, "-fcheck-array-temporaries"
757+
, "-Wno-maybe-uninitialized"
758+
, "-Wno-uninitialized"
759+
, "-fbacktrace"
760+
]
761+
fs -> fs
762+
in return $ CompilerSettings { compilerSettingsCompiler = compiler
763+
, compilerSettingsFlags = flags
764+
, compilerSettingsModuleFlag = "-J"
765+
, compilerSettingsIncludeFlag = "-I"
766+
}
767+
| "nvfortran" `isInfixOf` compiler
768+
= let flags = case specifiedFlags of
769+
[] -> if release
770+
then
771+
[ "-Mbackslash"
772+
]
773+
else
774+
[ "-Minform=inform"
775+
, "-Mbackslash"
776+
, "-g"
777+
, "-Mbounds"
778+
, "-Mchkptr"
779+
, "-Mchkstk"
780+
, "-traceback"
781+
]
782+
fs -> fs
783+
in return $ CompilerSettings { compilerSettingsCompiler = compiler
784+
, compilerSettingsFlags = flags
785+
, compilerSettingsModuleFlag = "-module"
786+
, compilerSettingsIncludeFlag = "-I"
787+
}
788+
| "ifort" `isInfixOf` compiler
789+
= let flags = case specifiedFlags of
790+
[] -> if release
791+
then
792+
[ "-fp-model", "precise"
793+
, "-pc", "64"
794+
, "-align", "all"
795+
, "-error-limit", "1"
796+
, "-reentrancy", "threaded"
797+
, "-nogen-interfaces"
798+
, "-assume", "byterecl"
799+
, "-assume", "nounderscore"
800+
]
801+
else
802+
[ "-warn", "all"
803+
, "-check:all:noarg_temp_created"
804+
, "-error-limit", "1"
805+
, "-O0"
806+
, "-g"
807+
, "-assume", "byterecl"
808+
, "-traceback"
809+
]
810+
fs -> fs
811+
in return $ CompilerSettings { compilerSettingsCompiler = compiler
812+
, compilerSettingsFlags = flags
813+
, compilerSettingsModuleFlag = "-module"
814+
, compilerSettingsIncludeFlag = "-I"
815+
}
816+
| "ifx" `isInfixOf` compiler
817+
= let flags = case specifiedFlags of
818+
[] -> if release
819+
then
820+
[]
821+
else
822+
[]
823+
fs -> fs
824+
in return $ CompilerSettings { compilerSettingsCompiler = compiler
825+
, compilerSettingsFlags = flags
826+
, compilerSettingsModuleFlag = "-module"
827+
, compilerSettingsIncludeFlag = "-I"
828+
}
829+
| "pgfortran" `isInfixOf` compiler || "pgf90" `isInfixOf` compiler || "pgf95" `isInfixOf` compiler
830+
= let flags = case specifiedFlags of
831+
[] -> if release
832+
then
833+
[]
834+
else
835+
[]
836+
fs -> fs
837+
in return $ CompilerSettings { compilerSettingsCompiler = compiler
838+
, compilerSettingsFlags = flags
839+
, compilerSettingsModuleFlag = "-module"
840+
, compilerSettingsIncludeFlag = "-I"
841+
}
842+
| "flang" `isInfixOf` compiler
843+
= let flags = case specifiedFlags of
844+
[] -> if release
845+
then
846+
[]
847+
else
848+
[]
849+
fs -> fs
850+
in return $ CompilerSettings { compilerSettingsCompiler = compiler
851+
, compilerSettingsFlags = flags
852+
, compilerSettingsModuleFlag = "-module"
853+
, compilerSettingsIncludeFlag = "-I"
854+
}
855+
| "lfc" `isInfixOf` compiler
856+
= let flags = case specifiedFlags of
857+
[] -> if release
858+
then
859+
[]
860+
else
861+
[]
862+
fs -> fs
863+
in return $ CompilerSettings { compilerSettingsCompiler = compiler
864+
, compilerSettingsFlags = flags
865+
, compilerSettingsModuleFlag = "-M"
866+
, compilerSettingsIncludeFlag = "-I"
867+
}
868+
| "nagfor" `isInfixOf` compiler
869+
= let flags = case specifiedFlags of
870+
[] -> if release
871+
then
872+
[ "-O4"
873+
, "-coarray=single"
874+
, "-PIC"
875+
]
876+
else
877+
[ "-g"
878+
, "-C=all"
879+
, "-O0"
880+
, "-gline"
881+
, "-coarray=single"
882+
, "-PIC"
883+
]
884+
fs -> fs
885+
in return $ CompilerSettings { compilerSettingsCompiler = compiler
886+
, compilerSettingsFlags = flags
887+
, compilerSettingsModuleFlag = "-mdir"
888+
, compilerSettingsIncludeFlag = "-I"
889+
}
890+
| "crayftn" `isInfixOf` compiler
891+
= let flags = case specifiedFlags of
892+
[] -> if release
893+
then
894+
[]
895+
else
896+
[]
897+
fs -> fs
898+
in return $ CompilerSettings { compilerSettingsCompiler = compiler
899+
, compilerSettingsFlags = flags
900+
, compilerSettingsModuleFlag = "-J"
901+
, compilerSettingsIncludeFlag = "-I"
902+
}
903+
| "xlf90" `isInfixOf` compiler
904+
= let flags = case specifiedFlags of
905+
[] -> if release
906+
then
907+
[]
908+
else
909+
[]
910+
fs -> fs
911+
in return $ CompilerSettings { compilerSettingsCompiler = compiler
912+
, compilerSettingsFlags = flags
913+
, compilerSettingsModuleFlag = "-qmoddir"
914+
, compilerSettingsIncludeFlag = "-I"
915+
}
736916
| otherwise
737917
= do
738918
putStrLn $ "Sorry, compiler is currently unsupported: " ++ compiler
@@ -808,7 +988,23 @@ makeBuildPrefix :: FilePath -> [String] -> IO FilePath
808988
makeBuildPrefix compiler flags = do
809989
-- TODO Figure out what other info should be part of this
810990
-- Probably version, and make sure to not include path to the compiler
811-
versionInfo <- readProcess compiler ["--version"] []
991+
versionInfo <- do
992+
(exitCode, stdout, stderr) <- readProcessWithExitCode compiler
993+
["--version"]
994+
[]
995+
case exitCode of
996+
ExitSuccess -> case stdout of
997+
"" -> return stderr -- Guess this compiler outputs version info to stderr instead?
998+
_ -> return stdout
999+
_ -> do -- guess this compiler doesn't support the --version option. let's try -version
1000+
(exitCode, stdout, stderr) <- readProcessWithExitCode compiler
1001+
["-version"]
1002+
[]
1003+
case exitCode of
1004+
ExitSuccess -> case stdout of
1005+
"" -> return stderr -- Guess this compiler outputs version info to stderr instead?
1006+
_ -> return stdout
1007+
_ -> return "" -- Don't know how to get version info, we'll let defineCompilerSettings report it as unsupported
8121008
let compilerName = last (splitDirectories compiler)
8131009
let versionHash = abs (hash versionInfo)
8141010
let flagsHash = abs (hash flags)

0 commit comments

Comments
 (0)