11{-# LANGUAGE CPP #-}
2+ {-# LANGUAGE DataKinds #-}
23{-# LANGUAGE FlexibleContexts #-}
34{-# LANGUAGE LambdaCase #-}
45{-# LANGUAGE RankNTypes #-}
@@ -23,19 +24,20 @@ import Prelude ()
2324-- local
2425import Distribution.PackageDescription
2526import Distribution.Pretty
27+ import Distribution.Simple.Configure (findDistPrefOrDefault )
2628import Distribution.Simple.Errors
2729import Distribution.Simple.LocalBuildInfo
2830import Distribution.Simple.Program
2931import Distribution.Simple.Program.Db
3032import Distribution.Simple.Setup.Common
3133import Distribution.Simple.Setup.Config
3234import Distribution.Simple.Utils
33- import Distribution.System (buildPlatform )
35+ import Distribution.System (Platform , buildPlatform )
3436import Distribution.Utils.NubList
3537import Distribution.Utils.Path
36- import Distribution.Verbosity
3738
3839-- Base
40+ import System.Directory (createDirectoryIfMissing , doesFileExist )
3941import qualified System.FilePath as FilePath
4042#ifdef mingw32_HOST_OS
4143import System.FilePath (normalise , splitDrive )
@@ -48,14 +50,24 @@ import qualified Data.List.NonEmpty as NonEmpty
4850import qualified Data.Map as Map
4951
5052runConfigureScript
51- :: Verbosity
52- -> ConfigFlags
53- -> LocalBuildInfo
53+ :: ConfigFlags
54+ -> FlagAssignment
55+ -> ProgramDb
56+ -> Platform -- ^ host platform
5457 -> IO ()
55- runConfigureScript verbosity flags lbi = do
58+ runConfigureScript cfg flags programDb hp = do
59+ let commonCfg = configCommonFlags cfg
60+ verbosity = fromFlag $ setupVerbosity commonCfg
61+ dist_dir <- findDistPrefOrDefault $ setupDistPref commonCfg
62+ let build_dir = dist_dir </> makeRelativePathEx " build"
63+ mbWorkDir = flagToMaybe $ setupWorkingDir commonCfg
64+ configureScriptPath = packageRoot commonCfg </> " configure"
65+ confExists <- doesFileExist configureScriptPath
66+ unless confExists $
67+ dieWithException verbosity (ConfigureScriptNotFound configureScriptPath)
68+ configureFile <-
69+ makeAbsolute $ configureScriptPath
5670 env <- getEnvironment
57- let commonFlags = configCommonFlags flags
58- programDb = withPrograms lbi
5971 (ccProg, ccFlags) <- configureCCompiler verbosity programDb
6072 ccProgShort <- getShortPathName ccProg
6173 -- The C compiler's compilation and linker flags (e.g.
@@ -64,8 +76,8 @@ runConfigureScript verbosity flags lbi = do
6476 -- to ccFlags
6577 -- We don't try and tell configure which ld to use, as we don't have
6678 -- a way to pass its flags too
67- configureFile <-
68- makeAbsolute $ packageRoot commonFlags </> " configure "
79+
80+ let configureFile' = toUnix configureFile
6981 -- autoconf is fussy about filenames, and has a set of forbidden
7082 -- characters that can't appear in the build directory, etc:
7183 -- https://www.gnu.org/software/autoconf/manual/autoconf.html#File-System-Conventions
@@ -79,7 +91,6 @@ runConfigureScript verbosity flags lbi = do
7991 -- TODO: We don't check for colons, tildes or leading dashes. We
8092 -- also should check the builddir's path, destdir, and all other
8193 -- paths as well.
82- let configureFile' = toUnix configureFile
8394 for_ badAutoconfCharacters $ \ (c, cname) ->
8495 when (c `elem` FilePath. dropDrive configureFile') $
8596 warn verbosity $
@@ -111,7 +122,7 @@ runConfigureScript verbosity flags lbi = do
111122 Map. fromListWith
112123 (<>)
113124 [ (flagEnvVar flag, (flag, bool) :| [] )
114- | (flag, bool) <- unFlagAssignment $ flagAssignment lbi
125+ | (flag, bool) <- unFlagAssignment flags
115126 ]
116127 -- A map from env vars to flag names to the single flag we will go with
117128 cabalFlagMapDeconflicted :: Map String (FlagName , Bool ) <-
@@ -143,10 +154,10 @@ runConfigureScript verbosity flags lbi = do
143154 ]
144155 ++ [
145156 ( " CABAL_FLAGS"
146- , Just $ unwords [showFlagValue fv | fv <- unFlagAssignment $ flagAssignment lbi ]
157+ , Just $ unwords [showFlagValue fv | fv <- unFlagAssignment flags ]
147158 )
148159 ]
149- let extraPath = fromNubList $ configProgramPathExtra flags
160+ let extraPath = fromNubList $ configProgramPathExtra cfg
150161 let cflagsEnv =
151162 maybe (unwords ccFlags) (++ (" " ++ unwords ccFlags)) $
152163 lookup " CFLAGS" env
@@ -160,7 +171,6 @@ runConfigureScript verbosity flags lbi = do
160171 (" CFLAGS" , Just cflagsEnv)
161172 : [(" PATH" , Just pathEnv) | not (null extraPath)]
162173 ++ cabalFlagEnv
163- hp = hostPlatform lbi
164174 maybeHostFlag = if hp == buildPlatform then [] else [" --host=" ++ show (pretty hp)]
165175 args' = configureFile' : args ++ [" CC=" ++ ccProgShort] ++ maybeHostFlag
166176 shProg = simpleProgram " sh"
@@ -169,14 +179,16 @@ runConfigureScript verbosity flags lbi = do
169179 lookupProgram shProg
170180 `fmap` configureProgram verbosity shProg progDb
171181 case shConfiguredProg of
172- Just sh ->
182+ Just sh -> do
183+ let build_in = interpretSymbolicPath mbWorkDir build_dir
184+ createDirectoryIfMissing True build_in
173185 runProgramInvocation verbosity $
174186 (programInvocation (sh{programOverrideEnv = overEnv}) args')
175- { progInvokeCwd = Just (interpretSymbolicPathLBI lbi $ buildDir lbi)
187+ { progInvokeCwd = Just build_in
176188 }
177189 Nothing -> dieWithException verbosity NotFoundMsg
178190 where
179- args = configureArgs backwardsCompatHack flags
191+ args = configureArgs backwardsCompatHack cfg
180192 backwardsCompatHack = False
181193
182194-- | Convert Windows path to Unix ones
0 commit comments