Environment
react-native -v: 0.73
npm ls react-native-macos: 1000.0.0
node -v: v18.14
npm -v: 8.12.1
yarn --version: 1.22.19
xcodebuild -version:
Xcode 15.1
Build version 15C5028h
Steps to reproduce the bug
I was helping out @shwanton in supporting use_frameworks! in react-native-macos.
I managed to have them working with :linkage => :static and the Old Architecture in this PR.
I then started looking into :linkage => :dynamic in the Old Architecture and I hit a wall. MacOS has some circular dependencies that needs to be fixed as dynamic frameworks need to be able to build in isolation and circular dependencies prevent that, unfortunately.
The two dependencies I found are:
First
RCTView depends on RCTText becauese of this
RCTText depends on React-Core because of this
React-Core owns RCTView, thus, the circular dependency
Second
RCTTouchHandler depends on RCTText because of this
RCTText depends on React-Core because of this
React-Core owns RCTView, thus, the circular dependency.
There are various way that we can use to break those:
- we can create a couple of protocols in
React-Core, make the RCTText classes conform to them and use them to decide what to do.
- if the
RCTText classes exposes some specific selector that are custom to them, we can use that instead of the class name
- if the
RCTText classes has some values we can leverage at runtime to make the decision, we can use them.
Expected Behavior
Being able to build with use_frameworks!, :linkage => :dynamic
Actual Behavior
Fails to build

Reproducible Demo
git clone https://github.com/microsoft/react-native-macos
cd react-native-macos
yarn
cd packages/rn-tester
bundle install
NO_FLIPPER=1 USE_FRAMEWORKS=dynamic bundle exec pod install
open RNTestProject.xcworkspace
- Select the RNTester-MacOS target
- cmd + B
Additional context
On mobile, use_frameworks! is a requirement for Firebase, for example. Perhaps Firebase is not compatible with MacOS?
Or aren't there libraries which requires that to be turned on?
Enabling and supporting Swift, requires a folder structure which is exactly the one enforced by frameworks (Clang modules) so it make sense to make sure we support it.
Dynamic frameworks will also catch those circular dependencies automatically!
Environment
Steps to reproduce the bug
I was helping out @shwanton in supporting use_frameworks! in react-native-macos.
I managed to have them working with
:linkage => :staticand the Old Architecture in this PR.I then started looking into
:linkage => :dynamicin the Old Architecture and I hit a wall. MacOS has some circular dependencies that needs to be fixed as dynamic frameworks need to be able to build in isolation and circular dependencies prevent that, unfortunately.The two dependencies I found are:
First
RCTViewdepends onRCTTextbecauese of thisRCTTextdepends onReact-Corebecause of thisReact-CoreownsRCTView, thus, the circular dependencySecond
RCTTouchHandlerdepends onRCTTextbecause of thisRCTTextdepends onReact-Corebecause of thisReact-CoreownsRCTView, thus, the circular dependency.There are various way that we can use to break those:
React-Core, make theRCTTextclasses conform to them and use them to decide what to do.RCTTextclasses exposes some specific selector that are custom to them, we can use that instead of the class nameRCTTextclasses has some values we can leverage at runtime to make the decision, we can use them.Expected Behavior
Being able to build with
use_frameworks!, :linkage => :dynamicActual Behavior
Fails to build

Reproducible Demo
git clone https://github.com/microsoft/react-native-macoscd react-native-macosyarncd packages/rn-testerbundle installNO_FLIPPER=1 USE_FRAMEWORKS=dynamic bundle exec pod installopen RNTestProject.xcworkspaceAdditional context
On mobile, use_frameworks! is a requirement for Firebase, for example. Perhaps Firebase is not compatible with MacOS?
Or aren't there libraries which requires that to be turned on?
Enabling and supporting Swift, requires a folder structure which is exactly the one enforced by frameworks (Clang modules) so it make sense to make sure we support it.
Dynamic frameworks will also catch those circular dependencies automatically!