diff --git a/RNTester/Podfile b/RNTester/Podfile index d402ce4ab53374..e38c697fc32900 100644 --- a/RNTester/Podfile +++ b/RNTester/Podfile @@ -47,11 +47,10 @@ if ENV['USE_FRAMEWORKS'] == '1' use_frameworks! end -def pods() +def pods(options = {}) project 'RNTesterPods.xcodeproj' - # Enable TurboModule - use_react_native!(path: "..") + use_react_native!(options.merge(path: "..")) pod 'ReactCommon/turbomodule/samples', :path => '../ReactCommon' # Additional Pods which aren't included in the default Podfile @@ -118,7 +117,7 @@ end target 'RNTester-macOS' do platform :osx, '10.14' - pods() + pods(:hermes_enabled => true) end target 'RNTesterUnitTests' do diff --git a/RNTester/Podfile.lock b/RNTester/Podfile.lock index c4f0cbd821d554..b5b0d345f1e68e 100644 --- a/RNTester/Podfile.lock +++ b/RNTester/Podfile.lock @@ -66,7 +66,18 @@ PODS: - boost-for-react-native - DoubleConversion - glog + - Folly/Futures (2018.10.22.00): + - boost-for-react-native + - DoubleConversion + - glog + - libevent - glog (0.3.5) + - hermes (0.4.1) + - libevent (2.1.11): + - libevent/core (= 2.1.11) + - libevent/core (2.1.11): + - libevent/event2-headers + - libevent/event2-headers (2.1.11) - OpenSSL-Universal (1.0.2.19): - OpenSSL-Universal/Static (= 1.0.2.19) - OpenSSL-Universal/Static (1.0.2.19) @@ -132,6 +143,15 @@ PODS: - React-jsiexecutor (= 1000.0.0) - React-jsinspector (= 1000.0.0) - Yoga + - React-Core/Hermes (1000.0.0): + - Folly (= 2018.10.22.00) + - Folly/Futures + - glog + - hermes (~> 0.4.1) + - React-cxxreact (= 1000.0.0) + - React-jsi (= 1000.0.0) + - React-jsiexecutor (= 1000.0.0) + - Yoga - React-Core/RCTActionSheetHeaders (1000.0.0): - Folly (= 2018.10.22.00) - glog @@ -343,12 +363,15 @@ DEPENDENCIES: - FlipperKit/SKIOSNetworkPlugin (~> 0.30.1) - Folly (from `../third-party-podspecs/Folly.podspec`) - glog (from `../third-party-podspecs/glog.podspec`) + - "hermes (from `{:http=>\"https://github.com/alloy/hermes/releases/download/v0.4.1-macOS/hermes-v0.4.1.zip\", :sha256=>\"d33c7eafded94d8113a3bb74f56aef3ec1cd3df513e99df7fa3c7c34b867d379\"}`)" + - libevent (from `../third-party-podspecs/libevent.podspec`) - RCTRequired (from `../Libraries/RCTRequired`) - RCTTypeSafety (from `../Libraries/TypeSafety`) - React (from `../`) - React-ART (from `../Libraries/ART`) - React-Core (from `../`) - React-Core/DevSupport (from `../`) + - React-Core/Hermes (from `../`) - React-Core/RCTWebSocket (from `../`) - React-CoreModules (from `../React/CoreModules`) - React-cxxreact (from `../ReactCommon/cxxreact`) @@ -372,7 +395,7 @@ DEPENDENCIES: - Yoga (from `../ReactCommon/yoga`) SPEC REPOS: - trunk: + https://cdn.cocoapods.org/: - CocoaAsyncSocket - CocoaLibEvent - Flipper @@ -398,6 +421,11 @@ EXTERNAL SOURCES: :podspec: "../third-party-podspecs/Folly.podspec" glog: :podspec: "../third-party-podspecs/glog.podspec" + hermes: + :http: https://github.com/alloy/hermes/releases/download/v0.4.1-macOS/hermes-v0.4.1.zip + :sha256: d33c7eafded94d8113a3bb74f56aef3ec1cd3df513e99df7fa3c7c34b867d379 + libevent: + :podspec: "../third-party-podspecs/libevent.podspec" RCTRequired: :path: "../Libraries/RCTRequired" RCTTypeSafety: @@ -445,6 +473,11 @@ EXTERNAL SOURCES: Yoga: :path: "../ReactCommon/yoga" +CHECKOUT OPTIONS: + hermes: + :http: https://github.com/alloy/hermes/releases/download/v0.4.1-macOS/hermes-v0.4.1.zip + :sha256: d33c7eafded94d8113a3bb74f56aef3ec1cd3df513e99df7fa3c7c34b867d379 + SPEC CHECKSUMS: boost-for-react-native: a110407d9db2642fd2e1bcd7c5a51c81f2521dc9 CocoaAsyncSocket: eafaa68a7e0ec99ead0a7b35015e0bf25d2c8987 @@ -459,14 +492,16 @@ SPEC CHECKSUMS: Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 Flipper-RSocket: 64e7431a55835eb953b0bf984ef3b90ae9fdddd7 FlipperKit: 88b7f0d0cf907ddc2137b85eeb7f3d4d8d9395c8 - Folly: feff29ba9d0b7c2e4f793a94942831d6cc5bbad7 + Folly: ae1e11fb7b57cac65fa994a5c9da9b6f652d934b glog: b3f6d74f3e2d33396addc0ee724d2b2b79fc3e00 + hermes: ea5308401c53c1352fcb566548f2a45605c36f15 + libevent: c2d56c8554ac18101d9c5f4c66ef762798209682 OpenSSL-Universal: 8b48cc0d10c1b2923617dfe5c178aa9ed2689355 RCTRequired: 66250bf27479214eb5c530ca2d8c772ebe4d7e71 RCTTypeSafety: 2bf56caee198adc4adc63a5d18e8ffff8b92fbbb React: bacecd5320c8bb453aa396179b93061ebd9d34bf React-ART: 2f0eb928d7bc51e6262da595955b0e8fcf6c0a9e - React-Core: 8a9c0454b0540cfcca1261e8e084a324976bb6c2 + React-Core: 0fb3a932eb28dcb299eceb7fb4e359b547557528 React-CoreModules: fbe1e42d49cb14db5c9bf02dee33a18d281331f7 React-cxxreact: 7ff40ab26e02c3f8b2fec2f5ea3d9f4774ef2523 React-jsi: b23bf7e79fb2149f3bb9bd4e25e570bff9c03d10 @@ -487,6 +522,6 @@ SPEC CHECKSUMS: Yoga: 3ed3c35bb7c41fa8f5056b767bc048539f6526ad YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: 524ab13b924fd82bc5c4393c133fcd02eb70efa4 +PODFILE CHECKSUM: 9f7ce884d267d41098ed0c95a51abea8c184a0ea COCOAPODS: 1.9.1 diff --git a/RNTester/RNTesterPods.xcodeproj/project.pbxproj b/RNTester/RNTesterPods.xcodeproj/project.pbxproj index 232ec1a5d64c32..8e81c081cfa374 100644 --- a/RNTester/RNTesterPods.xcodeproj/project.pbxproj +++ b/RNTester/RNTesterPods.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 51; objects = { /* Begin PBXBuildFile section */ @@ -731,6 +731,7 @@ 9F153459233AB2C4006DFE44 /* Resources */, 38C8132424577FB500BFFA62 /* Build JS Bundle */, 51B9D81723C4D5A4002B30E1 /* Start Metro */, + 4733C3A4FBA299F6E1E956BA /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -1021,7 +1022,24 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "export NODE_BINARY=node\nPROJECT_ROOT=$SRCROOT/.. $SRCROOT/../scripts/react-native-xcode.sh RNTester/js/RNTesterApp.macos.js\n"; + shellScript = "export NODE_BINARY=node\nexport PROJECT_ROOT=$SRCROOT/..\nexport SOURCEMAP_FILE=sourcemap.macOS.map\n# export FORCE_BUNDLING=true\n$SRCROOT/../scripts/react-native-xcode.sh RNTester/js/RNTesterApp.macos.js\n"; + }; + 4733C3A4FBA299F6E1E956BA /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RNTester-macOS/Pods-RNTester-macOS-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RNTester-macOS/Pods-RNTester-macOS-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNTester-macOS/Pods-RNTester-macOS-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; 51B9D81723C4D5A4002B30E1 /* Start Metro */ = { isa = PBXShellScriptBuildPhase; @@ -1814,6 +1832,7 @@ CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = "RNTester-macOS/RNTester_macOS.entitlements"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEBUG_INFORMATION_FORMAT = dwarf; @@ -1868,6 +1887,7 @@ CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = "RNTester-macOS/RNTester_macOS.entitlements"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; diff --git a/React-Core.podspec b/React-Core.podspec index 762f947ab60c76..7ee369e65e1fd8 100644 --- a/React-Core.podspec +++ b/React-Core.podspec @@ -57,8 +57,9 @@ Pod::Spec.new do |s| ss.exclude_files = "React/CoreModules/**/*", "React/DevSupport/**/*", "React/Fabric/**/*", - "React/Inspector/**/*" - ss.ios.exclude_files = "React/**/RCTTV*.*", + "React/Inspector/**/*", + "React/CxxBridge/HermesExecutorFactory.*" # TODO(macOS GH#214) + ss.ios.exclude_files = "React/**/RCTTV*.*" # [TODO(macOS ISS#2323203) "**/MacOS/*" @@ -80,6 +81,19 @@ Pod::Spec.new do |s| ss.private_header_files = "React/Cxx*/*.h" end + # [TODO(macOS GH#214) + s.subspec "Hermes" do |ss| + ss.platforms = { :osx => "10.14" } + ss.source_files = "ReactCommon/hermes/executor/*.{cpp,h}", + "ReactCommon/hermes/inspector/*.{cpp,h}", + "ReactCommon/hermes/inspector/chrome/*.{cpp,h}", + "ReactCommon/hermes/inspector/detail/*.{cpp,h}" + ss.pod_target_xcconfig = { "GCC_PREPROCESSOR_DEFINITIONS" => "HERMES_ENABLE_DEBUGGER=1" } + ss.dependency "Folly/Futures" + ss.dependency "hermes", "~> 0.4.1" + end + # ]TODO(macOS GH#214) + s.subspec "DevSupport" do |ss| ss.source_files = "React/DevSupport/*.{h,mm,m}", "React/Inspector/*.{h,mm,m}" diff --git a/React/CxxBridge/JSCExecutorFactory.mm b/React/CxxBridge/JSCExecutorFactory.mm index 12d96eb5c16480..61e87e99d01061 100644 --- a/React/CxxBridge/JSCExecutorFactory.mm +++ b/React/CxxBridge/JSCExecutorFactory.mm @@ -7,7 +7,6 @@ #include "JSCExecutorFactory.h" -#import #import #import @@ -18,23 +17,11 @@ std::unique_ptr JSCExecutorFactory::createJSExecutor( std::shared_ptr delegate, std::shared_ptr __unused jsQueue) { - auto installBindings = [runtimeInstaller=runtimeInstaller_](jsi::Runtime &runtime) { - react::Logger iosLoggingBinder = [](const std::string &message, unsigned int logLevel) { - _RCTLogJavaScriptInternal( - static_cast(logLevel), - [NSString stringWithUTF8String:message.c_str()]); - }; - react::bindNativeLogger(runtime, iosLoggingBinder); - // Wrap over the original runtimeInstaller - if (runtimeInstaller) { - runtimeInstaller(runtime); - } - }; return std::make_unique( facebook::jsc::makeJSCRuntime(), delegate, JSIExecutor::defaultTimeoutInvoker, - std::move(installBindings)); + runtimeInstaller_); } } // namespace react diff --git a/React/CxxBridge/RCTCxxBridge.mm b/React/CxxBridge/RCTCxxBridge.mm index f24da99d851387..d3f9d3035d1f90 100644 --- a/React/CxxBridge/RCTCxxBridge.mm +++ b/React/CxxBridge/RCTCxxBridge.mm @@ -37,7 +37,15 @@ #import #import +#if TARGET_OS_OSX && __has_include() +#define RCT_USE_HERMES 1 +#endif +#if RCT_USE_HERMES +#import "HermesExecutorFactory.h" +#else #import "JSCExecutorFactory.h" +#endif + #import "NSDataBigString.h" #import "RCTMessageThread.h" #import "RCTObjcExecutor.h" @@ -347,7 +355,21 @@ - (void)start executorFactory = [cxxDelegate jsExecutorFactoryForBridge:self]; } if (!executorFactory) { - executorFactory = std::make_shared(nullptr); + auto installBindings = + [](facebook::jsi::Runtime &runtime) { + facebook::react::Logger iosLoggingBinder = + [](const std::string &message, unsigned int logLevel) { + _RCTLogJavaScriptInternal( + static_cast(logLevel), + [NSString stringWithUTF8String:message.c_str()]); + }; + facebook::react::bindNativeLogger(runtime, iosLoggingBinder); + }; +#if RCT_USE_HERMES + executorFactory = std::make_shared(installBindings); +#else + executorFactory = std::make_shared(installBindings); +#endif } } else { id objcExecutor = [self moduleForClass:self.executorClass]; diff --git a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutorFactory.cpp b/ReactCommon/hermes/executor/HermesExecutorFactory.cpp similarity index 100% rename from ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutorFactory.cpp rename to ReactCommon/hermes/executor/HermesExecutorFactory.cpp diff --git a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutorFactory.h b/ReactCommon/hermes/executor/HermesExecutorFactory.h similarity index 100% rename from ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutorFactory.h rename to ReactCommon/hermes/executor/HermesExecutorFactory.h diff --git a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/JSITracing.cpp b/ReactCommon/hermes/executor/JSITracing.cpp similarity index 90% rename from ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/JSITracing.cpp rename to ReactCommon/hermes/executor/JSITracing.cpp index 763ed1ce69a68a..376c83eac76388 100644 --- a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/JSITracing.cpp +++ b/ReactCommon/hermes/executor/JSITracing.cpp @@ -10,7 +10,7 @@ namespace facebook { namespace jsi { void addNativeTracingHooks(Runtime &rt) { - assert(false && "unimplemented"); + // unimplemented } } // namespace jsi } // namespace facebook diff --git a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/JSITracing.h b/ReactCommon/hermes/executor/JSITracing.h similarity index 100% rename from ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/JSITracing.h rename to ReactCommon/hermes/executor/JSITracing.h diff --git a/ReactCommon/hermes/inspector/chrome/Connection.cpp b/ReactCommon/hermes/inspector/chrome/Connection.cpp index 1f8e109b6572b9..7c8402bfdeab68 100644 --- a/ReactCommon/hermes/inspector/chrome/Connection.cpp +++ b/ReactCommon/hermes/inspector/chrome/Connection.cpp @@ -187,8 +187,8 @@ bool Connection::Impl::disconnect() { inspector_->disable().via(executor_.get()).thenValue([this](auto &&) { // HACK: We purposely call RemoteConnection::onDisconnect on a *different* - // rather than on this thread (the executor thread). This is to prevent this - // scenario: + // thread, rather than on this thread (the executor thread). This is to + // prevent this scenario: // // 1. RemoteConnection::onDisconnect runs on the executor thread // 2. onDisconnect through a long chain of calls causes the Connection diff --git a/scripts/autolink-ios.rb b/scripts/autolink-ios.rb index b6dedae310ebfb..b5a564a01aa6a2 100644 --- a/scripts/autolink-ios.rb +++ b/scripts/autolink-ios.rb @@ -13,6 +13,8 @@ def use_react_native! (options={}) # Include DevSupport dependency production = options[:production] ||= false + 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}/Libraries/FBReactNativeSpec" @@ -58,6 +60,13 @@ def use_react_native! (options={}) pod 'React-RCTFabric', :path => "#{prefix}/React" pod 'Folly/Fabric', :podspec => "#{prefix}/third-party-podspecs/Folly.podspec" end + + if hermes_enabled + pod 'React-Core/Hermes', :path => "#{prefix}/" + pod 'hermes', :http => 'https://github.com/alloy/hermes/releases/download/v0.4.1-macOS/hermes-v0.4.1.zip', + :sha256 => 'd33c7eafded94d8113a3bb74f56aef3ec1cd3df513e99df7fa3c7c34b867d379' + pod 'libevent', :podspec => "#{prefix}/third-party-podspecs/libevent.podspec" + end end def add_flipper_pods!(versions = {}) @@ -101,4 +110,4 @@ def flipper_post_install(installer) end end end -end \ No newline at end of file +end diff --git a/scripts/react-native-xcode.sh b/scripts/react-native-xcode.sh index 8f57fff51f28a8..1d2e850e685219 100755 --- a/scripts/react-native-xcode.sh +++ b/scripts/react-native-xcode.sh @@ -108,13 +108,17 @@ source "$REACT_NATIVE_DIR/scripts/node-binary.sh" [ -z "$BUNDLE_COMMAND" ] && BUNDLE_COMMAND="bundle" +[ -z "$HERMES_PATH" ] && HERMES_PATH="$PODS_ROOT/hermes/destroot/bin/hermes" + +[ -z "$COMPOSE_SOURCEMAP_PATH" ] && COMPOSE_SOURCEMAP_PATH="$REACT_NATIVE_DIR/scripts/compose-source-maps.js" + if [[ -z "$BUNDLE_CONFIG" ]]; then CONFIG_ARG="" else CONFIG_ARG="--config $BUNDLE_CONFIG" fi -BUNDLE_FILE="$DEST/main.jsbundle" +BUNDLE_FILE="$CONFIGURATION_BUILD_DIR/main.jsbundle" case "$PLATFORM_NAME" in "macosx") @@ -125,11 +129,31 @@ case "$PLATFORM_NAME" in ;; esac +USE_HERMES= +if [[ "$BUNDLE_PLATFORM" == "macos" && -f "$HERMES_PATH" ]]; then + USE_HERMES=true +fi + EXTRA_ARGS= if [ -d "$PROJECT_ROOT/node_modules/react-native-macos" ]; then EXTRA_ARGS=--use-react-native-macos fi +EMIT_SOURCEMAP= +if [[ ! -z "$SOURCEMAP_FILE" ]]; then + EMIT_SOURCEMAP=true +fi + +PACKAGER_SOURCEMAP_FILE= +if [[ $EMIT_SOURCEMAP == true ]]; then + if [[ $USE_HERMES == true ]]; then + PACKAGER_SOURCEMAP_FILE="$CONFIGURATION_BUILD_DIR/$(basename $SOURCEMAP_FILE)" + else + PACKAGER_SOURCEMAP_FILE="$SOURCEMAP_FILE" + fi + EXTRA_ARGS="$EXTRA_ARGS --sourcemap-output $PACKAGER_SOURCEMAP_FILE" +fi + "$NODE_BINARY" $NODE_ARGS "$CLI_PATH" $BUNDLE_COMMAND \ $CONFIG_ARG \ --entry-file "$ENTRY_FILE" \ @@ -141,6 +165,27 @@ fi $EXTRA_ARGS \ $EXTRA_PACKAGER_ARGS +if [[ $USE_HERMES != true ]]; then + mv "$BUNDLE_FILE" "$DEST/" +else + EXTRA_COMPILER_ARGS= + if [[ $DEV == true ]]; then + EXTRA_COMPILER_ARGS=-Og + else + EXTRA_COMPILER_ARGS=-O + fi + if [[ $EMIT_SOURCEMAP == true ]]; then + EXTRA_COMPILER_ARGS="$EXTRA_COMPILER_ARGS -output-source-map" + fi + HBC_FILE="$CONFIGURATION_BUILD_DIR/$(basename $BUNDLE_FILE)" + "$HERMES_PATH" -emit-binary $EXTRA_COMPILER_ARGS -out "$HBC_FILE" "$BUNDLE_FILE" + mv "$HBC_FILE" "$DEST/" + if [[ $EMIT_SOURCEMAP == true ]]; then + HBC_SOURCEMAP_FILE="$HBC_FILE.map" + "$NODE_BINARY" "$COMPOSE_SOURCEMAP_PATH" "$PACKAGER_SOURCEMAP_FILE" "$HBC_SOURCEMAP_FILE" -o "$SOURCEMAP_FILE" + fi +fi + if [[ $DEV != true && ! -f "$BUNDLE_FILE" ]]; then echo "error: File $BUNDLE_FILE does not exist. This must be a bug with" >&2 echo "React Native, please report it here: https://github.com/facebook/react-native/issues" diff --git a/third-party-podspecs/Folly.podspec b/third-party-podspecs/Folly.podspec index b883cb8e67f22e..8753c8cf52a8af 100644 --- a/third-party-podspecs/Folly.podspec +++ b/third-party-podspecs/Folly.podspec @@ -70,6 +70,40 @@ Pod::Spec.new do |spec| 'folly/system/ThreadId.h' end + # [TODO(macOS GH#214) + spec.subspec 'Futures' do |futures| + futures.dependency 'libevent' + futures.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => ["$(inherited)", "$(PODS_ROOT)/Headers/Public/libevent/event"] } + futures.source_files = 'folly/futures/*.{h,cpp}', + 'folly/futures/detail/*.{h,cpp}', + 'folly/executors/*.{h,cpp}', + 'folly/executors/thread_factory/{NamedThreadFactory,ThreadFactory}.{h,cpp}', + 'folly/executors/task_queue/{BlockingQueue,LifoSemMPMCQueue,PriorityLifoSemMPMCQueue}.{h,cpp}', + 'folly/concurrency/*.{h,cpp}', + 'folly/system/{ThreadId,ThreadName}.{h,cpp}', + 'folly/synchronization/*.{h,cpp}', + 'folly/synchronization/detail/*.{h,cpp}', + 'folly/experimental/{ExecutionObserver,ReadMostlySharedPtr,TLRefCount}.{h,cpp}', + 'folly/io/async/{AsyncTimeout,DelayedDestruction,DelayedDestructionBase,EventBase,EventBaseManager,EventHandler,EventUtil,HHWheelTimer,NotificationQueue,Request,TimeoutManager,VirtualEventBase}.{h,cpp}', + 'folly/io/{Cursor,Cursor-inl,IOBuf,IOBufQueue}.{h,cpp}', + 'folly/tracing/StaticTracepoint.{h,cpp}', + 'folly/{Executor,ExceptionWrapper,ExceptionWrapper-inl,FileUtil,Singleton,SharedMutex}.{h,cpp}', + 'folly/detail/{AtFork,Futex,Futex-inl,MemoryIdler,StaticSingletonManager,ThreadLocalDetail}.{h,cpp}', + 'folly/lang/SafeAssert.{h,cpp}', + 'folly/memory/MallctlHelper.{h,cpp}', + 'folly/portability/SysUio.{h,cpp}' + # TODO: Perhaps some of the wildcards above can be further trimmed down with some of these: + # + # 'folly/executors/{DrivableExecutor,InlineExecutor,QueuedImmediateExecutor,TimedDrivableExecutor}.{h,cpp}', + # 'folly/concurrency/{CacheLocality,UnboundedQueue}.{h,cpp}', + # 'folly/system/ThreadId.h', + # 'folly/synchronization/Hazptr{,-fwd,Domain,Holder,Obj,ObjLinked,Rec,ThrLocal}.{h,cpp}', + # 'folly/synchronization/{AsymmetricMemoryBarrier,AtomicStruct,Baton,MicroSpinLock,ParkingLot,RWSpinLock,SanitizeThread,SaturatingSemaphore,WaitOptions}.{h,cpp}', + # 'folly/synchronization/detail/{AtomicUtils,Sleeper,Spin}.{h,cpp}', + # 'folly/experimental/{ReadMostlySharedPtr,TLRefCount}.h', + end + # ]TODO(macOS GH#214) + # Pinning to the same version as React.podspec. spec.platforms = { :ios => "9.0", :tvos => "9.2", :osx => "10.14" } # TODO(macOS GH#214) end diff --git a/third-party-podspecs/libevent.podspec b/third-party-podspecs/libevent.podspec new file mode 100644 index 00000000000000..6f5be6ed077f75 --- /dev/null +++ b/third-party-podspecs/libevent.podspec @@ -0,0 +1,570 @@ +# Because libevent is also relied on by Flipper and *with* OpenSSL bindings, +# building it as a prebuilt binary may lead to hard to satisfy permutations, if +# we'd ever try to build this for other Apple platforms besides macOS. Therefore +# let Xcode build it from source instead. +# +# Generated with: +# +# $ mkdir build && cd build +# $ cmake -G Ninja .. \ +# -DEVENT__DISABLE_OPENSSL:BOOL=ON \ +# -DEVENT__DISABLE_BENCHMARK:BOOL=ON \ +# -DEVENT__DISABLE_TESTS:BOOL=ON \ +# -DEVENT__DISABLE_REGRESS:BOOL=ON \ +# -DEVENT__DISABLE_SAMPLES:BOOL=ON +# $ cat include/event2/event-config.h +# +CONFIG_WITHOUT_OPENSSL = <<-END_OF_CONFIG +/* event-config.h + * + * This file was generated by cmake when the makefiles were generated. + * + * DO NOT EDIT THIS FILE. + * + * Do not rely on macros in this file existing in later versions. + */ +#ifndef EVENT2_EVENT_CONFIG_H_INCLUDED_ +#define EVENT2_EVENT_CONFIG_H_INCLUDED_ + +/* Numeric representation of the version */ +#define EVENT__NUMERIC_VERSION 0x02020001 +#define EVENT__PACKAGE_VERSION "2.2.0" + +#define EVENT__VERSION_MAJOR 2 +#define EVENT__VERSION_MINOR 2 +#define EVENT__VERSION_PATCH 0 + +/* Version number of package */ +#define EVENT__VERSION "2.2.0-alpha-dev" + +/* Name of package */ +#define EVENT__PACKAGE "libevent" + +/* Define to the address where bug reports for this package should be sent. */ +#define EVENT__PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define EVENT__PACKAGE_NAME "" + +/* Define to the full name and version of this package. */ +#define EVENT__PACKAGE_STRING "" + +/* Define to the one symbol short name of this package. */ +#define EVENT__PACKAGE_TARNAME "" + +/* Define if libevent should build without support for a debug mode */ +/* #undef EVENT__DISABLE_DEBUG_MODE */ + +/* Define if libevent should not allow replacing the mm functions */ +/* #undef EVENT__DISABLE_MM_REPLACEMENT */ + +/* Define if libevent should not be compiled with thread support */ +/* #undef EVENT__DISABLE_THREAD_SUPPORT */ + +/* Define to 1 if you have the `accept4' function. */ +/* #undef EVENT__HAVE_ACCEPT4 */ + +/* Define to 1 if you have the `arc4random' function. */ +#define EVENT__HAVE_ARC4RANDOM 1 + +/* Define to 1 if you have the `arc4random_buf' function. */ +#define EVENT__HAVE_ARC4RANDOM_BUF 1 + +/* Define to 1 if you have the `arc4random_addrandom' function. */ +#define EVENT__HAVE_ARC4RANDOM_ADDRANDOM 1 + +/* Define if clock_gettime is available in libc */ +#define EVENT__DNS_USE_CPU_CLOCK_FOR_ID 1 + +/* Define is no secure id variant is available */ +/* #undef EVENT__DNS_USE_GETTIMEOFDAY_FOR_ID */ +/* #undef EVENT__DNS_USE_FTIME_FOR_ID */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_ARPA_INET_H 1 + +/* Define to 1 if you have the `clock_gettime' function. */ +#define EVENT__HAVE_CLOCK_GETTIME 1 + +/* Define to 1 if you have the declaration of `CTL_KERN'. */ +#define EVENT__HAVE_DECL_CTL_KERN 1 + +/* Define to 1 if you have the declaration of `KERN_ARND'. */ +#define EVENT__HAVE_DECL_KERN_ARND 0 + +/* Define to 1 if you have `getrandom' function. */ +/* #undef EVENT__HAVE_GETRANDOM */ + +/* Define if /dev/poll is available */ +/* #undef EVENT__HAVE_DEVPOLL */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_NETDB_H 1 + +/* Define to 1 if fd_mask type is defined */ +#define EVENT__HAVE_FD_MASK 1 + +/* Define to 1 if the header file defines TAILQ_FOREACH. */ +#define EVENT__HAVE_TAILQFOREACH 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_DLFCN_H 1 + +/* Define if your system supports the epoll system calls */ +/* #undef EVENT__HAVE_EPOLL */ + +/* Define to 1 if you have the `epoll_create1' function. */ +/* #undef EVENT__HAVE_EPOLL_CREATE1 */ + +/* Define to 1 if you have the `epoll_ctl' function. */ +/* #undef EVENT__HAVE_EPOLL_CTL */ + +/* Define if your system supports the wepoll module */ +/* #undef EVENT__HAVE_WEPOLL */ + +/* Define to 1 if you have the `eventfd' function. */ +/* #undef EVENT__HAVE_EVENTFD */ + +/* Define if your system supports event ports */ +/* #undef EVENT__HAVE_EVENT_PORTS */ + +/* Define to 1 if you have the `fcntl' function. */ +#define EVENT__HAVE_FCNTL 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `getaddrinfo' function. */ +#define EVENT__HAVE_GETADDRINFO 1 + +/* Define to 1 if you have the `getegid' function. */ +#define EVENT__HAVE_GETEGID 1 + +/* Define to 1 if you have the `geteuid' function. */ +#define EVENT__HAVE_GETEUID 1 + +/* TODO: Check for different gethostname argument counts. CheckPrototypeDefinition.cmake can be used. */ +/* Define this if you have any gethostbyname_r() */ +/* #undef EVENT__HAVE_GETHOSTBYNAME_R */ + +/* Define this if gethostbyname_r takes 3 arguments */ +/* #undef EVENT__HAVE_GETHOSTBYNAME_R_3_ARG */ + +/* Define this if gethostbyname_r takes 5 arguments */ +/* #undef EVENT__HAVE_GETHOSTBYNAME_R_5_ARG */ + +/* Define this if gethostbyname_r takes 6 arguments */ +/* #undef EVENT__HAVE_GETHOSTBYNAME_R_6_ARG */ + +/* Define to 1 if you have the `getifaddrs' function. */ +#define EVENT__HAVE_GETIFADDRS 1 + +/* Define to 1 if you have the `getnameinfo' function. */ +#define EVENT__HAVE_GETNAMEINFO 1 + +/* Define to 1 if you have the `getprotobynumber' function. */ +#define EVENT__HAVE_GETPROTOBYNUMBER 1 + +/* Define to 1 if you have the `getservbyname' function. */ +#define EVENT__HAVE_GETSERVBYNAME 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#define EVENT__HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_IFADDRS_H 1 + +/* Define to 1 if you have the `inet_ntop' function. */ +#define EVENT__HAVE_INET_NTOP 1 + +/* Define to 1 if you have the `inet_pton' function. */ +#define EVENT__HAVE_INET_PTON 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `issetugid' function. */ +#define EVENT__HAVE_ISSETUGID 1 + +/* Define to 1 if you have the `kqueue' function. */ +#define EVENT__HAVE_KQUEUE 1 + +/* Define if the system has zlib */ +/* #undef EVENT__HAVE_LIBZ */ + +/* Define to 1 if you have the `mach_absolute_time' function. */ +#define EVENT__HAVE_MACH_ABSOLUTE_TIME 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_MACH_MACH_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_MACH_MACH_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mmap' function. */ +#define EVENT__HAVE_MMAP 1 + +/* Define to 1 if you have the `nanosleep' function. */ +#define EVENT__HAVE_NANOSLEEP 1 + +/* Define to 1 if you have the `usleep' function. */ +#define EVENT__HAVE_USLEEP 1 + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_NETINET_IN6_H */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_NETINET_IN_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_NETINET_TCP_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_UN_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_AFUNIX_H */ + +/* Define if the system has openssl */ +/* #undef EVENT__HAVE_OPENSSL */ + +/* Define to 1 if you have the `pipe' function. */ +#define EVENT__HAVE_PIPE 1 + +/* Define to 1 if you have the `pipe2' function. */ +/* #undef EVENT__HAVE_PIPE2 */ + +/* Define to 1 if you have the `poll' function. */ +#define EVENT__HAVE_POLL 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_POLL_H 1 + +/* Define to 1 if you have the `port_create' function. */ +/* #undef EVENT__HAVE_PORT_CREATE */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_PORT_H */ + +/* Define if we have pthreads on this system */ +#define EVENT__HAVE_PTHREADS 1 + +/* Define to 1 if you have the `putenv' function. */ +#define EVENT__HAVE_PUTENV 1 + +/* Define to 1 if the system has the type `sa_family_t'. */ +#define EVENT__HAVE_SA_FAMILY_T 1 + +/* Define to 1 if you have the `select' function. */ +#define EVENT__HAVE_SELECT 1 + +/* Define to 1 if you have the `setenv' function. */ +#define EVENT__HAVE_SETENV 1 + +/* Define if F_SETFD is defined in */ +#define EVENT__HAVE_SETFD 1 + +/* Define to 1 if you have the `setrlimit' function. */ +#define EVENT__HAVE_SETRLIMIT 1 + +/* Define to 1 if you have the `sendfile' function. */ +#define EVENT__HAVE_SENDFILE 1 + +/* Define to 1 if you have the `sigaction' function. */ +#define EVENT__HAVE_SIGACTION 1 + +/* Define to 1 if you have the `signal' function. */ +#define EVENT__HAVE_SIGNAL 1 + +/* Define to 1 if you have the `strsignal' function. */ +#define EVENT__HAVE_STRSIGNAL 1 + +/* Define to 1 if you have the `splice' function. */ +/* #undef EVENT__HAVE_SPLICE */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_STDARG_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_STDDEF_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_STRING_H 1 + +/* Define to 1 if you have the `strlcpy' function. */ +#define EVENT__HAVE_STRLCPY 1 + +/* Define to 1 if you have the `strsep' function. */ +#define EVENT__HAVE_STRSEP 1 + +/* Define to 1 if you have the `strtok_r' function. */ +#define EVENT__HAVE_STRTOK_R 1 + +/* Define to 1 if you have the `strtoll' function. */ +#define EVENT__HAVE_STRTOLL 1 + +/* Define to 1 if you have the `_gmtime64_s' function. */ +/* #undef EVENT__HAVE__GMTIME64_S */ + +/* Define to 1 if you have the `_gmtime64' function. */ +/* #undef EVENT__HAVE__GMTIME64 */ + +/* Define to 1 if the system has the type `struct addrinfo'. */ +#define EVENT__HAVE_STRUCT_ADDRINFO 1 + +/* Define to 1 if the system has the type `struct in6_addr'. */ +#define EVENT__HAVE_STRUCT_IN6_ADDR 1 + +/* Define to 1 if `s6_addr16' is member of `struct in6_addr'. */ +/* #undef EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR16 */ + +/* Define to 1 if `s6_addr32' is member of `struct in6_addr'. */ +/* #undef EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR32 */ + +/* Define to 1 if the system has the type `struct sockaddr_in6'. */ +#define EVENT__HAVE_STRUCT_SOCKADDR_IN6 1 + +/* Define to 1 if `sin6_len' is member of `struct sockaddr_in6'. */ +#define EVENT__HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN 1 + +/* Define to 1 if `sin_len' is member of `struct sockaddr_in'. */ +/* #undef EVENT__HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */ + +/* Define to 1 if the system has the type `struct sockaddr_un'. */ +#define EVENT__HAVE_STRUCT_SOCKADDR_UN 1 + +/* Define to 1 if the system has the type `struct sockaddr_storage'. */ +#define EVENT__HAVE_STRUCT_SOCKADDR_STORAGE 1 + +/* Define to 1 if `ss_family' is a member of `struct sockaddr_storage'. */ +#define EVENT__HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1 + +/* Define to 1 if `__ss_family' is a member of `struct sockaddr_storage'. */ +/* #undef EVENT__HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY */ + +/* Define to 1 if the system has the type `struct linger'. */ +#define EVENT__HAVE_STRUCT_LINGER 1 + +/* Define to 1 if you have the `sysctl' function. */ +#define EVENT__HAVE_SYSCTL 1 + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_EPOLL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_EVENTFD_H */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_EVENT_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_PARAM_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_QUEUE_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_RESOURCE_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_SENDFILE_H */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_RANDOM_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_SYSCTL_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef EVENT__HAVE_SYS_TIMERFD_H */ + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_UIO_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_SYS_WAIT_H 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_ERRNO_H 1 + +/* Define if TAILQ_FOREACH is defined in */ +#define EVENT__HAVE_TAILQFOREACH 1 + +/* Define if timeradd is defined in */ +#define EVENT__HAVE_TIMERADD 1 + +/* Define if timerclear is defined in */ +#define EVENT__HAVE_TIMERCLEAR 1 + +/* Define if timercmp is defined in */ +#define EVENT__HAVE_TIMERCMP 1 + + +/* Define to 1 if you have the `timerfd_create' function. */ +/* #undef EVENT__HAVE_TIMERFD_CREATE */ + +/* Define if timerisset is defined in */ +#define EVENT__HAVE_TIMERISSET 1 + +/* Define to 1 if the system has the type `uint8_t'. */ +#define EVENT__HAVE_UINT8_T 1 + +/* Define to 1 if the system has the type `uint16_t'. */ +#define EVENT__HAVE_UINT16_T 1 + +/* Define to 1 if the system has the type `uint32_t'. */ +#define EVENT__HAVE_UINT32_T 1 + +/* Define to 1 if the system has the type `uint64_t'. */ +#define EVENT__HAVE_UINT64_T 1 + +/* Define to 1 if the system has the type `uintptr_t'. */ +#define EVENT__HAVE_UINTPTR_T 1 + +/* Define to 1 if you have the `umask' function. */ +#define EVENT__HAVE_UMASK 1 + +/* Define to 1 if you have the header file. */ +#define EVENT__HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `unsetenv' function. */ +#define EVENT__HAVE_UNSETENV 1 + +/* Define to 1 if you have the `vasprintf' function. */ +#define EVENT__HAVE_VASPRINTF 1 + +/* Define if kqueue works correctly with pipes */ +#define EVENT__HAVE_WORKING_KQUEUE 1 + +#ifdef __USE_UNUSED_DEFINITIONS__ +/* Define to necessary symbol if this constant uses a non-standard name on your system. */ +/* XXX: Hello, this isn't even used, nor is it defined anywhere... - Ellzey */ +#define EVENT__PTHREAD_CREATE_JOINABLE +#endif + +/* The size of `pthread_t', as computed by sizeof. */ +#define EVENT__SIZEOF_PTHREAD_T 8 + +/* The size of a `int', as computed by sizeof. */ +#define EVENT__SIZEOF_INT 4 + +/* The size of a `long', as computed by sizeof. */ +#define EVENT__SIZEOF_LONG 8 + +/* The size of a `long long', as computed by sizeof. */ +#define EVENT__SIZEOF_LONG_LONG 8 + +/* The size of `off_t', as computed by sizeof. */ +#define EVENT__SIZEOF_OFF_T 8 + +#define EVENT__SIZEOF_SSIZE_T 8 + + +/* The size of a `short', as computed by sizeof. */ +#define EVENT__SIZEOF_SHORT 2 + +/* The size of `size_t', as computed by sizeof. */ +#define EVENT__SIZEOF_SIZE_T 8 + +/* Define to 1 if you can safely include both and . */ +/* #undef EVENT__TIME_WITH_SYS_TIME */ + +/* The size of `socklen_t', as computed by sizeof. */ +#define EVENT__SIZEOF_SOCKLEN_T 4 + +/* The size of 'void *', as computer by sizeof */ +#define EVENT__SIZEOF_VOID_P 8 + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* why not c++? + * + * and are we really expected to use EVENT__inline everywhere, + * shouldn't we just do: + * ifdef EVENT__inline + * define inline EVENT__inline + * + * - Ellzey + */ + +#define EVENT__inline inline +#endif + +#define EVENT__HAVE___func__ 1 +#define EVENT__HAVE___FUNCTION__ 1 + +/* Define to `unsigned' if does not define. */ +#define EVENT__size_t size_t + +/* Define to unsigned int if you dont have it */ +#define EVENT__socklen_t socklen_t + +/* Define to `int' if does not define. */ +#define EVENT__ssize_t ssize_t + +#endif /* \EVENT2_EVENT_CONFIG_H_INCLUDED_ */ +END_OF_CONFIG + +Pod::Spec.new do |spec| + spec.name = "libevent" + spec.version = "2.1.11" + spec.summary = "Event notification library" + spec.description = "The libevent API provides a mechanism to execute a callback function when a specific event occurs on a file descriptor or after a timeout has been reached. Furthermore, libevent also support callbacks due to signals or regular timeouts." + spec.homepage = "https://libevent.org" + spec.license = { :type => "BSD 3-Clause", :file => "LICENSE" } + spec.author = "Niels Provos and Nick Mathewson" + spec.platforms = { :osx => "10.14" } + spec.source = { :git => "https://github.com/libevent/libevent.git", :tag => "release-#{spec.version}-stable" } + spec.default_subspec = "core" + spec.prepare_command = "touch evconfig-private.h; echo -e #{Shellwords.escape(CONFIG_WITHOUT_OPENSSL)} > include/event2/event-config.h" + + # This subspec only exists so we can namespace these headers. + spec.subspec "event2-headers" do |ss| + ss.source_files = "include/event2/*.h" + ss.public_header_files = "include/event2/*.h" + ss.header_dir = "event2" + end + + spec.subspec "core" do |ss| + ss.dependency "libevent/event2-headers" + ss.source_files = + "include/*.h", "*-{internal,private}.h", + "buffer.c", "bufferevent.c", "bufferevent_filter.c", "bufferevent_pair.c", "bufferevent_ratelim.c", "bufferevent_sock.c", + "event.c", "evmap.c", "evthread.c", "evutil.c", "evutil_rand.c", "evutil_time.c", + "kqueue.c", "listener.c", "log.c", "poll.c", "select.c", "signal.c", "strlcpy.c", "watch.c", + "evdns.c", "event_tagging.c", "evrpc.c", "http.c" + ss.private_header_files = "*-{internal,private}.h" + ss.public_header_files = "include/*.h" + end +end