From b57b11580a6b666c6f6ef6359eaf5216874ef24a Mon Sep 17 00:00:00 2001
From: Mikhail Glushenkov <mikhail.glushenkov@gmail.com>
Date: Fri, 23 Aug 2013 08:06:21 +0200
Subject: [PATCH] Backwards compatibility patch for cross-compilation changes.

Changes back the types of 'configCompiler' and 'configCompilerEx', but marks
them as deprecated. Adds new functions 'configCompilerEx' and
'configCompilerAuxEx'.

The remaining functions that changed type after the cross-compilation changes
shouldn't matter from the backwards compatibility standpoint:

    * InstallDirs.{absoluteInstallDirs, prefixRelativeInstallDirs,
      initialPathTemplateEnv} - the versions in D.S.LocalBuildInfo retain their
      old types and are usually used instead. In any case, removing the Platform
      parameter from here is problematic because the default install dirs now
      include $arch and $os vars.

    * D.S.Configure.configure - shouldn't be used by the setup scripts.

See #1214 for the original (backwards-incompatible) patches.
---
 Cabal/Distribution/Simple/Configure.hs        | 44 ++++++++++++++-----
 cabal-install/Distribution/Client/Sandbox.hs  |  8 ++--
 .../Distribution/Client/SetupWrapper.hs       |  4 +-
 cabal-install/Main.hs                         |  6 +--
 4 files changed, 41 insertions(+), 21 deletions(-)

