@@ -28,7 +28,7 @@ import Development.Shake
28
28
( Action , Change (.. ), pattern Chatty , CmdOption (.. ), Rules
29
29
, ShakeOptions (.. ), Stdout (.. ), (%>) , actionOnException
30
30
, alwaysRerun , cmd , command_ , copyFileChanged
31
- , getDirectoryFiles , liftIO , need , phony , putNormal
31
+ , getDirectoryFiles , liftIO , need , phony , putInfo
32
32
, removeFilesAfter , shakeArgsWith , shakeOptions , want
33
33
)
34
34
import Development.Shake.FilePath
@@ -72,10 +72,12 @@ main = shakeArgsWith
72
72
let gAllowDirty = False
73
73
Platform arch _ = buildPlatform
74
74
gArch = arch
75
+ gTargetOS = platformOS
75
76
gBinarySuffix = " "
76
77
gTestHaddocks = True
77
78
gProjectRoot = " " -- Set to real value below.
78
79
gBuildArgs = [" --flag" , " stack:-developer-mode" ]
80
+ gStackArgs = []
79
81
gCertificateName = Nothing
80
82
global0 = foldl
81
83
(flip id )
@@ -87,9 +89,11 @@ main = shakeArgsWith
87
89
, gProjectRoot
88
90
, gHomeDir
89
91
, gArch
92
+ , gTargetOS
90
93
, gBinarySuffix
91
94
, gTestHaddocks
92
95
, gBuildArgs
96
+ , gStackArgs
93
97
, gCertificateName
94
98
}
95
99
flags
@@ -131,13 +135,23 @@ options =
131
135
g { gBuildArgs =
132
136
gBuildArgs g
133
137
++ [ " --flag=stack:static"
134
- , " --docker"
138
+ ]
139
+ , gStackArgs =
140
+ gStackArgs g
141
+ ++ [ " --docker"
135
142
, " --system-ghc"
136
143
, " --no-install-ghc"
137
144
]
145
+ , gTargetOS = Linux
138
146
}
139
147
)
140
- " Build a statically linked binary using an Alpine Docker image."
148
+ " Build a statically-linked binary using an Alpine Linux Docker image."
149
+ , Option " " [stackArgsOptName]
150
+ ( ReqArg
151
+ (\ v -> Right $ \ g -> g{gStackArgs = gStackArgs g ++ words v})
152
+ " \" ARG1 ARG2 ...\" "
153
+ )
154
+ " Additional arguments to pass to 'stack'."
141
155
, Option " " [buildArgsOptName]
142
156
( ReqArg
143
157
(\ v -> Right $ \ g -> g{gBuildArgs = gBuildArgs g ++ words v})
@@ -184,25 +198,28 @@ rules global args = do
184
198
stackExeFileName
185
199
]
186
200
(stackArgs global)
201
+ global. gStackArgs
187
202
[" build" ]
188
203
global. gBuildArgs
189
204
integrationTestFlagArgs
190
205
[" --pedantic" , " --no-haddock-deps" , " --test" ]
191
206
[" --haddock" | global. gTestHaddocks]
192
207
[" stack" ]
193
208
() <- cmd
194
- [ global. gProjectRoot </> releaseBinDir </> binaryName </>
195
- stackExeFileName
196
- ]
197
- [" exec" ]
198
- [ global. gProjectRoot </> releaseBinDir </> binaryName </>
199
- " stack-integration-test"
200
- ]
209
+ [ global. gProjectRoot </> releaseBinDir </> binaryName </>
210
+ stackExeFileName
211
+ ]
212
+ (stackArgs global)
213
+ global. gStackArgs
214
+ [" exec" ]
215
+ [ global. gProjectRoot </> releaseBinDir </> binaryName </>
216
+ " stack-integration-test"
217
+ ]
201
218
copyFileChanged (releaseBinDir </> binaryName </> stackExeFileName) out
202
219
203
220
releaseDir </> binaryPkgZipFileName %> \ out -> do
204
221
stageFiles <- getBinaryPkgStageFiles
205
- putNormal $ " zip " ++ out
222
+ putInfo $ " zip " ++ out
206
223
liftIO $ do
207
224
entries <- forM stageFiles $ \ stageFile -> do
208
225
Zip. readEntry
@@ -233,14 +250,23 @@ rules global args = do
233
250
234
251
releaseDir </> binaryExeFileName %> \ out -> do
235
252
need [releaseBinDir </> binaryName </> stackExeFileName]
236
- (Stdout versionOut) <-
237
- cmd (releaseBinDir </> binaryName </> stackExeFileName) " --version"
238
- when (not global. gAllowDirty && " dirty" `isInfixOf` lower versionOut) $
239
- error
240
- ( " Refusing continue because 'stack --version' reports dirty. Use --"
241
- ++ allowDirtyOptName
242
- ++ " option to continue anyway."
243
- )
253
+ if platformOS == global. gTargetOS
254
+ then do
255
+ (Stdout versionOut) <-
256
+ cmd (releaseBinDir </> binaryName </> stackExeFileName) " --version"
257
+ when (not global. gAllowDirty && " dirty" `isInfixOf` lower versionOut) $
258
+ error
259
+ ( " Refusing continue because 'stack --version' reports dirty. Use --"
260
+ ++ allowDirtyOptName
261
+ ++ " option to continue anyway."
262
+ )
263
+ else
264
+ putInfo $
265
+ " The current and target operating systems differ ("
266
+ <> show platformOS
267
+ <> " , "
268
+ <> show global. gTargetOS
269
+ <> " ). Not checking if 'stack --version' reports dirty."
244
270
case platformOS of
245
271
Windows -> do
246
272
-- Windows doesn't have or need a 'strip' command, so skip it.
@@ -298,6 +324,7 @@ rules global args = do
298
324
( cmd stackProgName
299
325
(stackArgs global)
300
326
[" --local-bin-path=" ++ takeDirectory out]
327
+ global. gStackArgs
301
328
" install"
302
329
global. gBuildArgs
303
330
integrationTestFlagArgs
@@ -336,7 +363,7 @@ rules global args = do
336
363
releaseBinDir = releaseDir </> " bin"
337
364
338
365
binaryPkgFileNames =
339
- case platformOS of
366
+ case global . gTargetOS of
340
367
Windows ->
341
368
[ binaryExeFileName
342
369
, binaryPkgZipFileName
@@ -357,7 +384,7 @@ rules global args = do
357
384
, " -"
358
385
, stackVersionStr global
359
386
, " -"
360
- , display platformOS
387
+ , display global . gTargetOS
361
388
, " -"
362
389
, display global. gArch
363
390
, if null global. gBinarySuffix then " " else " -" ++ global. gBinarySuffix
@@ -438,6 +465,10 @@ binaryVariantOptName = "binary-variant"
438
465
noTestHaddocksOptName :: String
439
466
noTestHaddocksOptName = " no-test-haddocks"
440
467
468
+ -- | @--stack-args@ command-line option name.
469
+ stackArgsOptName :: String
470
+ stackArgsOptName = " stack-args"
471
+
441
472
-- | @--build-args@ command-line option name.
442
473
buildArgsOptName :: String
443
474
buildArgsOptName = " build-args"
@@ -469,9 +500,11 @@ data Global = Global
469
500
, gProjectRoot :: ! FilePath
470
501
, gHomeDir :: ! FilePath
471
502
, gArch :: ! Arch
503
+ , gTargetOS :: ! OS
472
504
, gBinarySuffix :: ! String
473
505
, gTestHaddocks :: ! Bool
474
506
, gBuildArgs :: [String ]
507
+ , gStackArgs :: [String ]
475
508
, gCertificateName :: ! (Maybe String )
476
509
}
477
510
deriving Show
0 commit comments