Commit 43a5df7
[plugin] Add swift-static-sdk cross-compile option (no container) (#689)
Fixes #332.
Adds `--cross-compile swift-static-sdk` to `lambda-build`. It compiles a
statically linked, musl-based binary directly on the host using the
Static Linux SDK, with no Docker or `container` involved. The resulting
`bootstrap` runs as-is on the Lambda `provided.al2023` runtime.
## What it does
- New `StaticLinuxSDKBuildBackend` that shells out to `swift build
--swift-sdk <triple>`, slotting into the existing `BuildBackend`
abstraction. No changes to the archive or deploy paths.
- `--architecture` selects the target: `arm64` maps to
`aarch64-swift-linux-musl`, `x64` to `x86_64-swift-linux-musl`. Because
the SDK genuinely cross-compiles, either architecture can be built from
either host.
- The SDK must be installed beforehand. The plugin cannot download it
(the sandbox limits network to Docker), so the backend detects a missing
SDK and fails with install guidance instead of hanging or erroring
cryptically.
- Detection uses `swift build --swift-sdk <triple> --show-bin-path`,
which resolves the SDK exactly as the real build does. It does not parse
`swift sdk list`, whose output is SDK bundle ids that never contain the
target triple.
- The nested build runs in a dedicated `--scratch-path` under `.build`.
The command plugin holds the workspace lock on the default `.build` for
its whole run, so a nested build against the same directory would
deadlock waiting for that lock. A separate scratch path avoids it.
- The plugin rejects flags that only make sense for a container build
when this method is selected (`--base-docker-image`, `--swift-version`,
`--disable-docker-image-update`, `--base-oci-image`, and
`--archive-format oci`), rather than silently ignoring them.
## A note on binary size
Building the same trivial Lambda both ways (release, stripped), the
static-linux-sdk binary is about 16 MB and the container (glibc) binary
is about 19 MB. The two are closer than you might expect, and the reason
is worth recording: both statically link the Swift standard library via
`--static-swift-stdlib`, so their `.text` sections are within a few KB
of each other (around 11 MB each). The C library is the small part. musl
links statically and stays compact; glibc is not statically linked at
all in the container build, it stays dynamic. So the size floor for both
is the Swift runtime, not libc, and static musl comes out slightly
smaller rather than larger. If we want to reduce size further, the lever
is the Swift stdlib footprint, not the choice of libc.
## Testing
- Unit tests for backend selection, the musl triple mapping, and config
parsing.
- Verified end to end against the 6.4 dev snapshot: builds a statically
linked aarch64 ELF, packages it into a zip containing `bootstrap`, and
writes a build manifest recording `arm64`.
- Verified the incompatible-flag errors fire, and that the plain and
`--archive-format zip` paths still build with no false positives.
Semver: minor.
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>1 parent 831fa0e commit 43a5df7
9 files changed
Lines changed: 350 additions & 56 deletions
File tree
- Plugins/AWSLambdaBuilder
- Sources
- AWSLambdaPluginHelper/lambda-build
- BuildBackends
- AWSLambdaRuntime/Docs.docc
- Tests/AWSLambdaPluginHelperTests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
44 | 44 | | |
45 | 45 | | |
46 | 46 | | |
47 | | - | |
48 | | - | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
49 | 50 | | |
50 | 51 | | |
51 | | - | |
52 | | - | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
53 | 86 | | |
54 | 87 | | |
55 | 88 | | |
| |||
90 | 123 | | |
91 | 124 | | |
92 | 125 | | |
93 | | - | |
| 126 | + | |
94 | 127 | | |
95 | 128 | | |
96 | 129 | | |
| |||
Lines changed: 9 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
35 | 44 | | |
36 | 45 | | |
37 | 46 | | |
| |||
Lines changed: 126 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
Lines changed: 40 additions & 12 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
38 | | - | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
39 | 41 | | |
40 | | - | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
41 | 45 | | |
42 | 46 | | |
43 | 47 | | |
| |||
152 | 156 | | |
153 | 157 | | |
154 | 158 | | |
155 | | - | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
156 | 163 | | |
157 | 164 | | |
158 | 165 | | |
| |||
329 | 336 | | |
330 | 337 | | |
331 | 338 | | |
332 | | - | |
333 | | - | |
334 | | - | |
335 | | - | |
336 | | - | |
337 | | - | |
338 | | - | |
339 | | - | |
340 | | - | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
341 | 359 | | |
342 | 360 | | |
343 | 361 | | |
| |||
402 | 420 | | |
403 | 421 | | |
404 | 422 | | |
| 423 | + | |
| 424 | + | |
405 | 425 | | |
406 | 426 | | |
407 | 427 | | |
| |||
439 | 459 | | |
440 | 460 | | |
441 | 461 | | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
442 | 470 | | |
443 | 471 | | |
444 | 472 | | |
| |||
Lines changed: 2 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
37 | | - | |
38 | | - | |
| 37 | + | |
| 38 | + | |
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
| |||
0 commit comments