diff --git a/Cabal/Distribution/Simple/Configure.hs b/Cabal/Distribution/Simple/Configure.hs
index a34ac7512a..3b95144236 100644
--- a/Cabal/Distribution/Simple/Configure.hs
+++ b/Cabal/Distribution/Simple/Configure.hs
@@ -59,6 +59,7 @@ module Distribution.Simple.Configure (configure,
                                       localBuildInfoFile,
                                       getInstalledPackages, getPackageDBContents,
                                       configCompiler, configCompilerAux,
+                                      configCompilerEx, configCompilerAuxEx,
                                       ccLdOptionsBuildInfo,
                                       checkForeignDeps,
                                       interpretPackageDbFlags,
@@ -302,7 +303,7 @@ configure (pkg_descr0, pbi) cfg
                              (configPackageDBs cfg)
 
         -- detect compiler
-        (comp, compPlatform, programsConfig') <- configCompiler
+        (comp, compPlatform, programsConfig') <- configCompilerEx
           (flagToMaybe $ configHcFlavor cfg)
           (flagToMaybe $ configHcPath cfg) (flagToMaybe $ configHcPkg cfg)
           programsConfig (lessVerbose verbosity)
@@ -853,20 +854,21 @@ ccLdOptionsBuildInfo cflags ldflags =
 -- -----------------------------------------------------------------------------
 -- Determining the compiler details
 
-configCompilerAux :: ConfigFlags -> IO (Compiler, Platform, ProgramConfiguration)
-configCompilerAux cfg = configCompiler (flagToMaybe $ configHcFlavor cfg)
-                                       (flagToMaybe $ configHcPath cfg)
-                                       (flagToMaybe $ configHcPkg cfg)
-                                       programsConfig
-                                       (fromFlag (configVerbosity cfg))
+configCompilerAuxEx :: ConfigFlags
+                    -> IO (Compiler, Platform, ProgramConfiguration)
+configCompilerAuxEx cfg = configCompilerEx (flagToMaybe $ configHcFlavor cfg)
+                                           (flagToMaybe $ configHcPath cfg)
+                                           (flagToMaybe $ configHcPkg cfg)
+                                           programsConfig
+                                           (fromFlag (configVerbosity cfg))
   where
     programsConfig = mkProgramsConfig cfg defaultProgramConfiguration
 
-configCompiler :: Maybe CompilerFlavor -> Maybe FilePath -> Maybe FilePath
-               -> ProgramConfiguration -> Verbosity
-               -> IO (Compiler, Platform, ProgramConfiguration)
-configCompiler Nothing _ _ _ _ = die "Unknown compiler"
-configCompiler (Just hcFlavor) hcPath hcPkg conf verbosity = do
+configCompilerEx :: Maybe CompilerFlavor -> Maybe FilePath -> Maybe FilePath
+                 -> ProgramConfiguration -> Verbosity
+                 -> IO (Compiler, Platform, ProgramConfiguration)
+configCompilerEx Nothing _ _ _ _ = die "Unknown compiler"
+configCompilerEx (Just hcFlavor) hcPath hcPkg conf verbosity = do
   (comp, maybePlatform, programsConfig) <- case hcFlavor of
     GHC  -> GHC.configure  verbosity hcPath hcPkg conf
     JHC  -> JHC.configure  verbosity hcPath hcPkg conf
@@ -878,6 +880,24 @@ configCompiler (Just hcFlavor) hcPath hcPkg conf verbosity = do
     _    -> die "Unknown compiler"
   return (comp, fromMaybe buildPlatform maybePlatform, programsConfig)
 
+-- Ideally we would like to not have separate configCompiler* and
+-- configCompiler*Ex sets of functions, but there are many custom setup scripts
+-- in the wild that are using them, so the versions with old types are kept for
+-- backwards compatibility. Platform was added to the return triple in 1.18.
+
+{-# DEPRECATED configCompiler
+    "'configCompiler' is deprecated. Use 'configCompilerEx' instead." #-}
+configCompiler :: Maybe CompilerFlavor -> Maybe FilePath -> Maybe FilePath
+               -> ProgramConfiguration -> Verbosity
+               -> IO (Compiler, ProgramConfiguration)
+configCompiler mFlavor hcPath hcPkg conf verbosity =
+  fmap (\(a,_,b) -> (a,b)) $ configCompilerEx mFlavor hcPath hcPkg conf verbosity
+
+{-# DEPRECATED configCompilerAux
+    "configCompilerAux is deprecated. Use 'configCompilerAuxEx' instead." #-}
+configCompilerAux :: ConfigFlags
+                  -> IO (Compiler, ProgramConfiguration)
+configCompilerAux = fmap (\(a,_,b) -> (a,b)) . configCompilerAuxEx
 
 -- -----------------------------------------------------------------------------
 -- Making the internal component graph
diff --git a/cabal-install/Distribution/Client/Sandbox.hs b/cabal-install/Distribution/Client/Sandbox.hs
index 8477fe60d6..fc137d38f4 100644
--- a/cabal-install/Distribution/Client/Sandbox.hs
+++ b/cabal-install/Distribution/Client/Sandbox.hs
@@ -69,7 +69,7 @@ import Distribution.PackageDescription.Configuration
 import Distribution.PackageDescription.Parse  ( readPackageDescription )
 import Distribution.Simple.Compiler           ( Compiler(..), PackageDB(..)
                                               , PackageDBStack )
-import Distribution.Simple.Configure          ( configCompilerAux
+import Distribution.Simple.Configure          ( configCompilerAuxEx
                                               , interpretPackageDbFlags
                                               , getPackageDBContents )
 import Distribution.Simple.PreProcess         ( knownSuffixHandlers )
@@ -294,7 +294,7 @@ sandboxInit verbosity sandboxFlags globalFlags = do
 
   -- Determine which compiler to use (using the value from ~/.cabal/config).
   userConfig <- loadConfig verbosity (globalConfigFile globalFlags) NoFlag
-  (comp, platform, _) <- configCompilerAux (savedConfigureFlags userConfig)
+  (comp, platform, _) <- configCompilerAuxEx (savedConfigureFlags userConfig)
 
   -- Create the package environment file.
   pkgEnvFile <- getSandboxConfigFilePath globalFlags
@@ -353,7 +353,7 @@ doAddSource verbosity buildTreeRefs sandboxDir pkgEnv refType = do
 
   -- If we're running 'sandbox add-source' for the first time for this compiler,
   -- we need to create an initial timestamp record.
-  (comp, platform, _) <- configCompilerAux . savedConfigureFlags $ savedConfig
+  (comp, platform, _) <- configCompilerAuxEx . savedConfigureFlags $ savedConfig
   maybeAddCompilerTimestampRecord verbosity sandboxDir indexFile
     (compilerId comp) platform
 
@@ -715,6 +715,6 @@ configPackageDB' cfg =
 configCompilerAux' :: ConfigFlags
                    -> IO (Compiler, Platform, ProgramConfiguration)
 configCompilerAux' configFlags =
-  configCompilerAux configFlags
+  configCompilerAuxEx configFlags
     --FIXME: make configCompilerAux use a sensible verbosity
     { configVerbosity = fmap lessVerbose (configVerbosity configFlags) }
diff --git a/cabal-install/Distribution/Client/SetupWrapper.hs b/cabal-install/Distribution/Client/SetupWrapper.hs
index 4e279b2adc..11abb304df 100644
--- a/cabal-install/Distribution/Client/SetupWrapper.hs
+++ b/cabal-install/Distribution/Client/SetupWrapper.hs
@@ -38,7 +38,7 @@ import Distribution.PackageDescription
 import Distribution.PackageDescription.Parse
          ( readPackageDescription )
 import Distribution.Simple.Configure
-         ( configCompiler )
+         ( configCompilerEx )
 import Distribution.Compiler ( buildCompilerId )
 import Distribution.Simple.Compiler
          ( CompilerFlavor(GHC), Compiler(compilerId)
@@ -306,7 +306,7 @@ externalSetupMethod verbosity options pkg bt mkargs = do
     (comp, conf) <- case useCompiler options' of
       Just comp -> return (comp, useProgramConfig options')
       Nothing   -> do (comp, _, conf) <-
-                        configCompiler (Just GHC) Nothing Nothing
+                        configCompilerEx (Just GHC) Nothing Nothing
                         (useProgramConfig options') verbosity
                       return (comp, conf)
     -- Whenever we need to call configureCompiler, we also need to access the
diff --git a/cabal-install/Main.hs b/cabal-install/Main.hs
index 5b448868c6..d2ddc2f816 100644
--- a/cabal-install/Main.hs
+++ b/cabal-install/Main.hs
@@ -101,7 +101,7 @@ import Distribution.Simple.Command
 import Distribution.Simple.Compiler
          ( Compiler(..) )
 import Distribution.Simple.Configure
-         ( checkPersistBuildConfigOutdated, configCompilerAux
+         ( checkPersistBuildConfigOutdated, configCompilerAuxEx
          , ConfigStateFileErrorType(..), localBuildInfoFile
          , tryGetPersistBuildConfig )
 import qualified Distribution.Simple.LocalBuildInfo as LBI
@@ -231,7 +231,7 @@ configureAction (configFlags, configExFlags) extraArgs globalFlags = do
   let configFlags'   = savedConfigureFlags   config `mappend` configFlags
       configExFlags' = savedConfigureExFlags config `mappend` configExFlags
       globalFlags'   = savedGlobalFlags      config `mappend` globalFlags
-  (comp, platform, conf) <- configCompilerAux configFlags'
+  (comp, platform, conf) <- configCompilerAuxEx configFlags'
 
   -- If we're working inside a sandbox and the user has set the -w option, we
   -- may need to create a sandbox-local package DB for this compiler and add a
@@ -662,7 +662,7 @@ infoAction infoFlags extraArgs globalFlags = do
   (_, config) <- loadConfigOrSandboxConfig verbosity globalFlags mempty
   let configFlags  = savedConfigureFlags config
       globalFlags' = savedGlobalFlags    config `mappend` globalFlags
-  (comp, _, conf) <- configCompilerAux configFlags
+  (comp, _, conf) <- configCompilerAuxEx configFlags
   List.info verbosity
        (configPackageDB' configFlags)
        (globalRepos globalFlags')
-- 
GitLab