Drop GccLtXX flags, require GCC > 4.7 and up (#450)
[hadrian.git] / src / Oracles / Flag.hs
index bfd6a1f..1bd4dfe 100644 (file)
@@ -1,43 +1,74 @@
 module Oracles.Flag (
-    Flag (..),
-    test
+    Flag (..), flag, crossCompiling, platformSupportsSharedLibs,
+    ghcWithSMP, ghcWithNativeCodeGen, supportsSplitObjects
     ) where
 
-import Util
-import Oracles.Base
+import Hadrian.Oracles.TextFile
 
-data Flag = LaxDeps
-          | DynamicGhcPrograms
-          | GccIsClang
-          | GccLt46
+import Base
+import Oracles.Setting
+
+data Flag = ArSupportsAtFile
           | CrossCompiling
-          | Validating
-          | SupportsPackageKey
+          | GccIsClang
+          | GhcUnregisterised
+          | LeadingUnderscore
           | SolarisBrokenShld
           | SplitObjectsBroken
-          | GhcUnregisterised
+          | WithLibdw
+          | HaveLibMingwEx
+          | UseSystemFfi
 
--- TODO: Give the warning *only once* per key
-test :: Flag -> Action Bool
-test flag = do
-    (key, defaultValue) <- return $ case flag of
-        LaxDeps            -> ("lax-dependencies"     , False)
-        DynamicGhcPrograms -> ("dynamic-ghc-programs" , False)
-        GccIsClang         -> ("gcc-is-clang"         , False)
-        GccLt46            -> ("gcc-lt-46"            , False)
-        CrossCompiling     -> ("cross-compiling"      , False)
-        Validating         -> ("validating"           , False)
-        SupportsPackageKey -> ("supports-package-key" , False)
-        SolarisBrokenShld  -> ("solaris-broken-shld"  , False)
-        SplitObjectsBroken -> ("split-objects-broken" , False)
-        GhcUnregisterised  -> ("ghc-unregisterised"   , False)
-    let defaultString = if defaultValue then "YES" else "NO"
-    value <- askConfigWithDefault key $ -- TODO: warn just once
-        do putColoured Red $ "\nFlag '"
-                ++ key
-                ++ "' not set in configuration files. "
-                ++ "Proceeding with default value '"
-                ++ defaultString
-                ++ "'.\n"
-           return defaultString
+-- Note, if a flag is set to empty string we treat it as set to NO. This seems
+-- fragile, but some flags do behave like this, e.g. GccIsClang.
+flag :: Flag -> Action Bool
+flag f = do
+    let key = case f of
+            ArSupportsAtFile   -> "ar-supports-at-file"
+            CrossCompiling     -> "cross-compiling"
+            GccIsClang         -> "gcc-is-clang"
+            GhcUnregisterised  -> "ghc-unregisterised"
+            LeadingUnderscore  -> "leading-underscore"
+            SolarisBrokenShld  -> "solaris-broken-shld"
+            SplitObjectsBroken -> "split-objects-broken"
+            WithLibdw          -> "with-libdw"
+            HaveLibMingwEx     -> "have-lib-mingw-ex"
+            UseSystemFfi       -> "use-system-ffi"
+    value <- lookupValueOrError configFile key
+    when (value `notElem` ["YES", "NO", ""]) . error $ "Configuration flag "
+        ++ quote (key ++ " = " ++ value) ++ " cannot be parsed."
     return $ value == "YES"
+
+crossCompiling :: Action Bool
+crossCompiling = flag CrossCompiling
+
+platformSupportsSharedLibs :: Action Bool
+platformSupportsSharedLibs = do
+    badPlatform   <- anyTargetPlatform [ "powerpc-unknown-linux"
+                                       , "x86_64-unknown-mingw32"
+                                       , "i386-unknown-mingw32" ]
+    solaris       <- anyTargetPlatform [ "i386-unknown-solaris2" ]
+    solarisBroken <- flag SolarisBrokenShld
+    return $ not (badPlatform || solaris && solarisBroken)
+
+ghcWithSMP :: Action Bool
+ghcWithSMP = do
+    goodArch <- anyTargetArch ["i386", "x86_64", "sparc", "powerpc", "arm"]
+    ghcUnreg <- flag GhcUnregisterised
+    return $ goodArch && not ghcUnreg
+
+ghcWithNativeCodeGen :: Action Bool
+ghcWithNativeCodeGen = do
+    goodArch <- anyTargetArch ["i386", "x86_64", "sparc", "powerpc"]
+    badOs    <- anyTargetOs ["ios", "aix"]
+    ghcUnreg <- flag GhcUnregisterised
+    return $ goodArch && not badOs && not ghcUnreg
+
+supportsSplitObjects :: Action Bool
+supportsSplitObjects = do
+    broken   <- flag SplitObjectsBroken
+    ghcUnreg <- flag GhcUnregisterised
+    goodArch <- anyTargetArch [ "i386", "x86_64", "powerpc", "sparc" ]
+    goodOs   <- anyTargetOs [ "mingw32", "cygwin32", "linux", "darwin", "solaris2"
+                            , "freebsd", "dragonfly", "netbsd", "openbsd" ]
+    return $ not broken && not ghcUnreg && goodArch && goodOs