@@ -32,14 +32,17 @@ import Control.Monad.Logger
3232import Control.Monad.Reader (MonadReader , asks )
3333import Control.Monad.Trans.Control (liftBaseWith )
3434import Control.Monad.Trans.Resource
35+ import qualified Crypto.Hash.SHA256 as SHA256
3536import Data.Attoparsec.Text hiding (try )
3637import qualified Data.ByteString as S
38+ import qualified Data.ByteString.Base64.URL as B64URL
3739import Data.Char (isSpace )
3840import Data.Conduit
3941import qualified Data.Conduit.Binary as CB
4042import qualified Data.Conduit.List as CL
4143import qualified Data.Conduit.Text as CT
4244import Data.Either (isRight )
45+ import Data.FileEmbed (embedFile , makeRelativeToProject )
4346import Data.Foldable (forM_ , any )
4447import Data.Function
4548import Data.IORef.RunOnce (runOnce )
@@ -55,7 +58,7 @@ import Data.Streaming.Process hiding (callProcess, env)
5558import Data.String
5659import Data.Text (Text )
5760import qualified Data.Text as T
58- import Data.Text.Encoding (decodeUtf8 )
61+ import Data.Text.Encoding (decodeUtf8 , encodeUtf8 )
5962import Data.Text.Extra (stripCR )
6063import Data.Time.Clock (getCurrentTime )
6164import Data.Traversable (forM )
@@ -218,6 +221,8 @@ data ExecuteEnv = ExecuteEnv
218221 , eeTempDir :: ! (Path Abs Dir )
219222 , eeSetupHs :: ! (Path Abs File )
220223 -- ^ Temporary Setup.hs for simple builds
224+ , eeSetupShimHs :: ! (Path Abs File )
225+ -- ^ Temporary SetupShim.hs, to provide access to initial-build-steps
221226 , eeSetupExe :: ! (Maybe (Path Abs File ))
222227 -- ^ Compiled version of eeSetupHs
223228 , eeCabalPkgVer :: ! Version
@@ -231,20 +236,46 @@ data ExecuteEnv = ExecuteEnv
231236 , eeLogFiles :: ! (TChan (Path Abs Dir , Path Abs File ))
232237 }
233238
239+ buildSetupArgs :: [String ]
240+ buildSetupArgs =
241+ [ " -rtsopts"
242+ , " -threaded"
243+ , " -clear-package-db"
244+ , " -global-package-db"
245+ , " -hide-all-packages"
246+ , " -package"
247+ , " base"
248+ , " -main-is"
249+ , " StackSetupShim.mainOverride"
250+ ]
251+
252+ setupGhciShimCode :: S. ByteString
253+ setupGhciShimCode = $ (do
254+ path <- makeRelativeToProject " src/setup-shim/StackSetupShim.hs"
255+ embedFile path)
256+
257+ simpleSetupHash :: String
258+ simpleSetupHash =
259+ T. unpack $ decodeUtf8 $ S. take 8 $ B64URL. encode $ SHA256. hash $
260+ encodeUtf8 (T. pack (unwords buildSetupArgs)) <> setupGhciShimCode
261+
234262-- | Get a compiled Setup exe
235263getSetupExe :: M env m
236264 => Path Abs File -- ^ Setup.hs input file
265+ -> Path Abs File -- ^ SetupShim.hs input file
237266 -> Path Abs Dir -- ^ temporary directory
238267 -> m (Maybe (Path Abs File ))
239- getSetupExe setupHs tmpdir = do
268+ getSetupExe setupHs setupShimHs tmpdir = do
240269 wc <- getWhichCompiler
241270 econfig <- asks getEnvConfig
242271 platformDir <- platformGhcRelDir
243272 let config = getConfig econfig
244273 baseNameS = concat
245- [ " setup-Simple-Cabal-"
274+ [ " Cabal-simple_"
275+ , simpleSetupHash
276+ , " _"
246277 , versionString $ envConfigCabalVersion econfig
247- , " - "
278+ , " _ "
248279 , compilerVersionString $ envConfigCompilerVersion econfig
249280 ]
250281 exeNameS = baseNameS ++
@@ -277,19 +308,13 @@ getSetupExe setupHs tmpdir = do
277308 liftIO $ D. createDirectoryIfMissing True $ toFilePath setupDir
278309
279310 menv <- getMinimalEnvOverride
280- let args =
281- [ " -clear-package-db"
282- , " -global-package-db"
283- , " -hide-all-packages"
284- , " -package"
285- , " base"
286- , " -package"
311+ let args = buildSetupArgs ++
312+ [ " -package"
287313 , " Cabal-" ++ versionString (envConfigCabalVersion econfig)
288314 , toFilePath setupHs
315+ , toFilePath setupShimHs
289316 , " -o"
290317 , toFilePath tmpOutputPath
291- , " -rtsopts"
292- , " -threaded"
293318 ] ++
294319 [" -build-runner" | wc == Ghcjs ]
295320 runCmd' (\ cp -> cp { std_out = UseHandle stderr }) (Cmd (Just tmpdir) (compilerExeName wc) menv args) Nothing
@@ -314,9 +339,11 @@ withExecuteEnv menv bopts boptsCli baseConfigOpts locals globalPackages snapshot
314339 configLock <- newMVar ()
315340 installLock <- newMVar ()
316341 idMap <- liftIO $ newTVarIO Map. empty
317- let setupHs = tmpdir </> $ (mkRelFile " Setup .hs" )
342+ let setupHs = tmpdir </> $ (mkRelFile " Main .hs" )
318343 liftIO $ writeFile (toFilePath setupHs) " import Distribution.Simple\n main = defaultMain"
319- setupExe <- getSetupExe setupHs tmpdir
344+ let setupShimHs = tmpdir </> $ (mkRelFile " SetupShim.hs" )
345+ liftIO $ S. writeFile (toFilePath setupShimHs) setupGhciShimCode
346+ setupExe <- getSetupExe setupHs setupShimHs tmpdir
320347 cabalPkgVer <- asks (envConfigCabalVersion . getEnvConfig)
321348 globalDB <- getGlobalDB menv =<< getWhichCompiler
322349 snapshotPackagesTVar <- liftIO $ newTVarIO (toDumpPackagesByGhcPkgId snapshotPackages)
@@ -337,6 +364,7 @@ withExecuteEnv menv bopts boptsCli baseConfigOpts locals globalPackages snapshot
337364 , eeGhcPkgIds = idMap
338365 , eeTempDir = tmpdir
339366 , eeSetupHs = setupHs
367+ , eeSetupShimHs = setupShimHs
340368 , eeSetupExe = setupExe
341369 , eeCabalPkgVer = cabalPkgVer
342370 , eeTotalWanted = totalWanted
@@ -996,6 +1024,9 @@ withSingleContext runInBase ActionContext {..} ExecuteEnv {..} task@Task {..} md
9961024 , " -i" , " -i."
9971025 ] ++ packageArgs ++
9981026 [ toFilePath setuphs
1027+ , toFilePath eeSetupShimHs
1028+ , " -main-is"
1029+ , " StackSetupShim.mainOverride"
9991030 , " -o" , toFilePath outputFile
10001031 , " -threaded"
10011032 ] ++
@@ -1140,9 +1171,21 @@ singleBuild runInBase ac@ActionContext {..} ee@ExecuteEnv {..} task@Task {..} in
11401171 $ \ package cabalfp pkgDir cabal announce _console _mlogFile -> do
11411172 _neededConfig <- ensureConfig cache pkgDir ee (announce (" configure" <> annSuffix)) cabal cabalfp
11421173
1143- if boptsCLIOnlyConfigure eeBuildOptsCLI
1144- then return Nothing
1145- else liftM Just $ realBuild cache package pkgDir cabal announce
1174+ case ( boptsCLIOnlyConfigure eeBuildOptsCLI
1175+ , boptsCLIInitialBuildSteps eeBuildOptsCLI && isTarget) of
1176+ (True , _) -> return Nothing
1177+ (_, True ) -> do
1178+ initialBuildSteps cabal announce
1179+ return Nothing
1180+ _ -> liftM Just $ realBuild cache package pkgDir cabal announce
1181+
1182+ isTarget = case taskType of
1183+ TTLocal lp -> lpWanted lp
1184+ _ -> False
1185+
1186+ initialBuildSteps cabal announce = do
1187+ () <- announce (" initial-build-steps" <> annSuffix)
1188+ cabal False [" repl" , " stack-initial-build-steps" ]
11461189
11471190 realBuild cache package pkgDir cabal announce = do
11481191 wc <- getWhichCompiler
0 commit comments