@@ -32,14 +32,17 @@ import Control.Monad.Logger
32
32
import Control.Monad.Reader (MonadReader , asks )
33
33
import Control.Monad.Trans.Control (liftBaseWith )
34
34
import Control.Monad.Trans.Resource
35
+ import qualified Crypto.Hash.SHA256 as SHA256
35
36
import Data.Attoparsec.Text hiding (try )
36
37
import qualified Data.ByteString as S
38
+ import qualified Data.ByteString.Base64.URL as B64URL
37
39
import Data.Char (isSpace )
38
40
import Data.Conduit
39
41
import qualified Data.Conduit.Binary as CB
40
42
import qualified Data.Conduit.List as CL
41
43
import qualified Data.Conduit.Text as CT
42
44
import Data.Either (isRight )
45
+ import Data.FileEmbed (embedFile , makeRelativeToProject )
43
46
import Data.Foldable (forM_ , any )
44
47
import Data.Function
45
48
import Data.IORef.RunOnce (runOnce )
@@ -55,7 +58,7 @@ import Data.Streaming.Process hiding (callProcess, env)
55
58
import Data.String
56
59
import Data.Text (Text )
57
60
import qualified Data.Text as T
58
- import Data.Text.Encoding (decodeUtf8 )
61
+ import Data.Text.Encoding (decodeUtf8 , encodeUtf8 )
59
62
import Data.Text.Extra (stripCR )
60
63
import Data.Time.Clock (getCurrentTime )
61
64
import Data.Traversable (forM )
@@ -218,6 +221,8 @@ data ExecuteEnv = ExecuteEnv
218
221
, eeTempDir :: ! (Path Abs Dir )
219
222
, eeSetupHs :: ! (Path Abs File )
220
223
-- ^ Temporary Setup.hs for simple builds
224
+ , eeSetupShimHs :: ! (Path Abs File )
225
+ -- ^ Temporary SetupShim.hs, to provide access to initial-build-steps
221
226
, eeSetupExe :: ! (Maybe (Path Abs File ))
222
227
-- ^ Compiled version of eeSetupHs
223
228
, eeCabalPkgVer :: ! Version
@@ -231,20 +236,46 @@ data ExecuteEnv = ExecuteEnv
231
236
, eeLogFiles :: ! (TChan (Path Abs Dir , Path Abs File ))
232
237
}
233
238
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
+
234
262
-- | Get a compiled Setup exe
235
263
getSetupExe :: M env m
236
264
=> Path Abs File -- ^ Setup.hs input file
265
+ -> Path Abs File -- ^ SetupShim.hs input file
237
266
-> Path Abs Dir -- ^ temporary directory
238
267
-> m (Maybe (Path Abs File ))
239
- getSetupExe setupHs tmpdir = do
268
+ getSetupExe setupHs setupShimHs tmpdir = do
240
269
wc <- getWhichCompiler
241
270
econfig <- asks getEnvConfig
242
271
platformDir <- platformGhcRelDir
243
272
let config = getConfig econfig
244
273
baseNameS = concat
245
- [ " setup-Simple-Cabal-"
274
+ [ " Cabal-simple_"
275
+ , simpleSetupHash
276
+ , " _"
246
277
, versionString $ envConfigCabalVersion econfig
247
- , " - "
278
+ , " _ "
248
279
, compilerVersionString $ envConfigCompilerVersion econfig
249
280
]
250
281
exeNameS = baseNameS ++
@@ -277,19 +308,13 @@ getSetupExe setupHs tmpdir = do
277
308
liftIO $ D. createDirectoryIfMissing True $ toFilePath setupDir
278
309
279
310
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"
287
313
, " Cabal-" ++ versionString (envConfigCabalVersion econfig)
288
314
, toFilePath setupHs
315
+ , toFilePath setupShimHs
289
316
, " -o"
290
317
, toFilePath tmpOutputPath
291
- , " -rtsopts"
292
- , " -threaded"
293
318
] ++
294
319
[" -build-runner" | wc == Ghcjs ]
295
320
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
314
339
configLock <- newMVar ()
315
340
installLock <- newMVar ()
316
341
idMap <- liftIO $ newTVarIO Map. empty
317
- let setupHs = tmpdir </> $ (mkRelFile " Setup .hs" )
342
+ let setupHs = tmpdir </> $ (mkRelFile " Main .hs" )
318
343
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
320
347
cabalPkgVer <- asks (envConfigCabalVersion . getEnvConfig)
321
348
globalDB <- getGlobalDB menv =<< getWhichCompiler
322
349
snapshotPackagesTVar <- liftIO $ newTVarIO (toDumpPackagesByGhcPkgId snapshotPackages)
@@ -337,6 +364,7 @@ withExecuteEnv menv bopts boptsCli baseConfigOpts locals globalPackages snapshot
337
364
, eeGhcPkgIds = idMap
338
365
, eeTempDir = tmpdir
339
366
, eeSetupHs = setupHs
367
+ , eeSetupShimHs = setupShimHs
340
368
, eeSetupExe = setupExe
341
369
, eeCabalPkgVer = cabalPkgVer
342
370
, eeTotalWanted = totalWanted
@@ -996,6 +1024,9 @@ withSingleContext runInBase ActionContext {..} ExecuteEnv {..} task@Task {..} md
996
1024
, " -i" , " -i."
997
1025
] ++ packageArgs ++
998
1026
[ toFilePath setuphs
1027
+ , toFilePath eeSetupShimHs
1028
+ , " -main-is"
1029
+ , " StackSetupShim.mainOverride"
999
1030
, " -o" , toFilePath outputFile
1000
1031
, " -threaded"
1001
1032
] ++
@@ -1140,9 +1171,21 @@ singleBuild runInBase ac@ActionContext {..} ee@ExecuteEnv {..} task@Task {..} in
1140
1171
$ \ package cabalfp pkgDir cabal announce _console _mlogFile -> do
1141
1172
_neededConfig <- ensureConfig cache pkgDir ee (announce (" configure" <> annSuffix)) cabal cabalfp
1142
1173
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" ]
1146
1189
1147
1190
realBuild cache package pkgDir cabal announce = do
1148
1191
wc <- getWhichCompiler
0 commit comments