Drop GccLtXX flags, require GCC > 4.7 and up (#450)
[hadrian.git] / src / Oracles / Flag.hs
index 4152a97..1bd4dfe 100644 (file)
@@ -1,69 +1,74 @@
 module Oracles.Flag (
-    Flag (..), flag,
-    supportsPackageKey, crossCompiling, gccIsClang, gccLt46,
-    platformSupportsSharedLibs, ghcWithSMP, ghcWithNativeCodeGen
+    Flag (..), flag, crossCompiling, platformSupportsSharedLibs,
+    ghcWithSMP, ghcWithNativeCodeGen, supportsSplitObjects
     ) where
 
-import Util
-import Oracles.Base
+import Hadrian.Oracles.TextFile
+
+import Base
 import Oracles.Setting
-import Control.Monad
 
-data Flag = GccIsClang
-          | GccLt46
+data Flag = ArSupportsAtFile
           | CrossCompiling
-          | SupportsPackageKey
+          | GccIsClang
+          | GhcUnregisterised
+          | LeadingUnderscore
           | SolarisBrokenShld
           | SplitObjectsBroken
-          | GhcUnregisterised
+          | WithLibdw
+          | HaveLibMingwEx
+          | UseSystemFfi
 
+-- 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
-    key <- return $ case f of
-        GccIsClang         -> "gcc-is-clang"
-        GccLt46            -> "gcc-lt-46"
-        CrossCompiling     -> "cross-compiling"
-        SupportsPackageKey -> "supports-package-key"
-        SolarisBrokenShld  -> "solaris-broken-shld"
-        SplitObjectsBroken -> "split-objects-broken"
-        GhcUnregisterised  -> "ghc-unregisterised"
-    value <- askConfigWithDefault key . redError
-        $ "\nFlag '" ++ key ++ "' not set in configuration files."
-    unless (value == "YES" || value == "NO") . redError
-        $ "\nFlag '" ++ key ++ "' is set to '" ++ value
-        ++ "' instead of 'YES' or 'NO'."
+    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"
 
-supportsPackageKey :: Action Bool
-supportsPackageKey = flag SupportsPackageKey
-
 crossCompiling :: Action Bool
 crossCompiling = flag CrossCompiling
 
-gccIsClang :: Action Bool
-gccIsClang = flag GccIsClang
-
-gccLt46 :: Action Bool
-gccLt46 = flag GccLt46
-
 platformSupportsSharedLibs :: Action Bool
 platformSupportsSharedLibs = do
-    badPlatform   <- targetPlatforms [ "powerpc-unknown-linux"
-                                     , "x86_64-unknown-mingw32"
-                                     , "i386-unknown-mingw32" ]
-    solaris       <- targetPlatform    "i386-unknown-solaris2"
+    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 <- targetArchs ["i386", "x86_64", "sparc", "powerpc", "arm"]
+    goodArch <- anyTargetArch ["i386", "x86_64", "sparc", "powerpc", "arm"]
     ghcUnreg <- flag GhcUnregisterised
     return $ goodArch && not ghcUnreg
 
 ghcWithNativeCodeGen :: Action Bool
 ghcWithNativeCodeGen = do
-    goodArch <- targetArchs ["i386", "x86_64", "sparc", "powerpc"]
-    badOs    <- targetOss ["ios", "aix"]
+    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