fix(ios): raise deployment target to 17.0 and stabilize Babel hoisting#1085
Merged
msluszniak merged 4 commits intomainfrom Apr 20, 2026
Merged
fix(ios): raise deployment target to 17.0 and stabilize Babel hoisting#1085msluszniak merged 4 commits intomainfrom
msluszniak merged 4 commits intomainfrom
Conversation
Aligns build configs with the iOS 17.0 minimum already documented in README. The prebuilt executorch libraries are built at minos=17.0, so linking them into apps targeting 15.1 produced "built for newer iOS version" linker warnings at every app build. Apps' ios/ directories are gitignored, so Expo apps get the target via expo-build-properties in app.json (adding the dep where missing) rather than editing generated files that would be overwritten on next prebuild. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Yarn hoists babel-preset-expo to the repo root while, by default, it
leaves expo-router inside per-app node_modules. babel-preset-expo
calls require.resolve('expo-router') from its own location to decide
whether to register its expo-router Babel plugin; when the two
packages are split across different node_modules folders the check
fails, process.env.EXPO_ROUTER_APP_ROOT is never replaced with a
literal, and Metro rejects require.context(process.env.X, ...) in
expo-router/_ctx.ios.js.
Declaring expo-router in the root devDependencies pins it alongside
babel-preset-expo. The root workspace doesn't actually consume
expo-router at runtime, so it legitimately doesn't provide the seven
peers expo-router advertises (expo, react, react-native, etc.) —
each app that does use expo-router declares them directly. The
scoped logFilters suppress only the YN0002 lines tied to the root
workspace's expo-router peers plus the YN0086 summary; unmet peer
warnings from any other workspace continue to surface.
Reverts the incidental breakage from #1083, which dropped the root
devDependency to silence those same warnings without realizing it
was load-bearing for Babel hoisting.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
react-native-audio-api 0.8.4's common/cpp/audioapi/core/Constants.h uses size_t without including <cstddef>. Recent libc++ headers (Xcode 26.4+) no longer transitively pull it in, so the file fails to compile. Upstream fix: software-mansion/react-native-audio-api#1032. Applies the same one-line include via a Yarn patch so the app builds on Xcode 26.4 without waiting for an upstream release. apps/speech already uses 0.11.5, which carries the fix, so it's untouched. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
0.12.0 ships the upstream <cstddef> include fix (software-mansion/ react-native-audio-api#1032), so the Yarn patch against 0.8.4 is no longer needed and is removed. Adjusts apps/llm for the 0.11/0.12 API changes: - drop react-native-audio-api/metro-config wrapper (subpath removed; it only collapsed internal stack frames for symbolication) - AudioRecorder now takes no constructor args; recording params moved to onAudioReady(options, callback) - iosOptions: 'allowBluetooth' was renamed to 'allowBluetoothHFP' Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
qvpiotr
approved these changes
Apr 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
expo-build-properties) so the target matches the prebuilt executorch libraries (minos 17.0). Silences the "was built for newer iOS version" linker warnings that previously ran at the end of every iOS build.expo-routerto the workspace rootdevDependenciesso Yarn hoists it next tobabel-preset-expo. Without this,babel-preset-expo'srequire.resolve('expo-router')check fails, its expo-router Babel plugin is never registered,process.env.EXPO_ROUTER_APP_ROOTstays un-inlined, and Metro rejectsrequire.contextinexpo-router/_ctx.ios.js. Reverts the incidental breakage from chore: clean up root peer deps and drop ignored resolutions #1083.logFiltersin.yarnrc.ymlto silence the YN0002 lines for the root workspace's expo-router peers (and the YN0086 summary). Warnings from any other workspace still surface. The mechanism mirrors the existing@signalwire/docusaurus-theme-llms-txtfilter.Why iOS 17 specifically
The executorch prebuilt libraries (
libexecutorch_ios.a,libbackend_xnnpack_ios.a, etc.) andExecutorchLib.xcframeworkare built withminos=17.0. Linking them into an app with a lower deployment target produces a run of linker warnings on every build. README already documents iOS 17.0 as the minimum supported version, so this change also brings build configs in line with the docs.Remaining warnings after this PR
minos=26.0, which is way above the app target. Out of scope here; the library is being rebuilt by a separate team member.Test plan
yarnat repo root completes without YN0002 / YN0086 warnings (PR chore: clean up root peer deps and drop ignored resolutions #1083's original goal, preserved).apps/{llm,computer-vision,speech,text-embeddings}):rm -rf ios && yarn iossuccessfully prebuilds, installs pods, and builds.apps/bare-rn:pod install && yarn iosbuilds; no executorch version-mismatch linker warnings.llm,computer-vision,text-embeddings) — the_ctx.ios.jsrequire.contexterror reported during development is resolved by the hoist fix.apps/llmbuilds on Xcode 26.4 without thesize_t/Constants.hcompile error fromreact-native-audio-api.🤖 Generated with Claude Code