@@ -71,6 +71,7 @@ import System.Exit ( ExitCode(..)
71
71
, exitWith
72
72
)
73
73
import System.Process ( readProcess
74
+ , readProcessWithExitCode
74
75
, system
75
76
)
76
77
import Toml ( TomlCodec
@@ -733,6 +734,185 @@ defineCompilerSettings specifiedFlags compiler release
733
734
, compilerSettingsModuleFlag = " -J"
734
735
, compilerSettingsIncludeFlag = " -I"
735
736
}
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
+ }
736
916
| otherwise
737
917
= do
738
918
putStrLn $ " Sorry, compiler is currently unsupported: " ++ compiler
@@ -808,7 +988,23 @@ makeBuildPrefix :: FilePath -> [String] -> IO FilePath
808
988
makeBuildPrefix compiler flags = do
809
989
-- TODO Figure out what other info should be part of this
810
990
-- 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
812
1008
let compilerName = last (splitDirectories compiler)
813
1009
let versionHash = abs (hash versionInfo)
814
1010
let flagsHash = abs (hash flags)
0 commit comments