From 4da6e4a04287755ba0c2c6ea7ea7ee2fe7601065 Mon Sep 17 00:00:00 2001 From: Kevin Gozali Date: Mon, 15 Apr 2019 12:07:04 -0700 Subject: [PATCH] TM iOS: Install SampleTurboModule in RNTester (pods) Summary: This sets up RCTSampleTurboModule (and other variants) in RNTester when built with cocoapods. There's no call site yet though. And RNTester.xcodeproj doesn't support it. Reviewed By: cpojer Differential Revision: D14932535 fbshipit-source-id: db8eafd6777cbec8f3592dafdccbdd7cf44e38bc --- RNTester/Podfile | 1 + RNTester/Podfile.lock | 21 +++++++- RNTester/RNTester/AppDelegate.mm | 13 +++-- .../RNTester/RNTesterTurboModuleProvider.h | 31 ++++++++++++ .../RNTester/RNTesterTurboModuleProvider.mm | 42 ++++++++++++++++ .../RNTesterPods.xcodeproj/project.pbxproj | 6 +++ .../core/React-turbomodule-core.podspec | 2 +- .../samples/React-turbomodule-samples.podspec | 49 +++++++++++++++++++ 8 files changed, 157 insertions(+), 8 deletions(-) create mode 100644 RNTester/RNTester/RNTesterTurboModuleProvider.h create mode 100644 RNTester/RNTester/RNTesterTurboModuleProvider.mm create mode 100644 ReactCommon/turbomodule/samples/React-turbomodule-samples.podspec diff --git a/RNTester/Podfile b/RNTester/Podfile index 523f5cf080..edeb8fa3d0 100644 --- a/RNTester/Podfile +++ b/RNTester/Podfile @@ -38,6 +38,7 @@ target 'RNTester' do pod 'yoga', :path => '../ReactCommon/yoga' pod 'React-turbomodule-core', :path => '../ReactCommon/turbomodule/core' + pod 'React-turbomodule-samples', :path => '../ReactCommon/turbomodule/samples' # Third party deps podspec link pod 'DoubleConversion', :podspec => '../third-party-podspecs/DoubleConversion.podspec' diff --git a/RNTester/Podfile.lock b/RNTester/Podfile.lock index 4cdb53823a..6aa8560f01 100644 --- a/RNTester/Podfile.lock +++ b/RNTester/Podfile.lock @@ -99,6 +99,19 @@ PODS: - React-Core (= 1000.0.0) - React-cxxreact (= 1000.0.0) - React-jsi (= 1000.0.0) + - React-turbomodule-samples (1000.0.0): + - Folly (= 2018.10.22.00) + - React-Core (= 1000.0.0) + - React-cxxreact (= 1000.0.0) + - React-jsi (= 1000.0.0) + - React-turbomodule-core (= 1000.0.0) + - React-turbomodule-samples/samples-ios (= 1000.0.0) + - React-turbomodule-samples/samples-ios (1000.0.0): + - Folly (= 2018.10.22.00) + - React-Core (= 1000.0.0) + - React-cxxreact (= 1000.0.0) + - React-jsi (= 1000.0.0) + - React-turbomodule-core (= 1000.0.0) - yoga (1000.0.0.React) DEPENDENCIES: @@ -127,6 +140,7 @@ DEPENDENCIES: - React-RCTVibration (from `../Libraries/Vibration`) - React-RCTWebSocket (from `../Libraries/WebSocket`) - React-turbomodule-core (from `../ReactCommon/turbomodule/core`) + - React-turbomodule-samples (from `../ReactCommon/turbomodule/samples`) - yoga (from `../ReactCommon/yoga`) SPEC REPOS: @@ -184,6 +198,8 @@ EXTERNAL SOURCES: :path: "../Libraries/WebSocket" React-turbomodule-core: :path: "../ReactCommon/turbomodule/core" + React-turbomodule-samples: + :path: "../ReactCommon/turbomodule/samples" yoga: :path: "../ReactCommon/yoga" @@ -213,9 +229,10 @@ SPEC CHECKSUMS: React-RCTText: 469ec754592c92fc639825e558908c2f0e783e2c React-RCTVibration: ade3c169b54f3bc16c9a9918e17e48ef66aee6ba React-RCTWebSocket: 90b78ed51d53d17db417d3956decba3f7ace58e4 - React-turbomodule-core: d4c0c7d6a7d97e25ac6d0316c2a7950d199b398e + React-turbomodule-core: 67a461c91319c0bf2228dc46c7dafbbb921eebee + React-turbomodule-samples: b28927d482d6fcfc3cbe2fd25f304799d2ff9bb7 yoga: 542cb34fe3bca476487e08eb516dd640ea996a65 -PODFILE CHECKSUM: e587e581dcf974f8a9b7b1ff624f5114082b8045 +PODFILE CHECKSUM: f7d0a09c9ea25315395b7248591d4a372b87cf3f COCOAPODS: 1.6.1 diff --git a/RNTester/RNTester/AppDelegate.mm b/RNTester/RNTester/AppDelegate.mm index 028980b619..94c5933ef4 100644 --- a/RNTester/RNTester/AppDelegate.mm +++ b/RNTester/RNTester/AppDelegate.mm @@ -28,7 +28,9 @@ #endif #ifdef RN_TURBO_MODULE_ENABLED -#import +#import + +#import "RNTesterTurboModuleProvider.h" #endif #ifdef RN_TURBO_MODULE_ENABLED @@ -150,22 +152,23 @@ #ifdef RN_TURBO_MODULE_ENABLED - - (std::shared_ptr)getTurboModule:(const std::string &)name +- (std::shared_ptr)getTurboModule:(const std::string &)name jsInvoker:(std::shared_ptr)jsInvoker { - return nullptr; + return RNTesterTurboModuleProvider(name, jsInvoker); } - (std::shared_ptr)getTurboModule:(const std::string &)name instance:(id)instance jsInvoker:(std::shared_ptr)jsInvoker { - return nullptr; + return RNTesterTurboModuleProvider(name, instance, jsInvoker); } - (id)getModuleInstanceFromClass:(Class)moduleClass { - return nil; + // No custom initializer here. + return [moduleClass new]; } #endif diff --git a/RNTester/RNTester/RNTesterTurboModuleProvider.h b/RNTester/RNTester/RNTesterTurboModuleProvider.h new file mode 100644 index 0000000000..d55c415bc6 --- /dev/null +++ b/RNTester/RNTester/RNTesterTurboModuleProvider.h @@ -0,0 +1,31 @@ +/** + * 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. + * + */ + +#ifdef RN_TURBO_MODULE_ENABLED + +#import + +namespace facebook { +namespace react { + +/** + * Provide a pure C++ instance of a TurboModule, specific to this app. + */ +std::shared_ptr RNTesterTurboModuleProvider(const std::string &name, std::shared_ptr jsInvoker); + +/** + * Provide an instance of a ObjCTurboModule, given the ObjC instance, specific to this app. + */ +std::shared_ptr RNTesterTurboModuleProvider(const std::string &name, + id instance, + std::shared_ptr jsInvoker); + +} // namespace react +} // namespace facebook + +#endif diff --git a/RNTester/RNTester/RNTesterTurboModuleProvider.mm b/RNTester/RNTester/RNTesterTurboModuleProvider.mm new file mode 100644 index 0000000000..b93d94878f --- /dev/null +++ b/RNTester/RNTester/RNTesterTurboModuleProvider.mm @@ -0,0 +1,42 @@ +/** + * 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. + * + */ + +#ifdef RN_TURBO_MODULE_ENABLED + +#import "RNTesterTurboModuleProvider.h" + +#import +#import + +// NOTE: This entire file should be codegen'ed. + +namespace facebook { +namespace react { + +std::shared_ptr RNTesterTurboModuleProvider(const std::string &name, std::shared_ptr jsInvoker) { + if (name == "SampleTurboCxxModule") { + return std::make_shared(jsInvoker); + } + + return nullptr; +} + +std::shared_ptr RNTesterTurboModuleProvider(const std::string &name, + id instance, + std::shared_ptr jsInvoker) { + if (name == "SampleTurboModule") { + return std::make_shared(instance, jsInvoker); + } + + return nullptr; +} + +} // namespace react +} // namespace facebook + +#endif diff --git a/RNTester/RNTesterPods.xcodeproj/project.pbxproj b/RNTester/RNTesterPods.xcodeproj/project.pbxproj index e6883e538b..917ee51354 100644 --- a/RNTester/RNTesterPods.xcodeproj/project.pbxproj +++ b/RNTester/RNTesterPods.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 3D2AFAF51D646CF80089D1A3 /* legacy_image@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3D2AFAF41D646CF80089D1A3 /* legacy_image@2x.png */; }; 3D56F9F11D6F6E9B00F53A06 /* RNTesterBundle.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 3D13F83E1D6F6AE000E69E0E /* RNTesterBundle.bundle */; }; 5C60EB1C226440DB0018C04F /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C60EB1B226440DB0018C04F /* AppDelegate.mm */; }; + 5CB07C9B226467E60039471C /* RNTesterTurboModuleProvider.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5CB07C99226467E60039471C /* RNTesterTurboModuleProvider.mm */; }; 68D134442238528800D0B233 /* Swizzle_RCTFabricSurface.m in Sources */ = {isa = PBXBuildFile; fileRef = 68D134432238528800D0B233 /* Swizzle_RCTFabricSurface.m */; }; 68E1E4BC2230DF2F00570185 /* ComponentRegistry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 68E1E4BB2230DF2F00570185 /* ComponentRegistry.cpp */; }; B9C5BB1881F54450DBCA70F5 /* libPods-RNTester.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8508AD3C1DC3509924E63948 /* libPods-RNTester.a */; }; @@ -50,6 +51,8 @@ 3D2AFAF41D646CF80089D1A3 /* legacy_image@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "legacy_image@2x.png"; path = "RNTester/legacy_image@2x.png"; sourceTree = ""; }; 5BEC8567F3741044B6A5EFC5 /* Pods-RNTester.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTester.release.xcconfig"; path = "Pods/Target Support Files/Pods-RNTester/Pods-RNTester.release.xcconfig"; sourceTree = ""; }; 5C60EB1B226440DB0018C04F /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = RNTester/AppDelegate.mm; sourceTree = ""; }; + 5CB07C99226467E60039471C /* RNTesterTurboModuleProvider.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RNTesterTurboModuleProvider.mm; path = RNTester/RNTesterTurboModuleProvider.mm; sourceTree = ""; }; + 5CB07C9A226467E60039471C /* RNTesterTurboModuleProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNTesterTurboModuleProvider.h; path = RNTester/RNTesterTurboModuleProvider.h; sourceTree = ""; }; 68D134432238528800D0B233 /* Swizzle_RCTFabricSurface.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Swizzle_RCTFabricSurface.m; sourceTree = ""; }; 68E1E4BB2230DF2F00570185 /* ComponentRegistry.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ComponentRegistry.cpp; sourceTree = ""; }; 8508AD3C1DC3509924E63948 /* libPods-RNTester.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTester.a"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -89,6 +92,8 @@ children = ( 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 5C60EB1B226440DB0018C04F /* AppDelegate.mm */, + 5CB07C9A226467E60039471C /* RNTesterTurboModuleProvider.h */, + 5CB07C99226467E60039471C /* RNTesterTurboModuleProvider.mm */, 13B07FB71A68108700A75B9A /* main.m */, 2DDEF00F1F84BF7B00DBDF73 /* Images.xcassets */, 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, @@ -329,6 +334,7 @@ 68E1E4BC2230DF2F00570185 /* ComponentRegistry.cpp in Sources */, 272E6B3F1BEA849E001FCF37 /* UpdatePropertiesExampleView.m in Sources */, 68D134442238528800D0B233 /* Swizzle_RCTFabricSurface.m in Sources */, + 5CB07C9B226467E60039471C /* RNTesterTurboModuleProvider.mm in Sources */, 27F441EC1BEBE5030039B79C /* FlexibleSizeExampleView.m in Sources */, 5C60EB1C226440DB0018C04F /* AppDelegate.mm in Sources */, 13B07FC11A68108700A75B9A /* main.m in Sources */, diff --git a/ReactCommon/turbomodule/core/React-turbomodule-core.podspec b/ReactCommon/turbomodule/core/React-turbomodule-core.podspec index af56286a96..f2534f4e53 100644 --- a/ReactCommon/turbomodule/core/React-turbomodule-core.podspec +++ b/ReactCommon/turbomodule/core/React-turbomodule-core.podspec @@ -43,6 +43,6 @@ Pod::Spec.new do |s| s.subspec "core-ios" do |ss| ss.source_files = "platform/ios/*.{mm,cpp,h}" - ss.header_dir = "React" + ss.header_dir = "jsireact" end end diff --git a/ReactCommon/turbomodule/samples/React-turbomodule-samples.podspec b/ReactCommon/turbomodule/samples/React-turbomodule-samples.podspec new file mode 100644 index 0000000000..e7cde973e4 --- /dev/null +++ b/ReactCommon/turbomodule/samples/React-turbomodule-samples.podspec @@ -0,0 +1,49 @@ +# coding: utf-8 +# 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. + +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "package.json"))) +version = package['version'] + +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip +else + source[:tag] = "v#{version}" +end + +folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32' +folly_version = '2018.10.22.00' +boost_compiler_flags = '-Wno-documentation' + +Pod::Spec.new do |s| + s.name = "React-turbomodule-samples" + s.version = version + s.summary = "-" # TODO + s.homepage = "http://facebook.github.io/react-native/" + s.license = package["license"] + s.author = "Facebook, Inc. and its affiliates" + s.platforms = { :ios => "9.0", :tvos => "9.2" } + s.source = source + s.source_files = "*.{cpp,h}" + s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags + s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost-for-react-native\" \"$(PODS_ROOT)/Folly\"" } + s.header_dir = "jsireact" + s.xcconfig = { "OTHER_CFLAGS" => "$(inherited) -DRN_TURBO_MODULE_ENABLED" } + + s.dependency "React-Core", version + s.dependency "React-cxxreact", version + s.dependency "React-jsi", version + s.dependency "React-turbomodule-core", version + s.dependency "Folly", folly_version + + s.subspec "samples-ios" do |ss| + ss.source_files = "platform/ios/*.{mm,cpp,h}" + ss.header_dir = "jsireact" + end +end