Skip to content

Commit a68c418

Browse files
hramosfacebook-github-bot
authored andcommitted
Do not build JSI in React-jsi when Hermes is enabled, resolve JSI ODR violation (#35038)
Summary: Pull Request resolved: #35038 React-jsi provides JSI to allow React Native to interface with JavaScriptCore. The hermes-engine Pod provides a second copy of JSI, as Hermes is built and linked statically with JSI. This second copy of JSI would lead to an [ODR Violation](https://en.cppreference.com/w/cpp/language/definition). To resolve this, when Hermes is enabled: - React-hermes and hermes-engine are installed. - React-jsc is not installed. - React-jsi continues to be installed. - React-jsi will not build JSI. - React-jsi will declare a dependency on hermes-engine. The result is that the JSI dependency for React Native is satisfied by hermes-engine, and there is no duplicate JSI library in the project. When Hermes is disabled: - React-jsi and React-jsc are installed. - React-hermes and hermes-engine are not installed. - React-jsi will build JSI. Changelog: [iOS][Changed] Resolve JSI ODR violation, make hermes-engine the JSI provider when Hermes is enabled Reviewed By: cipolleschi Differential Revision: D40334913 fbshipit-source-id: 409407a193a35cbd21b0e8778537b3627e4c54a2
1 parent 22e4bdf commit a68c418

30 files changed

+79
-83
lines changed

Libraries/Blob/React-RCTBlob.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ Pod::Spec.new do |s|
4242
s.dependency "React-Codegen", version
4343
s.dependency "ReactCommon/turbomodule/core", version
4444
s.dependency "React-jsi", version
45-
s.dependency "React-jsc", version
4645
s.dependency "React-Core/RCTBlobHeaders", version
4746
s.dependency "React-Core/RCTWebSocket", version
4847
s.dependency "React-RCTNetwork", version

Libraries/Image/React-RCTImage.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ Pod::Spec.new do |s|
4444
s.dependency "RCTTypeSafety", version
4545
s.dependency "ReactCommon/turbomodule/core", version
4646
s.dependency "React-jsi", version
47-
s.dependency "React-jsc", version
4847
s.dependency "React-Core/RCTImageHeaders", version
4948
s.dependency "React-RCTNetwork", version
5049
end

Libraries/LinkingIOS/React-RCTLinking.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,4 @@ Pod::Spec.new do |s|
4343
s.dependency "React-Core/RCTLinkingHeaders", version
4444
s.dependency "ReactCommon/turbomodule/core", version
4545
s.dependency "React-jsi", version
46-
s.dependency "React-jsc", version
4746
end

Libraries/NativeAnimation/React-RCTAnimation.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,5 @@ Pod::Spec.new do |s|
4343
s.dependency "RCTTypeSafety", version
4444
s.dependency "ReactCommon/turbomodule/core", version
4545
s.dependency "React-jsi", version
46-
s.dependency "React-jsc", version
4746
s.dependency "React-Core/RCTAnimationHeaders", version
4847
end

Libraries/Network/React-RCTNetwork.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,5 @@ Pod::Spec.new do |s|
4444
s.dependency "RCTTypeSafety", version
4545
s.dependency "ReactCommon/turbomodule/core", version
4646
s.dependency "React-jsi", version
47-
s.dependency "React-jsc", version
4847
s.dependency "React-Core/RCTNetworkHeaders", version
4948
end

Libraries/PushNotificationIOS/React-RCTPushNotification.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,4 @@ Pod::Spec.new do |s|
4545
s.dependency "React-Core/RCTPushNotificationHeaders", version
4646
s.dependency "ReactCommon/turbomodule/core", version
4747
s.dependency "React-jsi", version
48-
s.dependency "React-jsc", version
4948
end

Libraries/Settings/React-RCTSettings.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,5 @@ Pod::Spec.new do |s|
4444
s.dependency "RCTTypeSafety", version
4545
s.dependency "ReactCommon/turbomodule/core", version
4646
s.dependency "React-jsi", version
47-
s.dependency "React-jsc", version
4847
s.dependency "React-Core/RCTSettingsHeaders", version
4948
end

Libraries/Vibration/React-RCTVibration.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,5 @@ Pod::Spec.new do |s|
4444
s.dependency "React-Codegen", version
4545
s.dependency "ReactCommon/turbomodule/core", version
4646
s.dependency "React-jsi", version
47-
s.dependency "React-jsc", version
4847
s.dependency "React-Core/RCTVibrationHeaders", version
4948
end

React-Core.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ Pod::Spec.new do |s|
111111
s.dependency "React-cxxreact", version
112112
s.dependency "React-perflogger", version
113113
s.dependency "React-jsi", version
114-
s.dependency "React-jsc", version
115114
s.dependency "React-jsiexecutor", version
116115
s.dependency "Yoga"
117116
s.dependency "glog"

React/CoreModules/React-CoreModules.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,4 @@ Pod::Spec.new do |s|
4444
s.dependency "React-RCTImage", version
4545
s.dependency "ReactCommon/turbomodule/core", version
4646
s.dependency "React-jsi", version
47-
s.dependency "React-jsc", version
4847
end

React/FBReactNativeSpec/FBReactNativeSpec.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ Pod::Spec.new do |s|
4747
s.dependency "RCTTypeSafety", version
4848
s.dependency "React-Core", version
4949
s.dependency "React-jsi", version
50-
s.dependency "React-jsc", version
5150
s.dependency "ReactCommon/turbomodule/core", version
5251

5352
use_react_native_codegen!(s, {

ReactCommon/React-Fabric.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ Pod::Spec.new do |s|
4242
s.dependency "RCTTypeSafety", version
4343
s.dependency "ReactCommon/turbomodule/core", version
4444
s.dependency "React-jsi", version
45-
s.dependency "React-jsc", version
4645

4746
s.subspec "animations" do |ss|
4847
ss.dependency folly_dep_name, folly_version

ReactCommon/React-bridging.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,4 @@ Pod::Spec.new do |s|
4040

4141
s.dependency "RCT-Folly", folly_version
4242
s.dependency "React-jsi", version
43-
s.dependency "React-jsc", version
4443
end

ReactCommon/ReactCommon.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ Pod::Spec.new do |s|
4646
ss.dependency "React-Core", version
4747
ss.dependency "React-cxxreact", version
4848
ss.dependency "React-jsi", version
49-
ss.dependency "React-jsc", version
5049
ss.dependency "RCT-Folly", folly_version
5150
s.dependency "React-logger", version
5251
ss.dependency "DoubleConversion"

ReactCommon/cxxreact/React-cxxreact.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,5 @@ Pod::Spec.new do |s|
4545
s.dependency "React-runtimeexecutor", version
4646
s.dependency "React-perflogger", version
4747
s.dependency "React-jsi", version
48-
s.dependency "React-jsc", version
4948
s.dependency "React-logger", version
5049
end

ReactCommon/hermes/React-hermes.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ Pod::Spec.new do |s|
4444
}.merge!(build_type == :debug ? { "GCC_PREPROCESSOR_DEFINITIONS" => "HERMES_ENABLE_DEBUGGER=1" } : {})
4545
s.header_dir = "reacthermes"
4646
s.dependency "React-cxxreact", version
47-
s.dependency "React-jsi", version
47+
s.dependency "React-jsidynamic", version
4848
s.dependency "React-jsiexecutor", version
4949
s.dependency "React-jsinspector", version
5050
s.dependency "React-perflogger", version

ReactCommon/jsi/React-jsc.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ Pod::Spec.new do |s|
2929
s.exclude_files = "**/test/*"
3030
s.framework = "JavaScriptCore"
3131
s.dependency "React-jsi", version
32-
3332
s.default_subspec = "Default"
3433

3534
s.subspec "Default" do

ReactCommon/jsi/React-jsi.podspec

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55

66
require "json"
77

8+
js_engine = ENV['USE_HERMES'] == "0" ?
9+
:jsc :
10+
:hermes
11+
812
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
913
version = package['version']
1014

@@ -25,12 +29,19 @@ Pod::Spec.new do |s|
2529
s.author = "Facebook, Inc. and its affiliates"
2630
s.platforms = { :ios => "12.4" }
2731
s.source = source
28-
s.source_files = "jsi/*.{cpp,h}"
29-
s.exclude_files = [
30-
"jsi/JSIDynamic.{h,cpp}",
31-
"jsi/jsilib-posix.cpp",
32-
"jsi/jsilib-windows.cpp",
33-
"**/test/*"
34-
]
35-
s.header_dir = "jsi"
32+
33+
if js_engine == :jsc
34+
s.source_files = "**/*.{cpp,h}"
35+
s.exclude_files = [
36+
"jsi/JSIDynamic.{h,cpp}",
37+
"jsi/jsilib-posix.cpp",
38+
"jsi/jsilib-windows.cpp",
39+
"**/test/*"
40+
]
41+
s.header_dir = "jsi"
42+
elsif js_engine == :hermes
43+
# JSI is provided by hermes-engine when Hermes is enabled
44+
s.source_files = ""
45+
s.dependency "hermes-engine"
46+
end
3647
end

ReactCommon/jsi/React-jsidynamic.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,4 @@ Pod::Spec.new do |s|
3939
s.dependency "RCT-Folly", folly_version
4040
s.dependency "glog"
4141
s.dependency "React-jsi", version
42-
s.dependency "React-jsc", version
4342
end

ReactCommon/runtimeexecutor/React-runtimeexecutor.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,4 @@ Pod::Spec.new do |s|
3333
s.header_dir = "ReactCommon"
3434

3535
s.dependency "React-jsi", version
36-
s.dependency "React-jsc", version
3736
end

packages/rn-tester/Podfile.lock

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ PODS:
122122
- React-callinvoker (1000.0.0)
123123
- React-Codegen (1000.0.0):
124124
- FBReactNativeSpec (= 1000.0.0)
125+
- hermes-engine (= 1000.0.0)
125126
- RCT-Folly (= 2021.07.22.00)
126127
- RCTRequired (= 1000.0.0)
127128
- RCTTypeSafety (= 1000.0.0)
@@ -615,26 +616,12 @@ PODS:
615616
- RCT-Folly (= 2021.07.22.00)
616617
- RCT-Folly/Futures (= 2021.07.22.00)
617618
- React-cxxreact (= 1000.0.0)
618-
- React-jsi (= 1000.0.0)
619+
- React-jsidynamic (= 1000.0.0)
619620
- React-jsiexecutor (= 1000.0.0)
620621
- React-jsinspector (= 1000.0.0)
621622
- React-perflogger (= 1000.0.0)
622623
- React-jsi (1000.0.0):
623-
- boost (= 1.76.0)
624-
- DoubleConversion
625-
- glog
626-
- RCT-Folly (= 2021.07.22.00)
627-
- React-jsi/Default (= 1000.0.0)
628-
- React-jsi/Default (1000.0.0):
629-
- boost (= 1.76.0)
630-
- DoubleConversion
631-
- glog
632-
- RCT-Folly (= 2021.07.22.00)
633-
- React-jsi/Fabric (1000.0.0):
634-
- boost (= 1.76.0)
635-
- DoubleConversion
636-
- glog
637-
- RCT-Folly (= 2021.07.22.00)
624+
- hermes-engine
638625
- React-jsidynamic (1000.0.0):
639626
- boost (= 1.76.0)
640627
- DoubleConversion
@@ -810,7 +797,6 @@ DEPENDENCIES:
810797
- React-graphics (from `../../ReactCommon/react/renderer/graphics`)
811798
- React-hermes (from `../../ReactCommon/hermes`)
812799
- React-jsi (from `../../ReactCommon/jsi`)
813-
- React-jsi/Fabric (from `../../ReactCommon/jsi`)
814800
- React-jsidynamic (from `../../ReactCommon/jsi`)
815801
- React-jsiexecutor (from `../../ReactCommon/jsiexecutor`)
816802
- React-jsinspector (from `../../ReactCommon/jsinspector`)
@@ -959,7 +945,7 @@ SPEC CHECKSUMS:
959945
FlipperKit: cbdee19bdd4e7f05472a66ce290f1b729ba3cb86
960946
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
961947
glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b
962-
hermes-engine: 041c211d43030d9aeff8faa388c019d19e752172
948+
hermes-engine: 2c30267d0c2771edc2d369ac694d45f1278ab08b
963949
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
964950
OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c
965951
RCT-Folly: 0080d0a6ebf2577475bda044aa59e2ca1f909cda
@@ -968,22 +954,22 @@ SPEC CHECKSUMS:
968954
React: 8d809d414723bb5763093ddec7658066a21ccabc
969955
React-bridging: c8806159f8ef90f27443857eed1efdb8c85940e1
970956
React-callinvoker: 5f16202ad4e45f0607b1fae0f6955a8f7c87eef1
971-
React-Codegen: 5adf19af97eb37a7d441c040521191e446255086
972-
React-Core: ce4282fb714ffbe444b84d296d1728eaee4d0e9f
957+
React-Codegen: d2434d5e4d238bceef25f40c4f58b199eb981ad0
958+
React-Core: 3965263aa4b4e1ebf7b4fdb50d2f49ce7bf28f63
973959
React-CoreModules: 675170bccf156da3a3348e04e2036ce401b2010d
974960
React-cxxreact: 7276467c246302fedf598cc40d7003896ddb20ba
975961
React-Fabric: 141459e61c825acf02d26ece099acbd9cbd87b99
976962
React-graphics: 5ccc9cc0d91794fd42bc1c693e9aea207554bbef
977-
React-hermes: 7b9306aee1d58ba030614e54eb8041056119430f
978-
React-jsi: c2a71fdc55642893768c517199fb8a71805159dc
963+
React-hermes: 0a5145bae4207edf0def8e28fbcb6a8fd6e806c2
964+
React-jsi: c24dbcfdf7ea075138b73372387c7f17c0db56ef
979965
React-jsidynamic: 2b14ac1b6d3a1b7daa1e5a424b98de87da981698
980966
React-jsiexecutor: 14e899380e3fe9ca74c4e19727540a03e7574721
981967
React-jsinspector: 7733dd522d044aef87caa39f3eda77593358a7eb
982968
React-logger: c7960346b021767ed90971aff592a44e3d69f8bb
983969
React-perflogger: c4fdd48988c2d3047186fc1bc1772d634cfca2ea
984970
React-RCTActionSheet: 166fd1df85ac10219466b45d12a5884d3eaceac1
985971
React-RCTAnimation: d6127046c6bb44bd3e67b7503c4ad7f91131b58e
986-
React-RCTAppDelegate: 475ca9b80e26c1c4aed93ce04363092fa78cf788
972+
React-RCTAppDelegate: e427b692bf829e40f9b318e2a29dca2ab5f36cf6
987973
React-RCTBlob: 68675c89ebe6edf310dddd0774ba07b685f090a9
988974
React-RCTFabric: a98a6effece6719669b8c6b4d2c33fb0edddc613
989975
React-RCTImage: 6de9f0f4402af859849e97cc73a56a52f400f4c9

packages/rn-tester/RCTTest/React-RCTTest.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,4 @@ Pod::Spec.new do |s|
4444
s.dependency "React-CoreModules", version
4545
s.dependency "ReactCommon/turbomodule/core", version
4646
s.dependency "React-jsi", version
47-
s.dependency "React-jsc", version
4847
end

scripts/cocoapods/__tests__/codegen_utils-test.rb

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ def teardown
3939
Dir.reset()
4040
end
4141

42-
# ================================== #
43-
# Test - GenerateReactCodegenPodspec #
44-
# ================================== #
42+
# ================================== #
43+
# Test - GenerateReactCodegenPodspec #
44+
# ================================== #
4545

4646
def testGenerateReactCodegenPodspec_whenItHasBeenAlreadyGenerated_doesNothing
4747
# Arrange
@@ -80,18 +80,19 @@ def testGenerateReactCodegenPodspec_whenItHasNotBeenAlreadyGenerated_generatesIt
8080
assert_true(CodegenUtils.react_codegen_podspec_generated)
8181
end
8282

83-
# ========================== #
84-
# Test - GetReactCodegenSpec #
85-
# ========================== #
83+
# ========================== #
84+
# Test - GetReactCodegenSpec #
85+
# ========================== #
8686

8787
def testGetReactCodegenSpec_whenFabricDisabledAndNoScriptPhases_generatesAPodspec
88-
# Arrange
88+
# Arrange
8989
File.files_to_read('package.json' => '{ "version": "99.98.97"}')
9090

91-
# Act
91+
# Act
9292
podspec = CodegenUtils.new().get_react_codegen_spec(
9393
'package.json',
9494
:fabric_enabled => false,
95+
:hermes_enabled => true,
9596
:script_phases => nil
9697
)
9798

@@ -101,13 +102,14 @@ def testGetReactCodegenSpec_whenFabricDisabledAndNoScriptPhases_generatesAPodspe
101102
end
102103

103104
def testGetReactCodegenSpec_whenFabricEnabledAndScriptPhases_generatesAPodspec
104-
# Arrange
105+
# Arrange
105106
File.files_to_read('package.json' => '{ "version": "99.98.97"}')
106107

107108
# Act
108109
podspec = CodegenUtils.new().get_react_codegen_spec(
109110
'package.json',
110111
:fabric_enabled => true,
112+
:hermes_enabled => true,
111113
:script_phases => "echo Test Script Phase"
112114
)
113115

@@ -117,11 +119,11 @@ def testGetReactCodegenSpec_whenFabricEnabledAndScriptPhases_generatesAPodspec
117119
end
118120

119121
# =============================== #
120-
# Test - GetCodegenConfigFromFile #
121-
# =============================== #
122+
# Test - GetCodegenConfigFromFile #
123+
# =============================== #
122124

123125
def testGetCodegenConfigFromFile_whenFileDoesNotExists_returnEmpty
124-
# Arrange
126+
# Arrange
125127

126128
# Act
127129
codegen = CodegenUtils.new().get_codegen_config_from_file('package.json', 'codegenConfig')
@@ -131,7 +133,7 @@ def testGetCodegenConfigFromFile_whenFileDoesNotExists_returnEmpty
131133
end
132134

133135
def testGetCodegenConfigFromFile_whenFileExistsButHasNoKey_returnEmpty
134-
# Arrange
136+
# Arrange
135137
File.mocked_existing_files(['package.json'])
136138
File.files_to_read('package.json' => '{ "codegenConfig": {}}')
137139

@@ -143,7 +145,7 @@ def testGetCodegenConfigFromFile_whenFileExistsButHasNoKey_returnEmpty
143145
end
144146

145147
def testGetCodegenConfigFromFile_whenFileExistsAndHasKey_returnObject
146-
# Arrange
148+
# Arrange
147149
File.mocked_existing_files(['package.json'])
148150
File.files_to_read('package.json' => '{ "codegenConfig": {"name": "MySpec"}}')
149151

@@ -217,7 +219,7 @@ def testGetListOfJSSpecs_whenDoesNotUsesLibraries_returnAListOfFiles
217219

218220
# ================================== #
219221
# Test - GetReactCodegenScriptPhases #
220-
# ================================== #
222+
# ================================== #
221223

222224
def testGetReactCodegenScriptPhases_whenAppPathNotDefined_abort
223225
# Arrange
@@ -370,9 +372,9 @@ def testUseReactCodegenDiscovery_whenParametersAreGood_executeCodegen
370372
])
371373
end
372374

373-
# ============================= #
374-
# Test - CleanUpCodegenFolder #
375-
# ============================= #
375+
# ============================= #
376+
# Test - CleanUpCodegenFolder #
377+
# ============================= #
376378

377379
def testCleanUpCodegenFolder_whenCleanupDone_doNothing
378380
# Arrange
@@ -463,7 +465,7 @@ def get_podspec_no_fabric_no_script
463465
"RCTTypeSafety": ["99.98.97"],
464466
"React-Core": ["99.98.97"],
465467
"React-jsi": ["99.98.97"],
466-
"React-jsc": ["99.98.97"],
468+
"hermes-engine": ["99.98.97"],
467469
"ReactCommon/turbomodule/core": ["99.98.97"]
468470
}
469471
}

0 commit comments

Comments
 (0)