mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
d90fe67123
Summary: Extend the codegen script to allow arbitrary library name to be passed along as an argument, as well as the desired output directory for TurboModules and Fabric output. New arguments: - `:library_name` - `:modules_output_dir` - `:components_output_dir` These arguments remain optional, and in their absence, the codegen will generate output that should work for the FBReactNativeSpec core native modules use case. Internally, the script has been updated to use the correct path for the core modules use case as well as third party modules. Changelog: [Internal] - Extend the codegen script to take additional parameters Reviewed By: RSNara Differential Revision: D29243707 fbshipit-source-id: 1921bd3e5fd62d7cbf4c8b5089acfdd112f4b014
211 lines
9.4 KiB
Ruby
211 lines
9.4 KiB
Ruby
# Copyright (c) Facebook, Inc. and its affiliates.
|
|
#
|
|
# This source code is licensed under the MIT license found in the
|
|
# LICENSE file in the root directory of this source tree.
|
|
|
|
def use_react_native! (options={})
|
|
# The prefix to react-native
|
|
prefix = options[:path] ||= "../node_modules/react-native"
|
|
|
|
# Include Fabric dependencies
|
|
fabric_enabled = options[:fabric_enabled] ||= false
|
|
|
|
# Include DevSupport dependency
|
|
production = options[:production] ||= false
|
|
|
|
# Include Hermes dependencies
|
|
hermes_enabled = options[:hermes_enabled] ||= false
|
|
|
|
# The Pods which should be included in all projects
|
|
pod 'FBLazyVector', :path => "#{prefix}/Libraries/FBLazyVector"
|
|
pod 'FBReactNativeSpec', :path => "#{prefix}/React/FBReactNativeSpec"
|
|
pod 'RCTRequired', :path => "#{prefix}/Libraries/RCTRequired"
|
|
pod 'RCTTypeSafety', :path => "#{prefix}/Libraries/TypeSafety"
|
|
pod 'React', :path => "#{prefix}/"
|
|
pod 'React-Core', :path => "#{prefix}/"
|
|
pod 'React-CoreModules', :path => "#{prefix}/React/CoreModules"
|
|
pod 'React-RCTActionSheet', :path => "#{prefix}/Libraries/ActionSheetIOS"
|
|
pod 'React-RCTAnimation', :path => "#{prefix}/Libraries/NativeAnimation"
|
|
pod 'React-RCTBlob', :path => "#{prefix}/Libraries/Blob"
|
|
pod 'React-RCTImage', :path => "#{prefix}/Libraries/Image"
|
|
pod 'React-RCTLinking', :path => "#{prefix}/Libraries/LinkingIOS"
|
|
pod 'React-RCTNetwork', :path => "#{prefix}/Libraries/Network"
|
|
pod 'React-RCTSettings', :path => "#{prefix}/Libraries/Settings"
|
|
pod 'React-RCTText', :path => "#{prefix}/Libraries/Text"
|
|
pod 'React-RCTVibration', :path => "#{prefix}/Libraries/Vibration"
|
|
pod 'React-Core/RCTWebSocket', :path => "#{prefix}/"
|
|
|
|
unless production
|
|
pod 'React-Core/DevSupport', :path => "#{prefix}/"
|
|
end
|
|
|
|
pod 'React-cxxreact', :path => "#{prefix}/ReactCommon/cxxreact"
|
|
pod 'React-jsi', :path => "#{prefix}/ReactCommon/jsi"
|
|
pod 'React-jsiexecutor', :path => "#{prefix}/ReactCommon/jsiexecutor"
|
|
pod 'React-jsinspector', :path => "#{prefix}/ReactCommon/jsinspector"
|
|
pod 'React-callinvoker', :path => "#{prefix}/ReactCommon/callinvoker"
|
|
pod 'React-runtimeexecutor', :path => "#{prefix}/ReactCommon/runtimeexecutor"
|
|
pod 'React-perflogger', :path => "#{prefix}/ReactCommon/reactperflogger"
|
|
pod 'ReactCommon/turbomodule/core', :path => "#{prefix}/ReactCommon"
|
|
pod 'Yoga', :path => "#{prefix}/ReactCommon/yoga", :modular_headers => true
|
|
|
|
pod 'DoubleConversion', :podspec => "#{prefix}/third-party-podspecs/DoubleConversion.podspec"
|
|
pod 'glog', :podspec => "#{prefix}/third-party-podspecs/glog.podspec"
|
|
pod 'RCT-Folly', :podspec => "#{prefix}/third-party-podspecs/RCT-Folly.podspec"
|
|
|
|
if fabric_enabled
|
|
pod 'React-Fabric', :path => "#{prefix}/ReactCommon"
|
|
pod 'React-graphics', :path => "#{prefix}/ReactCommon/react/renderer/graphics"
|
|
pod 'React-jsi/Fabric', :path => "#{prefix}/ReactCommon/jsi"
|
|
pod 'React-RCTFabric', :path => "#{prefix}/React"
|
|
pod 'RCT-Folly/Fabric', :podspec => "#{prefix}/third-party-podspecs/RCT-Folly.podspec"
|
|
end
|
|
|
|
if hermes_enabled
|
|
pod 'React-hermes', :path => "#{prefix}/ReactCommon/hermes"
|
|
pod 'hermes-engine'
|
|
pod 'libevent', '~> 2.1.12'
|
|
end
|
|
end
|
|
|
|
def use_flipper!(versions = {}, configurations: ['Debug'])
|
|
versions['Flipper'] ||= '0.93.0'
|
|
versions['Flipper-Boost-iOSX'] ||= '1.76.0.1.11'
|
|
versions['Flipper-DoubleConversion'] ||= '3.1.7'
|
|
versions['Flipper-Fmt'] ||= '7.1.7'
|
|
versions['Flipper-Folly'] ||= '2.6.7'
|
|
versions['Flipper-Glog'] ||= '0.3.6'
|
|
versions['Flipper-PeerTalk'] ||= '0.0.4'
|
|
versions['Flipper-RSocket'] ||= '1.4.3'
|
|
pod 'FlipperKit', versions['Flipper'], :configurations => configurations
|
|
pod 'FlipperKit/FlipperKitLayoutPlugin', versions['Flipper'], :configurations => configurations
|
|
pod 'FlipperKit/SKIOSNetworkPlugin', versions['Flipper'], :configurations => configurations
|
|
pod 'FlipperKit/FlipperKitUserDefaultsPlugin', versions['Flipper'], :configurations => configurations
|
|
pod 'FlipperKit/FlipperKitReactPlugin', versions['Flipper'], :configurations => configurations
|
|
# List all transitive dependencies for FlipperKit pods
|
|
# to avoid them being linked in Release builds
|
|
pod 'Flipper', versions['Flipper'], :configurations => configurations
|
|
pod 'Flipper-Boost-iOSX', versions['Flipper-Boost-iOSX'], :configurations => configurations
|
|
pod 'Flipper-DoubleConversion', versions['Flipper-DoubleConversion'], :configurations => configurations
|
|
pod 'Flipper-Fmt', versions['Flipper-Fmt'], :configurations => configurations
|
|
pod 'Flipper-Folly', versions['Flipper-Folly'], :configurations => configurations
|
|
pod 'Flipper-Glog', versions['Flipper-Glog'], :configurations => configurations
|
|
pod 'Flipper-PeerTalk', versions['Flipper-PeerTalk'], :configurations => configurations
|
|
pod 'Flipper-RSocket', versions['Flipper-RSocket'], :configurations => configurations
|
|
pod 'FlipperKit/Core', versions['Flipper'], :configurations => configurations
|
|
pod 'FlipperKit/CppBridge', versions['Flipper'], :configurations => configurations
|
|
pod 'FlipperKit/FBCxxFollyDynamicConvert', versions['Flipper'], :configurations => configurations
|
|
pod 'FlipperKit/FBDefines', versions['Flipper'], :configurations => configurations
|
|
pod 'FlipperKit/FKPortForwarding', versions['Flipper'], :configurations => configurations
|
|
pod 'FlipperKit/FlipperKitHighlightOverlay', versions['Flipper'], :configurations => configurations
|
|
pod 'FlipperKit/FlipperKitLayoutTextSearchable', versions['Flipper'], :configurations => configurations
|
|
pod 'FlipperKit/FlipperKitNetworkPlugin', versions['Flipper'], :configurations => configurations
|
|
end
|
|
|
|
def has_pod(installer, name)
|
|
installer.pods_project.pod_group(name) != nil
|
|
end
|
|
|
|
# Post Install processing for Flipper
|
|
def flipper_post_install(installer)
|
|
installer.pods_project.targets.each do |target|
|
|
if target.name == 'YogaKit'
|
|
target.build_configurations.each do |config|
|
|
config.build_settings['SWIFT_VERSION'] = '4.1'
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def exclude_architectures(installer)
|
|
projects = installer.aggregate_targets
|
|
.map{ |t| t.user_project }
|
|
.uniq{ |p| p.path }
|
|
.push(installer.pods_project)
|
|
|
|
arm_value = `/usr/sbin/sysctl -n hw.optional.arm64 2>&1`.to_i
|
|
|
|
# Hermes does not support `i386` architecture
|
|
excluded_archs_default = has_pod(installer, 'hermes-engine') ? "i386" : ""
|
|
|
|
projects.each do |project|
|
|
project.build_configurations.each do |config|
|
|
if arm_value == 1 then
|
|
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = excluded_archs_default
|
|
else
|
|
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64 " + excluded_archs_default
|
|
end
|
|
end
|
|
|
|
project.save()
|
|
end
|
|
end
|
|
|
|
def react_native_post_install(installer)
|
|
if has_pod(installer, 'Flipper')
|
|
flipper_post_install(installer)
|
|
end
|
|
|
|
exclude_architectures(installer)
|
|
end
|
|
|
|
def use_react_native_codegen!(spec, options={})
|
|
return if ENV['DISABLE_CODEGEN'] == '1'
|
|
|
|
# The prefix to react-native
|
|
prefix = options[:react_native_path] ||= "../.."
|
|
|
|
# The path to JavaScript files
|
|
js_srcs = options[:js_srcs_dir] ||= "#{prefix}/Libraries"
|
|
|
|
# Library name (e.g. FBReactNativeSpec)
|
|
modules_library_name = options[:library_name] ||= spec.name
|
|
|
|
# Output dir, relative to podspec that invoked this method
|
|
modules_output_dir = options[:modules_output_dir] ||= "#{prefix}/React/#{modules_library_name}/#{modules_library_name}"
|
|
|
|
generated_dirs = [ modules_output_dir ]
|
|
generated_filenames = [ "#{modules_library_name}.h", "#{modules_library_name}-generated.mm" ]
|
|
generated_files = generated_filenames.map { |filename| "#{modules_output_dir}/#{filename}" }
|
|
|
|
# Run the codegen as part of the Xcode build pipeline.
|
|
env_vars = "SRCS_DIR='${PODS_TARGET_SRCROOT}/#{js_srcs}'"
|
|
env_vars += " MODULES_OUTPUT_DIR='${PODS_TARGET_SRCROOT}/#{modules_output_dir}'"
|
|
env_vars += " MODULES_LIBRARY_NAME='#{modules_library_name}'"
|
|
|
|
if ENV['USE_FABRIC'] == '1'
|
|
# We use a different library name for components, as well as an additional set of files.
|
|
# Eventually, we want these to be part of the same library as #{modules_library_name} above.
|
|
components_output_dir = options[:components_output_dir] ||= "#{prefix}/ReactCommon/react/renderer/components/rncore/"
|
|
generated_dirs.push components_output_dir
|
|
env_vars += " COMPONENTS_OUTPUT_DIR='${PODS_TARGET_SRCROOT}/#{components_output_dir}'"
|
|
components_generated_filenames = [
|
|
"ComponentDescriptors.h",
|
|
"EventEmitters.cpp",
|
|
"EventEmitters.h",
|
|
"Props.cpp",
|
|
"Props.h",
|
|
"RCTComponentViewHelpers.h",
|
|
"ShadowNodes.cpp",
|
|
"ShadowNodes.h"
|
|
]
|
|
generated_files = generated_files.concat(components_generated_filenames.map { |filename| "#{components_output_dir}/#{filename}" })
|
|
end
|
|
|
|
# Prepare filesystem by creating empty files that will be picked up as references by CocoaPods.
|
|
spec.prepare_command = "mkdir -p #{generated_dirs.join(" ")} && touch #{generated_files.join(" ")}"
|
|
|
|
spec.script_phase = {
|
|
:name => 'Generate Specs',
|
|
:input_files => [ "${PODS_TARGET_SRCROOT}/#{js_srcs}" ], # This also needs to be relative to Xcode
|
|
:output_files => ["${DERIVED_FILE_DIR}/codegen-#{modules_library_name}.log"].concat(generated_files.map { |filename| " ${PODS_TARGET_SRCROOT}/#{filename}"} ),
|
|
# The final generated files will be created when this script is invoked at Xcode build time.
|
|
:script => %{set -o pipefail
|
|
|
|
bash -l -c '#{env_vars} $\{PODS_TARGET_SRCROOT\}/#{prefix}/scripts/generate-specs.sh' 2>&1 | tee "${SCRIPT_OUTPUT_FILE_0}"
|
|
},
|
|
:execution_position => :before_compile,
|
|
:show_env_vars_in_log => true
|
|
}
|
|
end
|