Skip to content

[turbopack] Improve regressed build speed on cross-compiled MUSL#91477

Draft
mmastrac wants to merge 12 commits intocanaryfrom
mmastrac/faster-link
Draft

[turbopack] Improve regressed build speed on cross-compiled MUSL#91477
mmastrac wants to merge 12 commits intocanaryfrom
mmastrac/faster-link

Conversation

@mmastrac
Copy link
Contributor

No description provided.

@nextjs-bot nextjs-bot added the created-by: Turbopack team PRs by the Turbopack team. label Mar 16, 2026
@mmastrac mmastrac changed the title Improve build speed [turbopack] Improve regressed build speed on cross-compiled MUSL Mar 16, 2026
- Add clang-static/clang-dev/llvm-dev for plugin feature's clang-sys dependency
- Remove conflicting llvm16 before installing newer llvm-dev
- Extract TURBO_ARGS env var for turbo CLI flags (removes -vvv spam)
Remove llvm meta-package before llvm16 to resolve file ownership
conflicts when installing llvm-dev (22).
- Add codegen-units=256: thin LTO recovers cross-CGU opts at link time
- Set CARGO_INCREMENTAL=0 in docker: no wasted I/O on incremental artifacts
- Remove CARGO_PROFILE_RELEASE_LTO passthrough: Cargo.toml is source of truth
- Unset RUSTFLAGS in all docker builds: napi-rs images set it, which
  overrides .cargo/config.toml (caused missing tokio_unstable cfg)
@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Mar 16, 2026

Failing test suites

Commit: 6f7e695 | About building and testing Next.js

pnpm test-start test/e2e/app-dir/next-after-app-static/build-time/build-time.test.ts (job)

  • after() in static pages > runs after during build (DD)
Expand output

● after() in static pages › runs after during build

