Browse Source

build: build squirrel and its dependencies from source (#24318)

* build: build squirrel and its dependencies from source

* chore: do not use fork for squirrel.mac

* build: do not ship headers with dependency frameworks

* Update BUILD.gn

* chore: s/striped/stripped

* chore: update as per feedback

* chore: use ARC and fix build errors

* chore: fix ARC Squirrel self retainer
Samuel Attard 4 years ago
parent
commit
2a6d6d6ea7

+ 2 - 2
.circleci/config.yml

@@ -832,7 +832,7 @@ step-restore-out-cache: &step-restore-out-cache
     paths:
       - ./src/out/Default
     keys:
-      - v8-out-cache-{{ checksum "src/electron/.depshash" }}-{{ checksum "src/electron/.depshash-target" }}
+      - v9-out-cache-{{ checksum "src/electron/.depshash" }}-{{ checksum "src/electron/.depshash-target" }}
     name: Restoring out cache
 
 step-set-git-cache-path: &step-set-git-cache-path
@@ -856,7 +856,7 @@ step-save-out-cache: &step-save-out-cache
   save_cache:
     paths:
       - ./src/out/Default
-    key: v8-out-cache-{{ checksum "src/electron/.depshash" }}-{{ checksum "src/electron/.depshash-target" }}
+    key: v9-out-cache-{{ checksum "src/electron/.depshash" }}-{{ checksum "src/electron/.depshash-target" }}
     name: Persisting out cache
 
 step-run-electron-only-hooks: &step-run-electron-only-hooks

+ 45 - 26
BUILD.gn

@@ -497,16 +497,17 @@ source_set("electron_lib") {
     } else {
       libs += [
         "Squirrel.framework",
-        "ReactiveCocoa.framework",
+        "ReactiveObjC.framework",
         "Mantle.framework",
       ]
-      cflags_objcc = [
-        "-F",
-        rebase_path("external_binaries", root_build_dir),
+
+      deps += [
+        "//third_party/squirrel.mac:reactiveobjc_framework+link",
+        "//third_party/squirrel.mac:squirrel_framework+link",
       ]
 
-      # ReactiveCocoa which is used by Squirrel requires using __weak.
-      cflags_objcc += [ "-fobjc-weak" ]
+      # ReactiveObjC which is used by Squirrel requires using __weak.
+      cflags_objcc = [ "-fobjc-weak" ]
     }
   }
   if (is_linux) {
@@ -811,8 +812,6 @@ if (is_mac) {
     }
 
     ldflags = [
-      "-F",
-      rebase_path("external_binaries", root_build_dir),
       "-Wl,-install_name,@rpath/$output_name.framework/$output_name",
       "-rpath",
       "@loader_path/Libraries",
@@ -863,17 +862,49 @@ if (is_mac) {
     }
   }
 
+  template("stripped_framework") {
+    action(target_name) {
+      assert(defined(invoker.framework))
+
+      script = "//electron/build/strip_framework.py"
+
+      forward_variables_from(invoker, [ "deps" ])
+      inputs = [ "$root_out_dir/" + invoker.framework ]
+      outputs = [ "$target_out_dir/stripped_frameworks/" + invoker.framework ]
+
+      args = rebase_path(inputs) + rebase_path(outputs)
+    }
+  }
+
+  stripped_framework("stripped_mantle_framework") {
+    framework = "Mantle.framework"
+    deps = [ "//third_party/squirrel.mac:mantle_framework" ]
+  }
+
+  stripped_framework("stripped_reactiveobjc_framework") {
+    framework = "ReactiveObjC.framework"
+    deps = [ "//third_party/squirrel.mac:reactiveobjc_framework" ]
+  }
+
+  stripped_framework("stripped_squirrel_framework") {
+    framework = "Squirrel.framework"
+    deps = [ "//third_party/squirrel.mac:squirrel_framework" ]
+  }
+
   bundle_data("electron_app_framework_bundle_data") {
     sources = [ "$root_out_dir/$electron_framework_name.framework" ]
     if (!is_mas_build) {
-      sources += [
-        "external_binaries/Mantle.framework",
-        "external_binaries/ReactiveCocoa.framework",
-        "external_binaries/Squirrel.framework",
-      ]
+      sources += get_target_outputs(":stripped_mantle_framework") +
+                 get_target_outputs(":stripped_reactiveobjc_framework") +
+                 get_target_outputs(":stripped_squirrel_framework")
     }
     outputs = [ "{{bundle_contents_dir}}/Frameworks/{{source_file_part}}" ]
-    public_deps = [ ":electron_framework+link" ]
+    public_deps = [
+      ":electron_framework+link",
+      ":stripped_mantle_framework",
+      ":stripped_reactiveobjc_framework",
+      ":stripped_squirrel_framework",
+    ]
 
     foreach(helper_params, content_mac_helpers) {
       sources +=
@@ -1179,18 +1210,6 @@ test("shell_browser_ui_unittests") {
     "//ui/base",
     "//ui/strings",
   ]
-
-  if (is_mac) {
-    # Resolve paths owing to different test executable locations
-    ldflags = [
-      "-F",
-      rebase_path("external_binaries", root_build_dir),
-      "-rpath",
-      "@loader_path",
-      "-rpath",
-      "@executable_path/" + rebase_path("external_binaries", root_build_dir),
-    ]
-  }
 }
 
 template("dist_zip") {

+ 16 - 0
DEPS

@@ -18,6 +18,8 @@ vars = {
     'v12.18.2',
   'nan_version':
     '2c4ee8a32a299eada3cd6e468bbd0a473bfea96d',
+  'squirrel.mac_version':
+    '44468f858ce0d25c27bd5e674abfa104e0119738',
 
   'boto_version': 'f7574aa6cc2c819430c1f05e9a1a1a666ef8169b',
   'pyyaml_version': '3.12',
@@ -29,6 +31,7 @@ vars = {
   'nodejs_git': 'https://github.com/nodejs',
   'requests_git': 'https://github.com/kennethreitz',
   'yaml_git': 'https://github.com/yaml',
+  'squirrel_git': 'https://github.com/Squirrel',
 
   # KEEP IN SYNC WITH utils.js FILE
   'yarn_version': '1.15.2',
@@ -101,6 +104,18 @@ deps = {
     'url': Var('requests_git') + '/requests.git' + '@' +  Var('requests_version'),
     'condition': 'checkout_requests and process_deps',
   },
+  'src/third_party/squirrel.mac': {
+    'url': Var("squirrel_git") + '/Squirrel.Mac.git@' + Var("squirrel.mac_version"),
+    'condition': 'process_deps',
+  },
+  'src/third_party/squirrel.mac/vendor/ReactiveObjC': {
+    'url': 'https://github.com/ReactiveCocoa/ReactiveObjC.git@74ab5baccc6f7202c8ac69a8d1e152c29dc1ea76',
+    'condition': 'process_deps'
+  },
+  'src/third_party/squirrel.mac/vendor/Mantle': {
+    'url': 'https://github.com/Mantle/Mantle.git@78d3966b3c331292ea29ec38661b25df0a245948',
+    'condition': 'process_deps',
+  }
 }
 
 hooks = [
@@ -156,4 +171,5 @@ hooks = [
 
 recursedeps = [
   'src',
+  'src/third_party/squirrel.mac',
 ]

+ 16 - 0
build/strip_framework.py

@@ -0,0 +1,16 @@
+#!/usr/bin/env python
+import os
+import subprocess
+import sys
+
+source = sys.argv[1]
+dest = sys.argv[2]
+
+# Ensure any existing framework is removed
+subprocess.check_output(["rm", "-rf", dest])
+
+subprocess.check_output(["cp", "-a", source, dest])
+
+# Strip headers, we do not need to ship them
+subprocess.check_output(["rm", "-r", os.path.join(dest, 'Headers')])
+subprocess.check_output(["rm", "-r", os.path.join(dest, 'Versions', 'Current', 'Headers')])

+ 1 - 0
patches/ReactiveObjC/.patches

@@ -0,0 +1 @@
+build_conditionally_import_ext_headers_from_framework_or_from.patch

+ 533 - 0
patches/ReactiveObjC/build_conditionally_import_ext_headers_from_framework_or_from.patch

@@ -0,0 +1,533 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Samuel Attard <[email protected]>
+Date: Fri, 26 Jun 2020 11:06:12 -0700
+Subject: build: conditionally import EXT headers from framework or from
+ relative path
+
+diff --git a/ReactiveObjC/NSControl+RACTextSignalSupport.m b/ReactiveObjC/NSControl+RACTextSignalSupport.m
+index 88da38f6e8117bbabdd898c8a1d4bde5e59deda7..483caea62eaaf26d9ad7d267a5c3e9aa44638ce7 100644
+--- a/ReactiveObjC/NSControl+RACTextSignalSupport.m
++++ b/ReactiveObjC/NSControl+RACTextSignalSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "NSControl+RACTextSignalSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "NSObject+RACDescription.h"
+ #import "RACDisposable.h"
+ #import "RACSignal.h"
+diff --git a/ReactiveObjC/NSNotificationCenter+RACSupport.m b/ReactiveObjC/NSNotificationCenter+RACSupport.m
+index 6d6f94384e0a85635c70f258020dd7ac7c78b3b1..1a364d16909c77654674b189cb9bc0861892e5aa 100644
+--- a/ReactiveObjC/NSNotificationCenter+RACSupport.m
++++ b/ReactiveObjC/NSNotificationCenter+RACSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "NSNotificationCenter+RACSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "RACSignal.h"
+ #import "RACSubscriber.h"
+ #import "RACDisposable.h"
+diff --git a/ReactiveObjC/NSObject+RACAppKitBindings.m b/ReactiveObjC/NSObject+RACAppKitBindings.m
+index 06fd5d011515680b460220d96ddd0e889b134416..4c69de773ab31711f151a81a81f2757adedbed21 100644
+--- a/ReactiveObjC/NSObject+RACAppKitBindings.m
++++ b/ReactiveObjC/NSObject+RACAppKitBindings.m
+@@ -7,8 +7,16 @@
+ //
+ 
+ #import "NSObject+RACAppKitBindings.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "NSObject+RACDeallocating.h"
+ #import "RACChannel.h"
+ #import "RACCompoundDisposable.h"
+diff --git a/ReactiveObjC/NSObject+RACKVOWrapper.m b/ReactiveObjC/NSObject+RACKVOWrapper.m
+index 099dc773af172df8ddd8c62165e8c79589112857..aaf40f0b725b94aa49a448dce5c084f0dcc32e60 100644
+--- a/ReactiveObjC/NSObject+RACKVOWrapper.m
++++ b/ReactiveObjC/NSObject+RACKVOWrapper.m
+@@ -7,8 +7,16 @@
+ //
+ 
+ #import "NSObject+RACKVOWrapper.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTRuntimeExtensions.h"
++#else
+ #import <ReactiveObjC/EXTRuntimeExtensions.h>
++#endif
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "NSObject+RACDeallocating.h"
+ #import "NSString+RACKeyPathUtilities.h"
+ #import "RACCompoundDisposable.h"
+diff --git a/ReactiveObjC/NSObject+RACLifting.m b/ReactiveObjC/NSObject+RACLifting.m
+index a0c09d5c08b6b35b411d305f17326268d41a30b6..e2b01c13a1e858378a4f2e983f2487ace6b5a445 100644
+--- a/ReactiveObjC/NSObject+RACLifting.m
++++ b/ReactiveObjC/NSObject+RACLifting.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "NSObject+RACLifting.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "NSInvocation+RACTypeParsing.h"
+ #import "NSObject+RACDeallocating.h"
+ #import "NSObject+RACDescription.h"
+diff --git a/ReactiveObjC/NSObject+RACPropertySubscribing.h b/ReactiveObjC/NSObject+RACPropertySubscribing.h
+index 430c066d4e1f9110b60e877fbff2254de9f56d58..cbbaa5ac9cf1942eb460d172ef41eaa2d8c387ee 100644
+--- a/ReactiveObjC/NSObject+RACPropertySubscribing.h
++++ b/ReactiveObjC/NSObject+RACPropertySubscribing.h
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import <Foundation/Foundation.h>
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
+ #import "metamacros.h"
+ 
+ /// Creates a signal which observes `KEYPATH` on `TARGET` for changes.
+diff --git a/ReactiveObjC/NSObject+RACPropertySubscribing.m b/ReactiveObjC/NSObject+RACPropertySubscribing.m
+index 29e3df89e47b4d28b1c789181b2a6993c56a0f88..61a5929aa892a948b24b9f4403cb71272a1ca071 100644
+--- a/ReactiveObjC/NSObject+RACPropertySubscribing.m
++++ b/ReactiveObjC/NSObject+RACPropertySubscribing.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "NSObject+RACPropertySubscribing.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "NSObject+RACDeallocating.h"
+ #import "NSObject+RACDescription.h"
+ #import "NSObject+RACKVOWrapper.h"
+diff --git a/ReactiveObjC/NSObject+RACSelectorSignal.m b/ReactiveObjC/NSObject+RACSelectorSignal.m
+index ed809e2efefbfd48754294bfe6dbb32b7e01c8c6..7e8a9522d449bba2b08b560782661b424bfd3417 100644
+--- a/ReactiveObjC/NSObject+RACSelectorSignal.m
++++ b/ReactiveObjC/NSObject+RACSelectorSignal.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "NSObject+RACSelectorSignal.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTRuntimeExtensions.h"
++#else
+ #import <ReactiveObjC/EXTRuntimeExtensions.h>
++#endif
+ #import "NSInvocation+RACTypeParsing.h"
+ #import "NSObject+RACDeallocating.h"
+ #import "RACCompoundDisposable.h"
+diff --git a/ReactiveObjC/NSText+RACSignalSupport.m b/ReactiveObjC/NSText+RACSignalSupport.m
+index dfeff1ee23c3d560581c8b66a1e52b87474e4c5d..a83d271234e1a66452588e48422f5ecca0b298c6 100644
+--- a/ReactiveObjC/NSText+RACSignalSupport.m
++++ b/ReactiveObjC/NSText+RACSignalSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "NSText+RACSignalSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "NSObject+RACDescription.h"
+ #import "RACDisposable.h"
+ #import "RACSignal.h"
+diff --git a/ReactiveObjC/NSUserDefaults+RACSupport.m b/ReactiveObjC/NSUserDefaults+RACSupport.m
+index 203d60ea44c5009bad48d6255f3bd6079b3c29d3..c55198bac675e7a5bd67ec3e0442cfef366a9db6 100644
+--- a/ReactiveObjC/NSUserDefaults+RACSupport.m
++++ b/ReactiveObjC/NSUserDefaults+RACSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "NSUserDefaults+RACSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "NSNotificationCenter+RACSupport.h"
+ #import "NSObject+RACDeallocating.h"
+ #import "RACChannel.h"
+diff --git a/ReactiveObjC/RACCommand.m b/ReactiveObjC/RACCommand.m
+index 4342f80ba8cc1afef7bed952551cbd93486cf2db..30c684fe9c07845cc695fd641133bb4d9c4954ba 100644
+--- a/ReactiveObjC/RACCommand.m
++++ b/ReactiveObjC/RACCommand.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "RACCommand.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "NSArray+RACSequenceAdditions.h"
+ #import "NSObject+RACDeallocating.h"
+ #import "NSObject+RACDescription.h"
+diff --git a/ReactiveObjC/RACDynamicSignal.m b/ReactiveObjC/RACDynamicSignal.m
+index 3bee2f7c2b9f441f4dfa89e7c6e716e80b99f36e..6069b0b747f5742e196e464d4b32fa5ff4781126 100644
+--- a/ReactiveObjC/RACDynamicSignal.m
++++ b/ReactiveObjC/RACDynamicSignal.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "RACDynamicSignal.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "RACCompoundDisposable.h"
+ #import "RACPassthroughSubscriber.h"
+ #import "RACScheduler+Private.h"
+diff --git a/ReactiveObjC/RACKVOChannel.h b/ReactiveObjC/RACKVOChannel.h
+index f1bd971085d6f403d8d0d304666e91d5f4beba62..9d1b74df0432c0593d488936d74b920f4b6f1eec 100644
+--- a/ReactiveObjC/RACKVOChannel.h
++++ b/ReactiveObjC/RACKVOChannel.h
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "RACChannel.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
+ #import "metamacros.h"
+ 
+ /// Creates a RACKVOChannel to the given key path. When the targeted object
+diff --git a/ReactiveObjC/RACKVOChannel.m b/ReactiveObjC/RACKVOChannel.m
+index c9e89d93472849917e21df0f8627300c216d494d..1df7ca105f77714b760294aacc5f8aaa279d30f8 100644
+--- a/ReactiveObjC/RACKVOChannel.m
++++ b/ReactiveObjC/RACKVOChannel.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "RACKVOChannel.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "NSObject+RACDeallocating.h"
+ #import "NSObject+RACKVOWrapper.h"
+ #import "NSString+RACKeyPathUtilities.h"
+diff --git a/ReactiveObjC/RACSubject.m b/ReactiveObjC/RACSubject.m
+index 8ea052fd27d554ef00b76f3a06e8091ecf26a0d3..3d5b038a37e03fe74427e6d6f8c5c428b23d2777 100644
+--- a/ReactiveObjC/RACSubject.m
++++ b/ReactiveObjC/RACSubject.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "RACSubject.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "RACCompoundDisposable.h"
+ #import "RACPassthroughSubscriber.h"
+ 
+diff --git a/ReactiveObjC/RACSubscriber.m b/ReactiveObjC/RACSubscriber.m
+index c0ee3021b3a84cbff2e2278e110fa2253eb9a6a7..89dca6ca5a4fa5d35657c417a2a232f3fe713c53 100644
+--- a/ReactiveObjC/RACSubscriber.m
++++ b/ReactiveObjC/RACSubscriber.m
+@@ -8,7 +8,11 @@
+ 
+ #import "RACSubscriber.h"
+ #import "RACSubscriber+Private.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "RACCompoundDisposable.h"
+ 
+ @interface RACSubscriber ()
+diff --git a/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h b/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h
+index 5242ea2d9c2f1e8395a4d5634ae5f67b29b93368..7d63975e2a14987ab52bcfdbaf6e5e42f44f31fa 100644
+--- a/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h
++++ b/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import <Foundation/Foundation.h>
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
+ 
+ @class RACSignal<__covariant ValueType>;
+ 
+diff --git a/ReactiveObjC/RACTestScheduler.m b/ReactiveObjC/RACTestScheduler.m
+index 621f40e4f376bbf5e53ed9b55b7d1c46369aecbc..936bd6050ea1c46064c9f698ae2564cdfcc91c3b 100644
+--- a/ReactiveObjC/RACTestScheduler.m
++++ b/ReactiveObjC/RACTestScheduler.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "RACTestScheduler.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "RACCompoundDisposable.h"
+ #import "RACDisposable.h"
+ #import "RACScheduler+Private.h"
+diff --git a/ReactiveObjC/RACTuple.m b/ReactiveObjC/RACTuple.m
+index 7f67625c8466ececb2a305554a115460576d52fb..b2f7120d42f03f3933b79b474b240c0f2d9e11d3 100644
+--- a/ReactiveObjC/RACTuple.m
++++ b/ReactiveObjC/RACTuple.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "RACTuple.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
+ #import "RACTupleSequence.h"
+ 
+ @implementation RACTupleNil
+diff --git a/ReactiveObjC/RACUnarySequence.m b/ReactiveObjC/RACUnarySequence.m
+index 76ce0bd29738a75f3f916b92a30f586d746132fd..5d54674ed63cc4235678379fb67b4fcf441bc78a 100644
+--- a/ReactiveObjC/RACUnarySequence.m
++++ b/ReactiveObjC/RACUnarySequence.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "RACUnarySequence.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
+ #import "NSObject+RACDescription.h"
+ 
+ @interface RACUnarySequence ()
+diff --git a/ReactiveObjC/UIBarButtonItem+RACCommandSupport.m b/ReactiveObjC/UIBarButtonItem+RACCommandSupport.m
+index 225e8b751a52cfd35759536efd3b085dcafae84c..7f33a9f2fba8f2aab9abd948ebedce4184e65145 100644
+--- a/ReactiveObjC/UIBarButtonItem+RACCommandSupport.m
++++ b/ReactiveObjC/UIBarButtonItem+RACCommandSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "UIBarButtonItem+RACCommandSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
+ #import "RACCommand.h"
+ #import "RACDisposable.h"
+ #import "RACSignal+Operations.h"
+diff --git a/ReactiveObjC/UIButton+RACCommandSupport.m b/ReactiveObjC/UIButton+RACCommandSupport.m
+index 6b11dad2766b525ca977a75daee3614d37afe872..1a4920721e8a7de078d2cb26382512021f306543 100644
+--- a/ReactiveObjC/UIButton+RACCommandSupport.m
++++ b/ReactiveObjC/UIButton+RACCommandSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "UIButton+RACCommandSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
+ #import "RACCommand.h"
+ #import "RACDisposable.h"
+ #import "RACSignal+Operations.h"
+diff --git a/ReactiveObjC/UIControl+RACSignalSupport.m b/ReactiveObjC/UIControl+RACSignalSupport.m
+index df3108eb71cf0245ee5fddddfb667ee76e3dd05e..831036a1297fd1230b60195190f147b87cdc582c 100644
+--- a/ReactiveObjC/UIControl+RACSignalSupport.m
++++ b/ReactiveObjC/UIControl+RACSignalSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "UIControl+RACSignalSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "RACCompoundDisposable.h"
+ #import "RACDisposable.h"
+ #import "RACSignal.h"
+diff --git a/ReactiveObjC/UIDatePicker+RACSignalSupport.m b/ReactiveObjC/UIDatePicker+RACSignalSupport.m
+index 5c815c2f24756a95e6db6b30651d4860648fd497..dc06b2e7badade089477326d4677058b6c0e7d8e 100644
+--- a/ReactiveObjC/UIDatePicker+RACSignalSupport.m
++++ b/ReactiveObjC/UIDatePicker+RACSignalSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "UIDatePicker+RACSignalSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
+ #import "UIControl+RACSignalSupportPrivate.h"
+ 
+ @implementation UIDatePicker (RACSignalSupport)
+diff --git a/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.m b/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.m
+index 4f816eb8e67115352eaa3fafd592d86fb09bf46b..bbbf22b54be5539397c549008631dcb56abbdbe9 100644
+--- a/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.m
++++ b/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "UIGestureRecognizer+RACSignalSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "NSObject+RACDeallocating.h"
+ #import "NSObject+RACDescription.h"
+ #import "RACCompoundDisposable.h"
+diff --git a/ReactiveObjC/UIRefreshControl+RACCommandSupport.m b/ReactiveObjC/UIRefreshControl+RACCommandSupport.m
+index 3301ca194b7e0bc9bc5a05658487e1cf588c979e..53eec9931841a9be3baca6603181a88702ff2682 100644
+--- a/ReactiveObjC/UIRefreshControl+RACCommandSupport.m
++++ b/ReactiveObjC/UIRefreshControl+RACCommandSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "UIRefreshControl+RACCommandSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
+ #import "RACCommand.h"
+ #import "RACCompoundDisposable.h"
+ #import "RACDisposable.h"
+diff --git a/ReactiveObjC/UISegmentedControl+RACSignalSupport.m b/ReactiveObjC/UISegmentedControl+RACSignalSupport.m
+index 782cabca08697062c72eea148f846add3fcea7c4..1aeddfc20fa09ef7744d400b496e0d3131271242 100644
+--- a/ReactiveObjC/UISegmentedControl+RACSignalSupport.m
++++ b/ReactiveObjC/UISegmentedControl+RACSignalSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "UISegmentedControl+RACSignalSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
+ #import "UIControl+RACSignalSupportPrivate.h"
+ 
+ @implementation UISegmentedControl (RACSignalSupport)
+diff --git a/ReactiveObjC/UISlider+RACSignalSupport.m b/ReactiveObjC/UISlider+RACSignalSupport.m
+index 3583d843c5732cdbcb37bdf888cfd59dcd075868..d27160043099339ac0d6a55cda57f01fc5533ed8 100644
+--- a/ReactiveObjC/UISlider+RACSignalSupport.m
++++ b/ReactiveObjC/UISlider+RACSignalSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "UISlider+RACSignalSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
+ #import "UIControl+RACSignalSupportPrivate.h"
+ 
+ @implementation UISlider (RACSignalSupport)
+diff --git a/ReactiveObjC/UIStepper+RACSignalSupport.m b/ReactiveObjC/UIStepper+RACSignalSupport.m
+index 5eee8f8534e9866e8082f24f23c4aa960b4235f7..a846cbf00a5d14a13aa5914cb0dc81596a44cdb5 100644
+--- a/ReactiveObjC/UIStepper+RACSignalSupport.m
++++ b/ReactiveObjC/UIStepper+RACSignalSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "UIStepper+RACSignalSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
+ #import "UIControl+RACSignalSupportPrivate.h"
+ 
+ @implementation UIStepper (RACSignalSupport)
+diff --git a/ReactiveObjC/UISwitch+RACSignalSupport.m b/ReactiveObjC/UISwitch+RACSignalSupport.m
+index a5f847d805aecebadf3b27991749fcc2e7c79fd8..df62bcdae01bc4c497e2021857428129b1b64515 100644
+--- a/ReactiveObjC/UISwitch+RACSignalSupport.m
++++ b/ReactiveObjC/UISwitch+RACSignalSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "UISwitch+RACSignalSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
+ #import "UIControl+RACSignalSupportPrivate.h"
+ 
+ @implementation UISwitch (RACSignalSupport)
+diff --git a/ReactiveObjC/UITextField+RACSignalSupport.m b/ReactiveObjC/UITextField+RACSignalSupport.m
+index b02444858f7adc900d02efbeb49c6b9197a31adc..9da162b06d6541c1cb2ac1a8e4606b49df74c968 100644
+--- a/ReactiveObjC/UITextField+RACSignalSupport.m
++++ b/ReactiveObjC/UITextField+RACSignalSupport.m
+@@ -7,8 +7,16 @@
+ //
+ 
+ #import "UITextField+RACSignalSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTKeyPathCoding.h"
++#else
+ #import <ReactiveObjC/EXTKeyPathCoding.h>
++#endif
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "NSObject+RACDeallocating.h"
+ #import "NSObject+RACDescription.h"
+ #import "RACSignal+Operations.h"
+diff --git a/ReactiveObjC/UITextView+RACSignalSupport.m b/ReactiveObjC/UITextView+RACSignalSupport.m
+index d47f6e59c6b070f6b00de294f8dc455726b3a386..9c6c36c6ec9e0a1fcddd5db9ecf62565bb9c5724 100644
+--- a/ReactiveObjC/UITextView+RACSignalSupport.m
++++ b/ReactiveObjC/UITextView+RACSignalSupport.m
+@@ -7,7 +7,11 @@
+ //
+ 
+ #import "UITextView+RACSignalSupport.h"
++#if defined(BUILDING_RAC_FRAMEWORK)
++#import "extobjc/EXTScope.h"
++#else
+ #import <ReactiveObjC/EXTScope.h>
++#endif
+ #import "NSObject+RACDeallocating.h"
+ #import "NSObject+RACDescription.h"
+ #import "RACDelegateProxy.h"

+ 5 - 1
patches/config.json

@@ -5,5 +5,9 @@
 
   "src/electron/patches/v8":  "src/v8",
 
-  "src/electron/patches/node": "src/third_party/electron_node"
+  "src/electron/patches/node": "src/third_party/electron_node",
+
+  "src/electron/patches/squirrel.mac": "src/third_party/squirrel.mac",
+
+  "src/electron/patches/ReactiveObjC": "src/third_party/squirrel.mac/vendor/ReactiveObjC"
 }

+ 2 - 0
patches/squirrel.mac/.patches

@@ -0,0 +1,2 @@
+build_add_gn_config.patch
+fix_ensure_that_self_is_retained_until_the_racsignal_is_complete.patch

+ 779 - 0
patches/squirrel.mac/build_add_gn_config.patch

@@ -0,0 +1,779 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Samuel Attard <[email protected]>
+Date: Thu, 25 Jun 2020 14:39:52 -0700
+Subject: build: add GN config
+
+Adds BUILD.gn file and upgrades from ReactiveCocoa to ReactiveObjC
+
+diff --git a/.gitignore b/.gitignore
+index 89c499e451ecb48655cfd42b01ffa1da56998c2e..98f80aad43a87ed75ca1660ad6a178db9a644a3a 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -1,6 +1,5 @@
+ # Xcode
+ .DS_Store
+-build/
+ *.pbxuser
+ !default.pbxuser
+ *.mode1v3
+@@ -16,3 +15,4 @@ profile
+ *.moved-aside
+ DerivedData
+ .idea/
++vendor
+diff --git a/BUILD.gn b/BUILD.gn
+new file mode 100644
+index 0000000000000000000000000000000000000000..a259f5d9a70686f01b32e08c1d8337c46d3a4704
+--- /dev/null
++++ b/BUILD.gn
+@@ -0,0 +1,236 @@
++assert(is_mac)
++
++import("//build/config/mac/rules.gni")
++import("build/xcrun.gni")
++import("filenames.gni")
++
++bundle_data("mantle_headers") {
++  sources = []
++  public_deps = []
++  sources += mantle_filenames.headers
++  outputs = [ "{{bundle_contents_dir}}/Headers/{{source_file_part}}" ]
++}
++
++mac_framework_bundle("mantle_framework") {
++  output_name = "Mantle"
++  framework_version = "A"
++  framework_contents = [
++    "Headers",
++    "Resources",
++  ]
++  info_plist = "vendor/Mantle/Mantle/Info.plist"
++  extra_substitutions = [ "CURRENT_PROJECT_VERSION=0.0.0" ]
++
++  configs -= [
++    "//build/config/compiler:chromium_code",
++    "//build/config/gcc:symbol_visibility_hidden",
++  ]
++  configs += [ "//build/config/compiler:no_chromium_code" ]
++  public_deps = [ ":mantle_headers" ]
++  deps = []
++  libs = [
++    "CoreData.framework",
++    "Foundation.framework",
++  ]
++  sources = mantle_filenames.headers + mantle_filenames.sources
++
++  include_dirs = [
++    "vendor/Mantle/Mantle",
++    "vendor/Mantle/Mantle/extobjc",
++  ]
++
++  cflags_objc = [
++    "-fobjc-arc",
++    "-Wno-block-capture-autoreleasing",
++  ]
++
++  ldflags = [ "-Wl,-install_name,@rpath/$output_name.framework/$output_name" ]
++}
++
++dtrace_header_dir = "$target_gen_dir/dtrace"
++
++xcrun_action("reactiveobjc_signalprovider_dtrace") {
++  cmd = "dtrace"
++  inputs = [ "vendor/ReactiveObjC/ReactiveObjC/RACSignalProvider.d" ]
++  outputs = [ "$dtrace_header_dir/RACSignalProvider.h" ]
++  args = [
++           "-h",
++           "-s",
++         ] + rebase_path(inputs) + [ "-o" ] + rebase_path(outputs)
++}
++
++xcrun_action("reactiveobjc_disposableprovider_dtrace") {
++  cmd = "dtrace"
++  inputs =
++      [ "vendor/ReactiveObjC/ReactiveObjC/RACCompoundDisposableProvider.d" ]
++  outputs = [ "$dtrace_header_dir/RACCompoundDisposableProvider.h" ]
++  args = [
++           "-h",
++           "-s",
++         ] + rebase_path(inputs) + [ "-o" ] + rebase_path(outputs)
++}
++
++bundle_data("reactiveobjc_headers") {
++  sources = []
++  public_deps = []
++  sources += reactiveobjc_filenames.public_headers
++  outputs = [ "{{bundle_contents_dir}}/Headers/{{source_file_part}}" ]
++}
++
++mac_framework_bundle("reactiveobjc_framework") {
++  output_name = "ReactiveObjC"
++  framework_version = "A"
++  framework_contents = [
++    "Headers",
++    "Resources",
++  ]
++  info_plist = "vendor/ReactiveObjC/ReactiveObjC/Info.plist"
++  extra_substitutions = [
++    "CURRENT_PROJECT_VERSION=0.0.0",
++    "PRODUCT_BUNDLE_IDENTIFIER=com.electron.reactive",
++  ]
++  defines = [ "BUILDING_RAC_FRAMEWORK=1" ]
++
++  configs -= [
++    "//build/config/compiler:chromium_code",
++    "//build/config/gcc:symbol_visibility_hidden",
++  ]
++  configs += [ "//build/config/compiler:no_chromium_code" ]
++  deps = [
++    ":reactiveobjc_disposableprovider_dtrace",
++    ":reactiveobjc_headers",
++    ":reactiveobjc_headers",
++    ":reactiveobjc_signalprovider_dtrace",
++  ]
++  libs = [
++    "AppKit.framework",
++    "Foundation.framework",
++  ]
++  sources =
++      reactiveobjc_filenames.public_headers +
++      reactiveobjc_filenames.private_headers + reactiveobjc_filenames.sources
++
++  include_dirs = [
++    "vendor/ReactiveObjC/ReactiveObjC",
++    "vendor/ReactiveObjC/ReactiveObjC/extobjc",
++    "$dtrace_header_dir",
++  ]
++
++  cflags_objc = [ "-fobjc-arc" ]
++
++  ldflags = [ "-Wl,-install_name,@rpath/$output_name.framework/$output_name" ]
++}
++
++executable("squirrel_shipit") {
++  output_name = "ShipIt"
++  configs -= [ "//build/config/compiler:chromium_code" ]
++  configs += [ "//build/config/compiler:no_chromium_code" ]
++  sources = [
++    "Squirrel/NSBundle+SQRLVersionExtensions.h",
++    "Squirrel/NSBundle+SQRLVersionExtensions.m",
++    "Squirrel/NSError+SQRLVerbosityExtensions.h",
++    "Squirrel/NSError+SQRLVerbosityExtensions.m",
++    "Squirrel/NSProcessInfo+SQRLVersionExtensions.h",
++    "Squirrel/NSProcessInfo+SQRLVersionExtensions.m",
++    "Squirrel/RACSignal+SQRLTransactionExtensions.h",
++    "Squirrel/RACSignal+SQRLTransactionExtensions.m",
++    "Squirrel/SQRLCodeSignature.h",
++    "Squirrel/SQRLCodeSignature.m",
++    "Squirrel/SQRLInstaller+Private.h",
++    "Squirrel/SQRLInstaller.h",
++    "Squirrel/SQRLInstaller.m",
++    "Squirrel/SQRLInstallerOwnedBundle.h",
++    "Squirrel/SQRLInstallerOwnedBundle.m",
++    "Squirrel/SQRLShipItRequest.h",
++    "Squirrel/SQRLShipItRequest.m",
++    "Squirrel/SQRLTerminationListener.h",
++    "Squirrel/SQRLTerminationListener.m",
++    "Squirrel/ShipIt-main.m",
++  ]
++  deps = [
++    ":mantle_framework+link",
++    ":reactiveobjc_framework+link",
++  ]
++  libs = [
++    "AppKit.framework",
++    "Foundation.framework",
++    "IOKit.framework",
++    "Security.framework",
++  ]
++
++  cflags_objc = [
++    "-fobjc-weak",
++    "-Wno-unknown-warning-option",
++    "-Wno-block-capture-autoreleasing",
++    "-fobjc-arc",
++  ]
++
++  ldflags = [
++    "-rpath",
++    "@executable_path/../..",
++    "-rpath",
++    "@executable_path/../../../..",
++  ]
++
++  include_dirs = [ "vendor/ReactiveObjC/ReactiveObjC/extobjc" ]
++}
++
++bundle_data("squirrel_framework_shipit") {
++  sources = []
++  public_deps = [ ":squirrel_shipit" ]
++  sources += [ "$root_out_dir/ShipIt" ]
++  outputs = [ "{{bundle_contents_dir}}/Resources/{{source_file_part}}" ]
++}
++
++bundle_data("squirrel_framework_headers") {
++  sources = []
++  public_deps = []
++  sources += squirrel_filenames.headers
++  outputs = [ "{{bundle_contents_dir}}/Headers/{{source_file_part}}" ]
++}
++
++mac_framework_bundle("squirrel_framework") {
++  output_name = "Squirrel"
++  framework_version = "A"
++  framework_contents = [
++    "Headers",
++    "Resources",
++  ]
++  info_plist = "Squirrel/Squirrel-Info.plist"
++  extra_substitutions = [
++    "CURRENT_PROJECT_VERSION=0.0.0",
++    "PRODUCT_BUNDLE_IDENTIFIER=com.github.Squirrel",
++  ]
++
++  configs -= [
++    "//build/config/compiler:chromium_code",
++    "//build/config/gcc:symbol_visibility_hidden",
++  ]
++  configs += [ "//build/config/compiler:no_chromium_code" ]
++  public_deps = [
++    ":squirrel_framework_headers",
++    ":squirrel_framework_shipit",
++  ]
++  deps = [
++    ":mantle_framework+link",
++    ":reactiveobjc_framework+link",
++  ]
++  libs = [
++    "AppKit.framework",
++    "Foundation.framework",
++    "IOKit.framework",
++    "Security.framework",
++    "ServiceManagement.framework",
++  ]
++  sources = squirrel_filenames.headers + squirrel_filenames.sources
++
++  cflags_objc = [
++    "-fobjc-weak",
++    "-fobjc-arc",
++    "-Wno-block-capture-autoreleasing",
++  ]
++
++  ldflags = [ "-Wl,-install_name,@rpath/$output_name.framework/$output_name" ]
++
++  include_dirs = [ "vendor/ReactiveObjC/ReactiveObjC/extobjc" ]
++}
+diff --git a/Squirrel/RACSignal+SQRLTransactionExtensions.h b/Squirrel/RACSignal+SQRLTransactionExtensions.h
+index 6b98d968e794d7ef4fc08c898142e03dd08e33b3..63cdfeb963e57fe9c1c25b909e0d396f76143e52 100644
+--- a/Squirrel/RACSignal+SQRLTransactionExtensions.h
++++ b/Squirrel/RACSignal+SQRLTransactionExtensions.h
+@@ -6,7 +6,7 @@
+ //  Copyright (c) 2013 GitHub. All rights reserved.
+ //
+ 
+-#import <ReactiveCocoa/RACSignal.h>
++#import <ReactiveObjC/RACSignal.h>
+ 
+ @interface RACSignal (SQRLTransactionExtensions)
+ 
+diff --git a/Squirrel/RACSignal+SQRLTransactionExtensions.m b/Squirrel/RACSignal+SQRLTransactionExtensions.m
+index 8293acffd9215131839b82824c740d28c44cc995..4636e00cb6ccd6a200295f3bb2758e6f6e6bd2b0 100644
+--- a/Squirrel/RACSignal+SQRLTransactionExtensions.m
++++ b/Squirrel/RACSignal+SQRLTransactionExtensions.m
+@@ -8,7 +8,7 @@
+ 
+ #import "RACSignal+SQRLTransactionExtensions.h"
+ 
+-#import <ReactiveCocoa/RACDisposable.h>
++#import <ReactiveObjC/RACDisposable.h>
+ #import <IOKit/pwr_mgt/IOPMLib.h>
+ 
+ // How long before power assertions time out.
+diff --git a/Squirrel/SQRLCodeSignature.m b/Squirrel/SQRLCodeSignature.m
+index e42332ab13fb01000c73cf0b3b757d1f7141da6f..f8754dbd6a1490d2b50f1014e2daa5c1f71b2103 100644
+--- a/Squirrel/SQRLCodeSignature.m
++++ b/Squirrel/SQRLCodeSignature.m
+@@ -10,8 +10,8 @@
+ 
+ #import "EXTKeyPathCoding.h"
+ #import "EXTScope.h"
+-#import <ReactiveCocoa/RACSignal+Operations.h>
+-#import <ReactiveCocoa/RACSubscriber.h>
++#import <ReactiveObjC/RACSignal+Operations.h>
++#import <ReactiveObjC/RACSubscriber.h>
+ #import <Security/Security.h>
+ 
+ NSString * const SQRLCodeSignatureErrorDomain = @"SQRLCodeSignatureErrorDomain";
+diff --git a/Squirrel/SQRLDirectoryManager.m b/Squirrel/SQRLDirectoryManager.m
+index 34f321077f0bf59de98a41dea2cea95eff72486d..200891ca73ac67754219204340881ef85aff4845 100644
+--- a/Squirrel/SQRLDirectoryManager.m
++++ b/Squirrel/SQRLDirectoryManager.m
+@@ -8,7 +8,7 @@
+ 
+ #import "SQRLDirectoryManager.h"
+ 
+-#import <ReactiveCocoa/RACSignal+Operations.h>
++#import <ReactiveObjC/RACSignal+Operations.h>
+ 
+ @implementation SQRLDirectoryManager
+ 
+diff --git a/Squirrel/SQRLDownloadedUpdate.m b/Squirrel/SQRLDownloadedUpdate.m
+index 43c64f14d4bcd1760b68ef307b90a0fac12a3c26..038b24c25f3fc90a77b7813c66064bb3c605c6a2 100644
+--- a/Squirrel/SQRLDownloadedUpdate.m
++++ b/Squirrel/SQRLDownloadedUpdate.m
+@@ -7,7 +7,7 @@
+ //
+ 
+ #import "SQRLDownloadedUpdate.h"
+-#import <ReactiveCocoa/ReactiveCocoa.h>
++#import <ReactiveObjC/ReactiveObjC.h>
+ 
+ @interface SQRLDownloadedUpdate ()
+ 
+diff --git a/Squirrel/SQRLInstaller.m b/Squirrel/SQRLInstaller.m
+index 9c4f6155fdc48e54190f189f005db25b34e8b5d4..7dd98ddee4ae0f4e01fd7aaa3486083bff7d0da1 100644
+--- a/Squirrel/SQRLInstaller.m
++++ b/Squirrel/SQRLInstaller.m
+@@ -9,13 +9,13 @@
+ #import "SQRLInstaller.h"
+ 
+ #import <libkern/OSAtomic.h>
+-#import "EXTScope.h"
+-#import <ReactiveCocoa/NSEnumerator+RACSequenceAdditions.h>
+-#import <ReactiveCocoa/NSObject+RACPropertySubscribing.h>
+-#import <ReactiveCocoa/RACCommand.h>
+-#import <ReactiveCocoa/RACSequence.h>
+-#import <ReactiveCocoa/RACSignal+Operations.h>
+-#import <ReactiveCocoa/RACSubscriber.h>
++#import <ReactiveObjC/EXTScope.h>
++#import <ReactiveObjC/NSEnumerator+RACSequenceAdditions.h>
++#import <ReactiveObjC/NSObject+RACPropertySubscribing.h>
++#import <ReactiveObjC/RACCommand.h>
++#import <ReactiveObjC/RACSequence.h>
++#import <ReactiveObjC/RACSignal+Operations.h>
++#import <ReactiveObjC/RACSubscriber.h>
+ #import <sys/xattr.h>
+ 
+ #import "NSBundle+SQRLVersionExtensions.h"
+diff --git a/Squirrel/SQRLShipItLauncher.m b/Squirrel/SQRLShipItLauncher.m
+index 2870f52510ec0993e84c6508f8e67912928b7e57..6a9151d92f399184fff9854eb00ea506165bbbe2 100644
+--- a/Squirrel/SQRLShipItLauncher.m
++++ b/Squirrel/SQRLShipItLauncher.m
+@@ -7,9 +7,9 @@
+ //
+ 
+ #import "SQRLShipItLauncher.h"
+-#import "EXTScope.h"
++#import <ReactiveObjC/EXTScope.h>
+ #import "SQRLDirectoryManager.h"
+-#import <ReactiveCocoa/ReactiveCocoa.h>
++#import <ReactiveObjC/ReactiveObjC.h>
+ #import <Security/Security.h>
+ #import <ServiceManagement/ServiceManagement.h>
+ #import <launch.h>
+diff --git a/Squirrel/SQRLShipItRequest.m b/Squirrel/SQRLShipItRequest.m
+index f6fd03cdbe2651c52db4cae05a442e4e53b837bf..726f91d01524e3812cb3a769db2416f6638dbca6 100644
+--- a/Squirrel/SQRLShipItRequest.m
++++ b/Squirrel/SQRLShipItRequest.m
+@@ -9,7 +9,7 @@
+ #import "SQRLShipItRequest.h"
+ 
+ #import "EXTKeyPathCoding.h"
+-#import <ReactiveCocoa/RACSignal+Operations.h>
++#import <ReactiveObjC/RACSignal+Operations.h>
+ 
+ NSString * const SQRLShipItRequestErrorDomain = @"SQRLShipItRequestErrorDomain";
+ 
+diff --git a/Squirrel/SQRLTerminationListener.m b/Squirrel/SQRLTerminationListener.m
+index d75970e19cdb661d359d077b657118da26bc336a..4ded7ebbd0cd63c1e3f319f23e0b51e03d4fd5ca 100644
+--- a/Squirrel/SQRLTerminationListener.m
++++ b/Squirrel/SQRLTerminationListener.m
+@@ -9,12 +9,12 @@
+ #import "SQRLTerminationListener.h"
+ 
+ #import "EXTKeyPathCoding.h"
+-#import <ReactiveCocoa/NSArray+RACSequenceAdditions.h>
+-#import <ReactiveCocoa/RACDisposable.h>
+-#import <ReactiveCocoa/RACScheduler.h>
+-#import <ReactiveCocoa/RACSequence.h>
+-#import <ReactiveCocoa/RACSignal+Operations.h>
+-#import <ReactiveCocoa/RACSubscriber.h>
++#import <ReactiveObjC/NSArray+RACSequenceAdditions.h>
++#import <ReactiveObjC/RACDisposable.h>
++#import <ReactiveObjC/RACScheduler.h>
++#import <ReactiveObjC/RACSequence.h>
++#import <ReactiveObjC/RACSignal+Operations.h>
++#import <ReactiveObjC/RACSubscriber.h>
+ 
+ @interface SQRLTerminationListener ()
+ 
+diff --git a/Squirrel/SQRLUpdate.m b/Squirrel/SQRLUpdate.m
+index 16ad4b6ef995e918d301cb36eda5f1f3aed86105..72ad3a3dee50c2832dd0e6063767e2ffe3cd21f5 100644
+--- a/Squirrel/SQRLUpdate.m
++++ b/Squirrel/SQRLUpdate.m
+@@ -7,7 +7,7 @@
+ //
+ 
+ #import "SQRLUpdate.h"
+-#import <ReactiveCocoa/ReactiveCocoa.h>
++#import <ReactiveObjC/ReactiveObjC.h>
+ 
+ NSString * const SQRLUpdateJSONURLKey = @"url";
+ NSString * const SQRLUpdateJSONReleaseNotesKey = @"notes";
+diff --git a/Squirrel/SQRLUpdater.h b/Squirrel/SQRLUpdater.h
+index 4ca4a1241e9e6fd027ed35ea147feb05b9e18914..b3526b246b3729a7556ca0ec348fdc08825c89ed 100644
+--- a/Squirrel/SQRLUpdater.h
++++ b/Squirrel/SQRLUpdater.h
+@@ -7,7 +7,7 @@
+ //
+ 
+ #import <Foundation/Foundation.h>
+-#import <ReactiveCocoa/ReactiveCocoa.h>
++#import <ReactiveObjC/ReactiveObjC.h>
+ 
+ // Represents the current state of the updater.
+ //
+diff --git a/Squirrel/SQRLUpdater.m b/Squirrel/SQRLUpdater.m
+index 85073b2f5d58d3e071fb6ef30598973b4d00eda8..c81c820d61da3c7d1cfd2c516147c954a5773a0c 100644
+--- a/Squirrel/SQRLUpdater.m
++++ b/Squirrel/SQRLUpdater.m
+@@ -18,8 +18,8 @@
+ #import "SQRLUpdate.h"
+ #import "SQRLZipArchiver.h"
+ #import "SQRLShipItRequest.h"
+-#import <ReactiveCocoa/EXTScope.h>
+-#import <ReactiveCocoa/ReactiveCocoa.h>
++#import <ReactiveObjC/EXTScope.h>
++#import <ReactiveObjC/ReactiveObjC.h>
+ #import <sys/mount.h>
+ 
+ NSString * const SQRLUpdaterErrorDomain = @"SQRLUpdaterErrorDomain";
+diff --git a/Squirrel/SQRLZipArchiver.m b/Squirrel/SQRLZipArchiver.m
+index f84127f642516078249925953e97621909265deb..478509cdd528db4fcfa340c6f93fa58a446957e6 100644
+--- a/Squirrel/SQRLZipArchiver.m
++++ b/Squirrel/SQRLZipArchiver.m
+@@ -7,8 +7,8 @@
+ //
+ 
+ #import "SQRLZipArchiver.h"
+-#import <ReactiveCocoa/EXTScope.h>
+-#import <ReactiveCocoa/ReactiveCocoa.h>
++#import <ReactiveObjC/EXTScope.h>
++#import <ReactiveObjC/ReactiveObjC.h>
+ 
+ NSString * const SQRLZipArchiverErrorDomain = @"SQRLZipArchiverErrorDomain";
+ NSString * const SQRLZipArchiverExitCodeErrorKey = @"SQRLZipArchiverExitCodeErrorKey";
+diff --git a/Squirrel/ShipIt-main.m b/Squirrel/ShipIt-main.m
+index 9db530f3642585154057143d590bb393b86dc063..b6047ea61a71b7f8c7b4d33e47adc23e2baadcee 100644
+--- a/Squirrel/ShipIt-main.m
++++ b/Squirrel/ShipIt-main.m
+@@ -8,10 +8,10 @@
+ 
+ #import <Foundation/Foundation.h>
+ 
+-#import "EXTScope.h"
+-#import <ReactiveCocoa/RACCommand.h>
+-#import <ReactiveCocoa/RACSignal+Operations.h>
+-#import <ReactiveCocoa/RACScheduler.h>
++#import <ReactiveObjC/EXTScope.h>
++#import <ReactiveObjC/RACCommand.h>
++#import <ReactiveObjC/RACSignal+Operations.h>
++#import <ReactiveObjC/RACScheduler.h>
+ 
+ #import "NSError+SQRLVerbosityExtensions.h"
+ #import "RACSignal+SQRLTransactionExtensions.h"
+diff --git a/build/xcrun.gni b/build/xcrun.gni
+new file mode 100644
+index 0000000000000000000000000000000000000000..bdfaf95f3eca65b3e0831db1b66f651dfb3c1c67
+--- /dev/null
++++ b/build/xcrun.gni
+@@ -0,0 +1,18 @@
++template("xcrun_action") {
++  assert(defined(invoker.cmd), "Need cmd name to run")
++  assert(defined(invoker.args), "Need cmd argumets")
++  assert(defined(invoker.inputs), "Need inputs")
++  assert(defined(invoker.outputs), "Need outputs")
++
++  action(target_name) {
++    forward_variables_from(invoker,
++                           [
++                             "deps",
++                             "public_deps",
++                             "inputs",
++                             "outputs",
++                           ])
++    script = "//third_party/squirrel.mac/build/xcrun.py"
++    args = [ invoker.cmd ] + invoker.args
++  }
++}
+diff --git a/build/xcrun.py b/build/xcrun.py
+new file mode 100644
+index 0000000000000000000000000000000000000000..20d0cdb51cc933f56b7a7193c195457e82500870
+--- /dev/null
++++ b/build/xcrun.py
+@@ -0,0 +1,14 @@
++#!/usr/bin/env python
++from __future__ import print_function
++import os
++import subprocess
++import sys
++
++SOURCE_ROOT = os.path.dirname(os.path.dirname(__file__))
++cmd = "xcrun"
++args = [cmd] + sys.argv[1:]
++try:
++    subprocess.check_output(args, stderr=subprocess.STDOUT)
++except subprocess.CalledProcessError as e:
++    print("xcrun script '" + sys.argv[2] + "' failed with code '" + str(e.returncode) + "':\n" + e.output)
++    sys.exit(e.returncode)
+diff --git a/filenames.gni b/filenames.gni
+new file mode 100644
+index 0000000000000000000000000000000000000000..3c224342a31f52fa2ba432983291340767d60ff7
+--- /dev/null
++++ b/filenames.gni
+@@ -0,0 +1,245 @@
++squirrel_filenames = {
++  headers = [
++    "Squirrel/NSBundle+SQRLVersionExtensions.h",
++    "Squirrel/NSError+SQRLVerbosityExtensions.h",
++    "Squirrel/NSProcessInfo+SQRLVersionExtensions.h",
++    "Squirrel/RACSignal+SQRLTransactionExtensions.h",
++    "Squirrel/SQRLAuthorization.h",
++    "Squirrel/SQRLCodeSignature.h",
++    "Squirrel/SQRLDirectoryManager.h",
++    "Squirrel/SQRLDownloadedUpdate.h",
++    "Squirrel/SQRLShipItLauncher.h",
++    "Squirrel/SQRLShipItRequest.h",
++    "Squirrel/SQRLUpdate.h",
++    "Squirrel/SQRLUpdater.h",
++    "Squirrel/SQRLZipArchiver.h",
++    "Squirrel/Squirrel.h",
++  ]
++
++  sources = [
++    "Squirrel/NSBundle+SQRLVersionExtensions.m",
++    "Squirrel/NSError+SQRLVerbosityExtensions.m",
++    "Squirrel/NSProcessInfo+SQRLVersionExtensions.m",
++    "Squirrel/RACSignal+SQRLTransactionExtensions.m",
++    "Squirrel/SQRLAuthorization.m",
++    "Squirrel/SQRLCodeSignature.m",
++    "Squirrel/SQRLDirectoryManager.m",
++    "Squirrel/SQRLDownloadedUpdate.h",
++    "Squirrel/SQRLDownloadedUpdate.m",
++    "Squirrel/SQRLShipItLauncher.h",
++    "Squirrel/SQRLShipItLauncher.m",
++    "Squirrel/SQRLShipItRequest.h",
++    "Squirrel/SQRLShipItRequest.m",
++    "Squirrel/SQRLUpdate.h",
++    "Squirrel/SQRLUpdate.m",
++    "Squirrel/SQRLUpdater.h",
++    "Squirrel/SQRLUpdater.m",
++    "Squirrel/SQRLZipArchiver.h",
++    "Squirrel/SQRLZipArchiver.m",
++    "Squirrel/Squirrel.h",
++  ]
++}
++
++mantle_filenames = {
++  headers = [
++    "vendor/Mantle/Mantle/MTLJSONAdapter.h",
++    "vendor/Mantle/Mantle/MTLManagedObjectAdapter.h",
++    "vendor/Mantle/Mantle/MTLModel+NSCoding.h",
++    "vendor/Mantle/Mantle/MTLModel.h",
++    "vendor/Mantle/Mantle/MTLReflection.h",
++    "vendor/Mantle/Mantle/MTLValueTransformer.h",
++    "vendor/Mantle/Mantle/Mantle.h",
++    "vendor/Mantle/Mantle/NSArray+MTLManipulationAdditions.h",
++    "vendor/Mantle/Mantle/NSDictionary+MTLManipulationAdditions.h",
++    "vendor/Mantle/Mantle/NSError+MTLModelException.h",
++    "vendor/Mantle/Mantle/NSObject+MTLComparisonAdditions.h",
++    "vendor/Mantle/Mantle/NSValueTransformer+MTLInversionAdditions.h",
++    "vendor/Mantle/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.h",
++    "vendor/Mantle/Mantle/extobjc/MTLEXTKeyPathCoding.h",
++    "vendor/Mantle/Mantle/extobjc/MTLEXTRuntimeExtensions.h",
++    "vendor/Mantle/Mantle/extobjc/MTLEXTScope.h",
++    "vendor/Mantle/Mantle/extobjc/metamacros.h",
++  ]
++
++  sources = [
++    "vendor/Mantle/Mantle/MTLJSONAdapter.m",
++    "vendor/Mantle/Mantle/MTLManagedObjectAdapter.m",
++    "vendor/Mantle/Mantle/MTLModel+NSCoding.m",
++    "vendor/Mantle/Mantle/MTLModel.m",
++    "vendor/Mantle/Mantle/MTLReflection.m",
++    "vendor/Mantle/Mantle/MTLValueTransformer.m",
++    "vendor/Mantle/Mantle/NSArray+MTLManipulationAdditions.m",
++    "vendor/Mantle/Mantle/NSDictionary+MTLManipulationAdditions.m",
++    "vendor/Mantle/Mantle/NSError+MTLModelException.m",
++    "vendor/Mantle/Mantle/NSObject+MTLComparisonAdditions.m",
++    "vendor/Mantle/Mantle/NSValueTransformer+MTLInversionAdditions.m",
++    "vendor/Mantle/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.m",
++    "vendor/Mantle/Mantle/extobjc/MTLEXTRuntimeExtensions.m",
++    "vendor/Mantle/Mantle/extobjc/MTLEXTScope.m",
++  ]
++}
++
++reactiveobjc_filenames = {
++  public_headers = [
++    "vendor/ReactiveObjC/ReactiveObjC/NSArray+RACSequenceAdditions.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSControl+RACCommandSupport.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSControl+RACTextSignalSupport.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSData+RACSupport.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSDictionary+RACSequenceAdditions.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSEnumerator+RACSequenceAdditions.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSFileHandle+RACSupport.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSIndexSet+RACSequenceAdditions.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSInvocation+RACTypeParsing.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSNotificationCenter+RACSupport.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSObject+RACAppKitBindings.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSObject+RACDeallocating.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSObject+RACDescription.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSObject+RACKVOWrapper.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSObject+RACLifting.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSObject+RACPropertySubscribing.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSObject+RACSelectorSignal.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSSet+RACSequenceAdditions.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSString+RACKeyPathUtilities.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSString+RACSequenceAdditions.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSString+RACSupport.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSText+RACSignalSupport.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSURLConnection+RACSupport.h",
++    "vendor/ReactiveObjC/ReactiveObjC/NSUserDefaults+RACSupport.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACAnnotations.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACArraySequence.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACBehaviorSubject.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACBlockTrampoline.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACChannel.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACCommand.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACCompoundDisposable.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACDelegateProxy.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACDisposable.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACDynamicSequence.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACDynamicSignal.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACEagerSequence.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACEmptySequence.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACEmptySignal.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACErrorSignal.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACEvent.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACGroupedSignal.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACImmediateScheduler.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACIndexSetSequence.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACKVOChannel.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACKVOProxy.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACKVOTrampoline.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACMulticastConnection+Private.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACMulticastConnection.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACPassthroughSubscriber.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACQueueScheduler+Subclass.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACQueueScheduler.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACReplaySubject.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACReturnSignal.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACScheduler+Private.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACScheduler+Subclass.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACScheduler.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACScopedDisposable.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSequence.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSerialDisposable.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSignal+Operations.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSignal.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSignalSequence.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACStream+Private.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACStream.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACStringSequence.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSubject.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSubscriber+Private.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSubscriber.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSubscriptionScheduler.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACTargetQueueScheduler.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACTestScheduler.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACTuple.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACTupleSequence.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACUnarySequence.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACUnit.h",
++    "vendor/ReactiveObjC/ReactiveObjC/RACValueTransformer.h",
++    "vendor/ReactiveObjC/ReactiveObjC/ReactiveObjC.h",
++    "vendor/ReactiveObjC/ReactiveObjC/extobjc/EXTKeyPathCoding.h",
++    "vendor/ReactiveObjC/ReactiveObjC/extobjc/EXTRuntimeExtensions.h",
++    "vendor/ReactiveObjC/ReactiveObjC/extobjc/EXTScope.h",
++    "vendor/ReactiveObjC/ReactiveObjC/extobjc/metamacros.h",
++  ]
++
++  private_headers = []
++
++  sources = [
++    "vendor/ReactiveObjC/ReactiveObjC/NSArray+RACSequenceAdditions.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSControl+RACCommandSupport.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSControl+RACTextSignalSupport.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSData+RACSupport.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSDictionary+RACSequenceAdditions.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSEnumerator+RACSequenceAdditions.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSFileHandle+RACSupport.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSIndexSet+RACSequenceAdditions.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSInvocation+RACTypeParsing.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSNotificationCenter+RACSupport.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSObject+RACAppKitBindings.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSObject+RACDeallocating.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSObject+RACDescription.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSObject+RACKVOWrapper.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSObject+RACLifting.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSObject+RACPropertySubscribing.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSObject+RACSelectorSignal.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSSet+RACSequenceAdditions.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSString+RACKeyPathUtilities.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSString+RACSequenceAdditions.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSString+RACSupport.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSText+RACSignalSupport.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSURLConnection+RACSupport.m",
++    "vendor/ReactiveObjC/ReactiveObjC/NSUserDefaults+RACSupport.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACArraySequence.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACBehaviorSubject.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACBlockTrampoline.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACChannel.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACCommand.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACCompoundDisposable.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACDelegateProxy.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACDisposable.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACDynamicSequence.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACDynamicSignal.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACEagerSequence.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACEmptySequence.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACEmptySignal.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACErrorSignal.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACEvent.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACGroupedSignal.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACImmediateScheduler.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACIndexSetSequence.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACKVOChannel.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACKVOProxy.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACKVOTrampoline.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACMulticastConnection.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACPassthroughSubscriber.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACQueueScheduler.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACReplaySubject.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACReturnSignal.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACScheduler.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACScopedDisposable.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSequence.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSerialDisposable.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSignal+Operations.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSignal.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSignalSequence.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACStream.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACStringSequence.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSubject.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSubscriber.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSubscriptingAssignmentTrampoline.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACSubscriptionScheduler.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACTargetQueueScheduler.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACTestScheduler.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACTuple.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACTupleSequence.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACUnarySequence.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACUnit.m",
++    "vendor/ReactiveObjC/ReactiveObjC/RACValueTransformer.m",
++    "vendor/ReactiveObjC/ReactiveObjC/extobjc/EXTRuntimeExtensions.m",
++  ]
++}

+ 20 - 0
patches/squirrel.mac/fix_ensure_that_self_is_retained_until_the_racsignal_is_complete.patch

@@ -0,0 +1,20 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Samuel Attard <[email protected]>
+Date: Tue, 30 Jun 2020 15:38:50 -0700
+Subject: fix: ensure that self is retained until the RACSignal is complete
+
+Looks like the clang that Chromium uses is slightly smarter with ARC than whatever Squirrel was built with previously.  We now need to keep a reference to self to keep it alive into the "then" of the RACSignal.
+
+diff --git a/Squirrel/SQRLZipArchiver.m b/Squirrel/SQRLZipArchiver.m
+index 478509cdd528db4fcfa340c6f93fa58a446957e6..7c279bf73c368453bff4f922d76908c06dc378cd 100644
+--- a/Squirrel/SQRLZipArchiver.m
++++ b/Squirrel/SQRLZipArchiver.m
+@@ -134,7 +134,7 @@ const NSInteger SQRLZipArchiverShellTaskFailed = 1;
+ 			return [RACSignal
+ 				zip:@[ self.taskTerminated, self.standardErrorData ]
+ 				reduce:^(NSNumber *exitStatus, NSData *errorData) {
+-					if (exitStatus.intValue == 0) return [RACSignal empty];
++					if (exitStatus.intValue == 0) return [RACSignal return:self];
+ 
+ 					NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
+ 					userInfo[SQRLZipArchiverExitCodeErrorKey] = exitStatus;

+ 0 - 15
script/external-binaries.json

@@ -1,21 +1,6 @@
 {
   "baseUrl": "https://electron-build-tools.s3-us-west-2.amazonaws.com/build-dependencies",
   "files": [
-    {
-      "name": "Mantle.zip",
-      "platform": "darwin",
-      "sha": "f9865e115c03871b45d3a2d8734220cb147a02dace46c92f766ca5d3059281dd"
-    },
-    {
-      "name": "ReactiveCocoa.zip",
-      "platform": "darwin",
-      "sha": "8ae85cd226fa4076472bfdfcda4745b5c7edf31fbe695868068eeaf62e7fa962"
-    },
-    {
-      "name": "Squirrel.zip",
-      "platform": "darwin",
-      "sha": "e516fd5c24c0ad267fd854848b04be0552be977aa846fa7f3c65ef4618699511"
-    },
     {
       "name": "sccache-darwin-x64.zip",
       "platform": "darwin",

+ 9 - 94
script/zip_manifests/dist_zip.mac.x64.manifest

@@ -159,113 +159,28 @@ Electron.app/Contents/Frameworks/Electron Helper (Renderer).app/Contents/MacOS/
 Electron.app/Contents/Frameworks/Electron Helper (Renderer).app/Contents/MacOS/Electron Helper (Renderer)
 Electron.app/Contents/Frameworks/Electron Helper (Renderer).app/Contents/PkgInfo
 Electron.app/Contents/Frameworks/Mantle.framework/
-Electron.app/Contents/Frameworks/Mantle.framework/Headers
 Electron.app/Contents/Frameworks/Mantle.framework/Mantle
-Electron.app/Contents/Frameworks/Mantle.framework/Modules
 Electron.app/Contents/Frameworks/Mantle.framework/Resources
 Electron.app/Contents/Frameworks/Mantle.framework/Versions/
 Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/
-Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/
-Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/MTLJSONAdapter.h
-Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/MTLManagedObjectAdapter.h
-Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/MTLModel+NSCoding.h
-Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/MTLModel.h
-Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/MTLValueTransformer.h
-Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/Mantle.h
-Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/NSArray+MTLManipulationAdditions.h
-Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/NSDictionary+MTLManipulationAdditions.h
-Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/NSObject+MTLComparisonAdditions.h
-Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/NSValueTransformer+MTLInversionAdditions.h
-Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Headers/NSValueTransformer+MTLPredefinedTransformerAdditions.h
 Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Mantle
-Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Modules/
-Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Modules/module.modulemap
 Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Resources/
 Electron.app/Contents/Frameworks/Mantle.framework/Versions/A/Resources/Info.plist
 Electron.app/Contents/Frameworks/Mantle.framework/Versions/Current
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Headers
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Modules
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/ReactiveCocoa
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Resources
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/EXTKeyPathCoding.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/EXTScope.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSArray+RACSequenceAdditions.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSControl+RACCommandSupport.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSControl+RACTextSignalSupport.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSData+RACSupport.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSDictionary+RACSequenceAdditions.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSEnumerator+RACSequenceAdditions.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSFileHandle+RACSupport.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSIndexSet+RACSequenceAdditions.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSNotificationCenter+RACSupport.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSObject+RACAppKitBindings.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSObject+RACDeallocating.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSObject+RACLifting.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSObject+RACPropertySubscribing.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSObject+RACSelectorSignal.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSOrderedSet+RACSequenceAdditions.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSSet+RACSequenceAdditions.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSString+RACSequenceAdditions.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSString+RACSupport.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSText+RACSignalSupport.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSURLConnection+RACSupport.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/NSUserDefaults+RACSupport.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACBacktrace.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACBehaviorSubject.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACChannel.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACCommand.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACCompoundDisposable.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACDisposable.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACEvent.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACGroupedSignal.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACKVOChannel.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACMulticastConnection.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACQueueScheduler+Subclass.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACQueueScheduler.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACReplaySubject.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACScheduler+Subclass.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACScheduler.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACScopedDisposable.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACSequence.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACSerialDisposable.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACSignal+Operations.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACSignal.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACStream.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACSubject.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACSubscriber.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACSubscriptingAssignmentTrampoline.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACTargetQueueScheduler.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACTestScheduler.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACTuple.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/RACUnit.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/ReactiveCocoa.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Headers/metamacros.h
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Modules/
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Modules/module.modulemap
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/ReactiveCocoa
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Resources/
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/A/Resources/Info.plist
-Electron.app/Contents/Frameworks/ReactiveCocoa.framework/Versions/Current
+Electron.app/Contents/Frameworks/ReactiveObjC.framework/
+Electron.app/Contents/Frameworks/ReactiveObjC.framework/ReactiveObjC
+Electron.app/Contents/Frameworks/ReactiveObjC.framework/Resources
+Electron.app/Contents/Frameworks/ReactiveObjC.framework/Versions/
+Electron.app/Contents/Frameworks/ReactiveObjC.framework/Versions/A/
+Electron.app/Contents/Frameworks/ReactiveObjC.framework/Versions/A/ReactiveObjC
+Electron.app/Contents/Frameworks/ReactiveObjC.framework/Versions/A/Resources/
+Electron.app/Contents/Frameworks/ReactiveObjC.framework/Versions/A/Resources/Info.plist
+Electron.app/Contents/Frameworks/ReactiveObjC.framework/Versions/Current
 Electron.app/Contents/Frameworks/Squirrel.framework/
-Electron.app/Contents/Frameworks/Squirrel.framework/Headers
-Electron.app/Contents/Frameworks/Squirrel.framework/Modules
 Electron.app/Contents/Frameworks/Squirrel.framework/Resources
 Electron.app/Contents/Frameworks/Squirrel.framework/Squirrel
 Electron.app/Contents/Frameworks/Squirrel.framework/Versions/
 Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/
-Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Headers/
-Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Headers/NSBundle+SQRLVersionExtensions.h
-Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Headers/NSProcessInfo+SQRLVersionExtensions.h
-Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Headers/SQRLDownloadedUpdate.h
-Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Headers/SQRLUpdate.h
-Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Headers/SQRLUpdater.h
-Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Headers/Squirrel.h
-Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Modules/
-Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Modules/module.modulemap
 Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Resources/
 Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Resources/Info.plist
 Electron.app/Contents/Frameworks/Squirrel.framework/Versions/A/Resources/ShipIt

+ 3 - 3
shell/browser/auto_updater_mac.mm

@@ -6,9 +6,9 @@
 
 #include <string>
 
-#import <ReactiveCocoa/NSObject+RACPropertySubscribing.h>
-#import <ReactiveCocoa/RACCommand.h>
-#import <ReactiveCocoa/RACSignal.h>
+#import <ReactiveObjC/NSObject+RACPropertySubscribing.h>
+#import <ReactiveObjC/RACCommand.h>
+#import <ReactiveObjC/RACSignal.h>
 #import <Squirrel/Squirrel.h>
 
 #include "base/bind.h"