1# Copyright (c) Meta Platforms, Inc. and affiliates.
2#
3# This source code is licensed under the MIT license found in the
4# LICENSE file in the root directory of this source tree.
5
6require "json"
7
8package = JSON.parse(File.read(File.join(__dir__, "package.json")))
9version = package['version']
10
11
12
13folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
14folly_version = '2021.07.22.00'
15socket_rocket_version = '0.6.1'
16boost_compiler_flags = '-Wno-documentation'
17
18use_hermes = ENV['USE_HERMES'] == '1'
19use_frameworks = ENV['USE_FRAMEWORKS'] != nil
20
21header_subspecs = {
22  'CoreModulesHeaders'          => 'React/CoreModules/**/*.h',
23  'RCTActionSheetHeaders'       => 'Libraries/ActionSheetIOS/*.h',
24  'RCTAnimationHeaders'         => 'Libraries/NativeAnimation/{Drivers/*,Nodes/*,*}.{h}',
25  'RCTBlobHeaders'              => 'Libraries/Blob/{ABI49_0_0RCTBlobManager,ABI49_0_0RCTFileReaderModule}.h',
26  'RCTImageHeaders'             => 'Libraries/Image/*.h',
27  'RCTLinkingHeaders'           => 'Libraries/LinkingIOS/*.h',
28  'RCTNetworkHeaders'           => 'Libraries/Network/*.h',
29  'RCTPushNotificationHeaders'  => 'Libraries/PushNotificationIOS/*.h',
30  'RCTSettingsHeaders'          => 'Libraries/Settings/*.h',
31  'RCTTextHeaders'              => 'Libraries/Text/**/*.h',
32  'RCTVibrationHeaders'         => 'Libraries/Vibration/*.h',
33}
34
35frameworks_search_paths = []
36frameworks_search_paths << "\"$(PODS_CONFIGURATION_BUILD_DIR)/ABI49_0_0React-hermes\"" if use_hermes
37frameworks_search_paths << "\"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon\"" if use_frameworks
38frameworks_search_paths << "\"$(PODS_CONFIGURATION_BUILD_DIR)/ABI49_0_0React-RCTFabric\"" if use_frameworks
39
40header_search_paths = [
41  "$(PODS_TARGET_SRCROOT)/ReactCommon",
42  "$(PODS_ROOT)/boost",
43  "$(PODS_ROOT)/DoubleConversion",
44  "$(PODS_ROOT)/RCT-Folly",
45  "${PODS_ROOT}/Headers/Public/FlipperKit",
46  "$(PODS_ROOT)/Headers/Public/ABI49_0_0ReactCommon",
47  "$(PODS_ROOT)/Headers/Public/ABI49_0_0React-RCTFabric"
48].concat(use_hermes ? [
49  "$(PODS_ROOT)/Headers/Public/ABI49_0_0React-hermes",
50  "$(PODS_ROOT)/Headers/Public/ABI49_0_0hermes-engine"
51] : []).concat(use_frameworks ? [
52  "$(PODS_CONFIGURATION_BUILD_DIR)/ABI49_0_0ReactCommon/ReactCommon.framework/Headers",
53  "$(PODS_CONFIGURATION_BUILD_DIR)/ABI49_0_0ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core",
54  "$(PODS_CONFIGURATION_BUILD_DIR)/React-NativeModulesApple/React_NativeModulesApple.framework/Headers"
55] : []).map{|p| "\"#{p}\""}.join(" ")
56
57Pod::Spec.new do |s|
58  s.name                   = "ABI49_0_0React-Core"
59  s.version                = version
60  s.summary                = "The core of React Native."
61  s.homepage               = "https://reactnative.dev/"
62  s.license                = package["license"]
63  s.author                 = "Meta Platforms, Inc. and its affiliates"
64  s.platforms              = { :ios => "12.4" }
65  s.source                 = { :path => "." }
66  s.resource_bundle        = { "ABI49_0_0AccessibilityResources" => ["React/AccessibilityResources/*.lproj"]}
67  s.compiler_flags         = folly_compiler_flags + ' ' + boost_compiler_flags
68  s.header_dir             = "ABI49_0_0React"
69  s.framework              = "JavaScriptCore"
70  s.pod_target_xcconfig    = {
71                               "HEADER_SEARCH_PATHS" => header_search_paths,
72                               "DEFINES_MODULE" => "YES",
73                               "GCC_PREPROCESSOR_DEFINITIONS" => "RCT_METRO_PORT=${RCT_METRO_PORT}",
74                               "CLANG_CXX_LANGUAGE_STANDARD" => "c++17",
75                               "FRAMEWORK_SEARCH_PATHS" => frameworks_search_paths.join(" ")
76                             }
77  s.user_target_xcconfig   = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/Headers/Private/ABI49_0_0React-Core\""}
78  s.default_subspec        = "Default"
79
80  s.subspec "Default" do |ss|
81    ss.source_files           = "React/**/*.{c,h,m,mm,S,cpp}"
82    exclude_files = [
83      "React/CoreModules/**/*",
84      "React/DevSupport/**/*",
85      "React/Fabric/**/*",
86      "React/FBReactNativeSpec/**/*",
87      "React/Tests/**/*",
88      "React/Inspector/**/*"
89    ]
90    # If we are using Hermes (the default is use hermes, so USE_HERMES can be nil), we don't have jsc installed
91    # So we have to exclude the JSCExecutorFactory
92    #
93    # NOTE(kudo): Exposing JSC files as Expo Go hosts duo engines
94    # if ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == "1"
95    #   exclude_files = exclude_files.append("React/CxxBridge/JSCExecutorFactory.{h,mm}")
96    # end
97    ss.exclude_files = exclude_files
98    ss.private_header_files   = "React/Cxx*/*.h"
99  end
100
101  s.subspec "DevSupport" do |ss|
102    ss.source_files = "React/DevSupport/*.{h,mm,m}",
103                      "React/Inspector/*.{h,mm,m}"
104
105    ss.dependency "ABI49_0_0React-Core/Default", version
106    ss.dependency "ABI49_0_0React-Core/RCTWebSocket", version
107    ss.dependency "ABI49_0_0React-jsinspector", version
108  end
109
110  s.subspec "RCTWebSocket" do |ss|
111    ss.source_files = "Libraries/WebSocket/*.{h,m}"
112    ss.dependency "ABI49_0_0React-Core/Default", version
113  end
114
115  # Add a subspec containing just the headers for each
116  # pod that should live under <React/*.h>
117  header_subspecs.each do |name, headers|
118    s.subspec name do |ss|
119      ss.source_files = headers
120      ss.dependency "ABI49_0_0React-Core/Default"
121    end
122  end
123
124  s.dependency "RCT-Folly", folly_version
125  s.dependency "ABI49_0_0React-cxxreact"
126  s.dependency "ABI49_0_0React-perflogger"
127  s.dependency "ABI49_0_0React-jsi"
128  s.dependency "ABI49_0_0React-jsiexecutor"
129  s.dependency "ABI49_0_0React-utils"
130  s.dependency "SocketRocket", socket_rocket_version
131  s.dependency "ABI49_0_0React-runtimeexecutor"
132  s.dependency "ABI49_0_0Yoga"
133  s.dependency "glog"
134
135  if ENV['USE_HERMES'] == "0"
136    s.dependency 'ABI49_0_0React-jsc'
137  else
138    s.dependency 'ABI49_0_0React-hermes'
139    s.dependency 'ABI49_0_0hermes-engine'
140  end
141end
142