11
11
-- directly. As GHC 9.6.4 boot packages Cabal and Cabal-syntax expose modules
12
12
-- with the same names, the language extension PackageImports is required.
13
13
14
+ -- EXPERIMENTAL
15
+
16
+ -- release.hs can be run on macOS/AArch64, using a Docker image for
17
+ -- Alpine Linux/AArch64, in order to create a statically-linked Linux/AArch64
18
+ -- version of Stack:
19
+ --
20
+ -- Install pre-requisites:
21
+ --
22
+ -- > brew install docker
23
+ -- > brew install colima
24
+ --
25
+ -- Start colima (with sufficient memory for Stack's integration tests) and run
26
+ -- script:
27
+ --
28
+ -- > colima start --memory 4 # The default 2 GB is likely insufficient
29
+ -- > stack etc/scripts/release.hs check --alpine --stack-args=--docker-stack-exe=image
30
+ -- > stack etc/scripts/release.hs build --alpine --stack-args=--docker-stack-exe=image
31
+ -- > colima stop
32
+
14
33
{-# LANGUAGE OverloadedRecordDot #-}
15
34
{-# LANGUAGE PackageImports #-}
16
35
{-# LANGUAGE PatternSynonyms #-}
@@ -28,7 +47,7 @@ import Development.Shake
28
47
( Action , Change (.. ), pattern Chatty , CmdOption (.. ), Rules
29
48
, ShakeOptions (.. ), Stdout (.. ), (%>) , actionOnException
30
49
, alwaysRerun , cmd , command_ , copyFileChanged
31
- , getDirectoryFiles , liftIO , need , phony , putNormal
50
+ , getDirectoryFiles , liftIO , need , phony , putInfo
32
51
, removeFilesAfter , shakeArgsWith , shakeOptions , want
33
52
)
34
53
import Development.Shake.FilePath
@@ -72,10 +91,13 @@ main = shakeArgsWith
72
91
let gAllowDirty = False
73
92
Platform arch _ = buildPlatform
74
93
gArch = arch
94
+ gTargetOS = platformOS
75
95
gBinarySuffix = " "
76
96
gTestHaddocks = True
77
97
gProjectRoot = " " -- Set to real value below.
78
98
gBuildArgs = [" --flag" , " stack:-developer-mode" ]
99
+ gStackArgs = []
100
+ gCheckStackArgs = []
79
101
gCertificateName = Nothing
80
102
global0 = foldl
81
103
(flip id )
@@ -87,9 +109,12 @@ main = shakeArgsWith
87
109
, gProjectRoot
88
110
, gHomeDir
89
111
, gArch
112
+ , gTargetOS
90
113
, gBinarySuffix
91
114
, gTestHaddocks
92
115
, gBuildArgs
116
+ , gStackArgs
117
+ , gCheckStackArgs
93
118
, gCertificateName
94
119
}
95
120
flags
@@ -131,13 +156,28 @@ options =
131
156
g { gBuildArgs =
132
157
gBuildArgs g
133
158
++ [ " --flag=stack:static"
134
- , " --docker"
159
+ ]
160
+ , gStackArgs =
161
+ gStackArgs g
162
+ ++ [ " --docker"
135
163
, " --system-ghc"
136
164
, " --no-install-ghc"
137
165
]
166
+ , gCheckStackArgs =
167
+ gCheckStackArgs g
168
+ ++ [ " --system-ghc"
169
+ , " --no-install-ghc"
170
+ ]
171
+ , gTargetOS = Linux
138
172
}
139
173
)
140
- " Build a statically linked binary using an Alpine Docker image."
174
+ " Build a statically-linked binary using an Alpine Linux Docker image."
175
+ , Option " " [stackArgsOptName]
176
+ ( ReqArg
177
+ (\ v -> Right $ \ g -> g{gStackArgs = gStackArgs g ++ words v})
178
+ " \" ARG1 ARG2 ...\" "
179
+ )
180
+ " Additional arguments to pass to 'stack'."
141
181
, Option " " [buildArgsOptName]
142
182
( ReqArg
143
183
(\ v -> Right $ \ g -> g{gBuildArgs = gBuildArgs g ++ words v})
@@ -180,29 +220,33 @@ rules global args = do
180
220
, show dirty
181
221
]
182
222
() <- cmd
223
+ stackProgName -- Use the platform's Stack
224
+ global. gStackArgs -- Possibly to set up a Docker container
225
+ [" exec" ] -- To execute the target Stack
183
226
[ global. gProjectRoot </> releaseBinDir </> binaryName </>
184
227
stackExeFileName
185
228
]
229
+ [" --" ]
186
230
(stackArgs global)
187
- [" build" ]
231
+ global. gCheckStackArgs -- Possible use the Docker image's GHC
232
+ [" build" ] -- To build the target Stack (Stack builds Stack)
188
233
global. gBuildArgs
189
234
integrationTestFlagArgs
190
235
[" --pedantic" , " --no-haddock-deps" , " --test" ]
191
236
[" --haddock" | global. gTestHaddocks]
192
237
[" stack" ]
193
238
() <- cmd
194
- [ global. gProjectRoot </> releaseBinDir </> binaryName </>
195
- stackExeFileName
196
- ]
197
- [" exec" ]
239
+ stackProgName -- Use the platform's Stack
240
+ global. gStackArgs -- Possibiy to set up a Docker container
241
+ [" exec" ] -- To execute the target stack-integration-test
198
242
[ global. gProjectRoot </> releaseBinDir </> binaryName </>
199
243
" stack-integration-test"
200
244
]
201
245
copyFileChanged (releaseBinDir </> binaryName </> stackExeFileName) out
202
246
203
247
releaseDir </> binaryPkgZipFileName %> \ out -> do
204
248
stageFiles <- getBinaryPkgStageFiles
205
- putNormal $ " zip " ++ out
249
+ putInfo $ " zip " ++ out
206
250
liftIO $ do
207
251
entries <- forM stageFiles $ \ stageFile -> do
208
252
Zip. readEntry
@@ -234,7 +278,13 @@ rules global args = do
234
278
releaseDir </> binaryExeFileName %> \ out -> do
235
279
need [releaseBinDir </> binaryName </> stackExeFileName]
236
280
(Stdout versionOut) <-
237
- cmd (releaseBinDir </> binaryName </> stackExeFileName) " --version"
281
+ cmd
282
+ stackProgName -- Use the platform's Stack
283
+ global. gStackArgs -- Possibly to set up a Docker container
284
+ [" exec" ] -- To execute the target Stack and get its version info
285
+ (releaseBinDir </> binaryName </> stackExeFileName)
286
+ [" --" ]
287
+ [" --version" ]
238
288
when (not global. gAllowDirty && " dirty" `isInfixOf` lower versionOut) $
239
289
error
240
290
( " Refusing continue because 'stack --version' reports dirty. Use --"
@@ -295,10 +345,12 @@ rules global args = do
295
345
releaseBinDir </> binaryName </> stackExeFileName %> \ out -> do
296
346
alwaysRerun
297
347
actionOnException
298
- ( cmd stackProgName
348
+ ( cmd
349
+ stackProgName -- Use the platform's Stack
299
350
(stackArgs global)
300
351
[" --local-bin-path=" ++ takeDirectory out]
301
- " install"
352
+ global. gStackArgs -- Possibly to set up a Docker container
353
+ " install" -- To build and install Stack to that local bin path
302
354
global. gBuildArgs
303
355
integrationTestFlagArgs
304
356
" --pedantic"
@@ -336,7 +388,7 @@ rules global args = do
336
388
releaseBinDir = releaseDir </> " bin"
337
389
338
390
binaryPkgFileNames =
339
- case platformOS of
391
+ case global . gTargetOS of
340
392
Windows ->
341
393
[ binaryExeFileName
342
394
, binaryPkgZipFileName
@@ -357,7 +409,7 @@ rules global args = do
357
409
, " -"
358
410
, stackVersionStr global
359
411
, " -"
360
- , display platformOS
412
+ , display global . gTargetOS
361
413
, " -"
362
414
, display global. gArch
363
415
, if null global. gBinarySuffix then " " else " -" ++ global. gBinarySuffix
@@ -438,6 +490,10 @@ binaryVariantOptName = "binary-variant"
438
490
noTestHaddocksOptName :: String
439
491
noTestHaddocksOptName = " no-test-haddocks"
440
492
493
+ -- | @--stack-args@ command-line option name.
494
+ stackArgsOptName :: String
495
+ stackArgsOptName = " stack-args"
496
+
441
497
-- | @--build-args@ command-line option name.
442
498
buildArgsOptName :: String
443
499
buildArgsOptName = " build-args"
@@ -469,9 +525,12 @@ data Global = Global
469
525
, gProjectRoot :: ! FilePath
470
526
, gHomeDir :: ! FilePath
471
527
, gArch :: ! Arch
528
+ , gTargetOS :: ! OS
472
529
, gBinarySuffix :: ! String
473
530
, gTestHaddocks :: ! Bool
474
531
, gBuildArgs :: [String ]
532
+ , gStackArgs :: [String ]
533
+ , gCheckStackArgs :: [String ]
475
534
, gCertificateName :: ! (Maybe String )
476
535
}
477
536
deriving Show
0 commit comments