can not run export while server is running, use next.stop() first

  251 |   ) {
  252 |     if (this.childProcess) {
> 253 |       throw new Error(
      |             ^
  254 |         `can not run export while server is running, use next.stop() first`
  255 |       )
  256 |     }

  at NextStartInstance.build (lib/next-modes/next-start.ts:253:13)
  at Object.build (e2e/app-dir/next-after-app-static/build-time/build-time.test.ts:36:36)

@codspeed-hq
Copy link

codspeed-hq bot commented Mar 16, 2026

Merging this PR will degrade performance by 3.08%

❌ 1 regressed benchmark
✅ 16 untouched benchmarks
⏩ 3 skipped benchmarks1

⚠️ Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Simulation react-dom-client.development.js[tracing] 354.2 ms 365.5 ms -3.08%

Comparing mmastrac/faster-link (6f7e695) with canary (a27a11d)

Open in CodSpeed

Footnotes

  1. 3 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Mar 17, 2026

Stats from current PR

✅ No significant changes detected

📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 455ms 455ms ▂▁▁▇█
Cold (Ready in log) 435ms 435ms ▂▁▁▇█
Cold (First Request) 1.101s 1.115s ▃▃▃▇█
Warm (Listen) 456ms 456ms ▂▁▁▇█
Warm (Ready in log) 439ms 440ms ▂▁▁▇█
Warm (First Request) 338ms 343ms ▃▁▁▇█
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 456ms 456ms ▁▁▃▁▃
Cold (Ready in log) 438ms 437ms ▂▂▆▂▃
Cold (First Request) 1.961s 1.947s ▁▁▆▁▃
Warm (Listen) 456ms 456ms ▁▁▃▁▃
Warm (Ready in log) 437ms 438ms ▂▂▅▂▄
Warm (First Request) 1.955s 1.959s ▁▁▅▂▄

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 3.632s 3.737s ▄▁▁██
Cached Build 3.650s 3.731s ▃▁▁██
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 14.299s 14.306s ▁▁▅▁▄
Cached Build 14.435s 14.476s ▁▁▅▁▃
node_modules Size 483 MB 483 MB ▁████
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
0~lwfcrlb4v_9.css gzip 115 B 115 B
00h0nz7r436~l.js gzip 13.3 kB N/A -
02ku7edzc_wf7.js gzip 450 B N/A -
03~yq9q893hmn.js gzip 39.4 kB 39.4 kB
04dv85sxifhcw.js gzip 156 B N/A -
057z-_itqqf-b.js gzip 48.5 kB N/A -
06da--2niyc4f.js gzip 160 B N/A -
08r5-6b-ppll5.js gzip 162 B N/A -
092lcb3fqrrf9.js gzip 8.52 kB N/A -
0aj~xs1l1g8tg.js gzip 8.53 kB N/A -
0c2g.labu7dli.js gzip 65.7 kB N/A -
0eg78sqvyqa0_.js gzip 13.7 kB N/A -
0gi3w58kp~oqc.js gzip 156 B N/A -
0h35gmp9u328z.js gzip 8.54 kB N/A -
0h6fkavebp.iz.js gzip 8.47 kB N/A -
0ino_yf1k3h6k.js gzip 10.4 kB N/A -
0kkm7tesfinr6.js gzip 12.9 kB N/A -
0lpm0ynr-5028.js gzip 7.61 kB N/A -
0lrrt986~5y12.js gzip 158 B N/A -
0m~2yy0-k0.0s.js gzip 169 B N/A -
0mhhjnycobiw0.js gzip 155 B N/A -
0moy~uao4dl.m.js gzip 9.19 kB N/A -
0ok23hm4ar8n~.js gzip 156 B N/A -
0q50rtpusjy90.js gzip 2.28 kB N/A -
0smgy2grrrlka.js gzip 8.58 kB N/A -
0t1dzhdfh0txh.js gzip 215 B 215 B
0vt7pofxnk8in.js gzip 10.1 kB N/A -
0waknu9.3t6oo.js gzip 155 B N/A -
0zid7o0-vupvp.js gzip 225 B N/A -
11yo3xfd6b147.js gzip 12.9 kB N/A -
12-b1bk6sxhe1.js gzip 153 B N/A -
12pz54pfp78.js gzip 70.8 kB N/A -
13.84hqxl_1p7.js gzip 9.76 kB N/A -
14dnd_9rpj0xq.js gzip 157 B N/A -
153924vhr4_fe.js gzip 158 B N/A -
1554wr-t7p6z-.js gzip 8.55 kB N/A -
15tjst79~qy3_.js gzip 1.46 kB N/A -
15z_v00ne4ud0.js gzip 8.47 kB N/A -
16-464sngeif-.js gzip 157 B N/A -
17d_m3p4j9w6r.js gzip 5.62 kB N/A -
17yu~3yiu7d2m.js gzip 8.52 kB N/A -
turbopack-0-..brh1.js gzip 4.17 kB N/A -
turbopack-0-..~z3i.js gzip 4.16 kB N/A -
turbopack-04..w73-.js gzip 4.16 kB N/A -
turbopack-09.._xb0.js gzip 4.16 kB N/A -
turbopack-0e..0770.js gzip 4.16 kB N/A -
turbopack-0h..kcas.js gzip 4.16 kB N/A -
turbopack-0t..wmn2.js gzip 4.16 kB N/A -
turbopack-0v..~ywt.js gzip 4.16 kB N/A -
turbopack-0v..wfoc.js gzip 4.16 kB N/A -
turbopack-12..54g7.js gzip 4.14 kB N/A -
turbopack-15..qxy..js gzip 4.16 kB N/A -
turbopack-15..~cak.js gzip 4.16 kB N/A -
turbopack-15..42.-.js gzip 4.16 kB N/A -
turbopack-16..mm6b.js gzip 4.16 kB N/A -
03t__~.5lvgeu.js gzip N/A 5.62 kB -
04d6ll75jqx3r.js gzip N/A 9.19 kB -
0583exyh-yhc7.js gzip N/A 9.76 kB -
072lv63r8dcz~.js gzip N/A 8.58 kB -
07ck-m4a5-5so.js gzip N/A 168 B -
07k6dcww5s4pu.js gzip N/A 13.7 kB -
0ar1~bwpezfgw.js gzip N/A 13.3 kB -
0c99mq1ez2bke.js gzip N/A 450 B -
0cbo6rhjf7w-6.js gzip N/A 156 B -
0cq-cmde_ws6u.js gzip N/A 8.47 kB -
0fwf102w10o9~.js gzip N/A 8.52 kB -
0gtmn.q_j1v5r.js gzip N/A 10.4 kB -
0h5~v-tahitcf.js gzip N/A 10.1 kB -
0j3.53ftqt4y3.js gzip N/A 155 B -
0ko7npzyoqvxn.js gzip N/A 156 B -
0l4d~z7ixj3wz.js gzip N/A 12.9 kB -
0le9gtymglk8m.js gzip N/A 65.7 kB -
0nclq9z6yzzm5.js gzip N/A 1.46 kB -
0nkn_f7bxhnni.js gzip N/A 153 B -
0nzumcogektg7.js gzip N/A 8.55 kB -
0s.c-cn5eebrx.js gzip N/A 8.47 kB -
0s6.ndj~wg5qp.js gzip N/A 70.8 kB -
0tj0jb~karm2q.js gzip N/A 157 B -
0tna7lg6q4zne.js gzip N/A 12.9 kB -
0vgt1zz9fdplj.js gzip N/A 160 B -
0votdfxr5fb5u.js gzip N/A 2.28 kB -
0wta5m-wk8slp.js gzip N/A 156 B -
0y6di8fz_8qyy.js gzip N/A 48.4 kB -
0y6r7p5ybjw0c.js gzip N/A 155 B -
0ykl9bs_qj.5..js gzip N/A 8.52 kB -
0zfen0tnxp4gh.js gzip N/A 8.55 kB -
10wkq1h9jzkg..js gzip N/A 225 B -
12u_his5dkcg..js gzip N/A 163 B -
13x7j-eiy1i9a.js gzip N/A 158 B -
149ndfh8zfcaz.js gzip N/A 8.53 kB -
168xlbkju2cj0.js gzip N/A 7.6 kB -
182e911.xpa71.js gzip N/A 156 B -
18c1kf~drwh4e.js gzip N/A 156 B -
turbopack-0....5ku.js gzip N/A 4.16 kB -
turbopack-04..oqi6.js gzip N/A 4.16 kB -
turbopack-05..6cp7.js gzip N/A 4.16 kB -
turbopack-09..mwo1.js gzip N/A 4.16 kB -
turbopack-0a..ba9o.js gzip N/A 4.16 kB -
turbopack-0c..0f0j.js gzip N/A 4.16 kB -
turbopack-0h..n9zu.js gzip N/A 4.16 kB -
turbopack-0p.._66z.js gzip N/A 4.16 kB -
turbopack-0q..rbnk.js gzip N/A 4.14 kB -
turbopack-0u..x~nx.js gzip N/A 4.16 kB -
turbopack-0v..hq2f.js gzip N/A 4.16 kB -
turbopack-0z..szyb.js gzip N/A 4.16 kB -
turbopack-10..qhh7.js gzip N/A 4.17 kB -
turbopack-13..lfek.js gzip N/A 4.16 kB -
Total 463 kB 463 kB ✅ -14 B

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 712 B 711 B
Total 712 B 711 B ✅ -1 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 426 B 429 B
Total 426 B 429 B ⚠️ +3 B

📦 Webpack

Client

Main Bundles
Canary PR Change
5528-HASH.js gzip 5.54 kB N/A -
6280-HASH.js gzip 60.3 kB N/A -
6335.HASH.js gzip 169 B N/A -
912-HASH.js gzip 4.59 kB N/A -
e8aec2e4-HASH.js gzip 62.7 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB
main-app-HASH.js gzip 254 B 254 B
main-HASH.js gzip 39.2 kB 39.2 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
262-HASH.js gzip N/A 4.59 kB -
2889.HASH.js gzip N/A 169 B -
5602-HASH.js gzip N/A 5.55 kB -
6948ada0-HASH.js gzip N/A 62.7 kB -
9544-HASH.js gzip N/A 60.9 kB -
Total 234 kB 235 kB ⚠️ +656 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 194 B 194 B
_error-HASH.js gzip 183 B 180 B 🟢 3 B (-2%)
css-HASH.js gzip 331 B 330 B
dynamic-HASH.js gzip 1.81 kB 1.81 kB
edge-ssr-HASH.js gzip 256 B 256 B
head-HASH.js gzip 351 B 352 B
hooks-HASH.js gzip 384 B 383 B
image-HASH.js gzip 580 B 581 B
index-HASH.js gzip 260 B 260 B
link-HASH.js gzip 2.51 kB 2.51 kB
routerDirect..HASH.js gzip 320 B 319 B
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 315 B 315 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.98 kB 7.98 kB ✅ -1 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 125 kB 125 kB
page.js gzip 269 kB 268 kB
Total 393 kB 393 kB ✅ -346 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 618 B 615 B
middleware-r..fest.js gzip 156 B 155 B
middleware.js gzip 43.8 kB 43.8 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 45.4 kB 45.4 kB ✅ -77 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 715 B 718 B
Total 715 B 718 B ⚠️ +3 B
Build Cache
Canary PR Change
0.pack gzip 4.27 MB 4.26 MB 🟢 6.11 kB (0%)
index.pack gzip 111 kB 110 kB
index.pack.old gzip 110 kB 111 kB
Total 4.49 MB 4.48 MB ✅ -6.37 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 333 kB 333 kB
app-page-exp..prod.js gzip 181 kB 181 kB
app-page-tur...dev.js gzip 332 kB 332 kB
app-page-tur..prod.js gzip 181 kB 181 kB
app-page-tur...dev.js gzip 329 kB 329 kB
app-page-tur..prod.js gzip 179 kB 179 kB
app-page.run...dev.js gzip 329 kB 329 kB
app-page.run..prod.js gzip 179 kB 179 kB
app-route-ex...dev.js gzip 76 kB 76 kB
app-route-ex..prod.js gzip 51.7 kB 51.7 kB
app-route-tu...dev.js gzip 76 kB 76 kB
app-route-tu..prod.js gzip 51.7 kB 51.7 kB
app-route-tu...dev.js gzip 75.6 kB 75.6 kB
app-route-tu..prod.js gzip 51.5 kB 51.5 kB
app-route.ru...dev.js gzip 75.6 kB 75.6 kB
app-route.ru..prod.js gzip 51.5 kB 51.5 kB
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 43.3 kB 43.3 kB
pages-api-tu..prod.js gzip 33 kB 33 kB
pages-api.ru...dev.js gzip 43.3 kB 43.3 kB
pages-api.ru..prod.js gzip 33 kB 33 kB
pages-turbo....dev.js gzip 52.7 kB 52.7 kB
pages-turbo...prod.js gzip 38.6 kB 38.6 kB
pages.runtim...dev.js gzip 52.7 kB 52.7 kB
pages.runtim..prod.js gzip 38.6 kB 38.6 kB
server.runti..prod.js gzip 62.4 kB 62.4 kB
Total 2.95 MB 2.95 MB ⚠️ +4 B
📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/6f7e695cb800bfce5db6eea8f0de97d7db04b8b2/next

mmastrac and others added 6 commits March 16, 2026 18:08
…USTFLAGS

- Keep opt-level="s" for lightningcss, swc_ecma_compat_es2015,
  swc_ecma_transforms_proposal, wast (saves ~1.5 MiB combined)
- Remove all other per-package opt-level overrides (no-ops or negligible)
- Also unset CARGO_ENCODED_RUSTFLAGS in docker builds — napi-rs images
  may set this, which overrides .cargo/config.toml even after unsetting
  RUSTFLAGS
The napi CLI unconditionally sets RUSTFLAGS on cargo subprocesses, overriding
.cargo/config.toml. Instead of exporting RUSTFLAGS inside each docker build
command, set it via $GITHUB_ENV before the docker step and pass it through
with -e RUSTFLAGS. The generated rustflags.yml moves from .cargo/ to .github/.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove 36 per-package opt-level overrides that were missed in the
  initial cleanup (only lightningcss, swc_ecma_compat_es2015,
  swc_ecma_transforms_proposal, wast are kept)
- Remove stale "--env-mode loose" comments (args now live in TURBO_ARGS)
- Anchor grep pattern with ^ to prevent substring matches

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Restore cross-linker (aarch64-linux-musl-gcc) for aarch64-musl target:
  self-contained LLD resolves to host (x86_64) sysroot during cross-compile
- Remove 36 leftover per-package opt-level overrides from Cargo.toml
- Add comment that opt-level="s" entries should come from cargo bloat stats
- Remove stale --env-mode loose comments, anchor grep in RUSTFLAGS step

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

created-by: Turbopack team PRs by the Turbopack team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants