cocoapods-catalyst-support 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/cocoapods-catalyst-support.rb +18 -0
- data/lib/cocoapods-catalyst-support/catalyst_configuration.rb +35 -0
- data/lib/cocoapods-catalyst-support/command.rb +1 -0
- data/lib/cocoapods-catalyst-support/command/catalyst.rb +37 -0
- data/lib/cocoapods-catalyst-support/command/catalyst/init.rb +18 -0
- data/lib/cocoapods-catalyst-support/command/catalyst/run.rb +13 -0
- data/lib/cocoapods-catalyst-support/command/catalyst/validate.rb +35 -0
- data/lib/cocoapods-catalyst-support/command_helpers.rb +123 -0
- data/lib/cocoapods-catalyst-support/gem_version.rb +3 -0
- data/lib/cocoapods-catalyst-support/os_platform.rb +35 -0
- data/lib/cocoapods-catalyst-support/pod/installer.rb +122 -0
- data/lib/cocoapods-catalyst-support/pod/pod_target.rb +34 -0
- data/lib/cocoapods-catalyst-support/pod/podfile.rb +15 -0
- data/lib/cocoapods-catalyst-support/pod_dependency.rb +46 -0
- data/lib/cocoapods-catalyst-support/utils.rb +31 -0
- data/lib/cocoapods-catalyst-support/xcodeproj/abstract_target.rb +69 -0
- data/lib/cocoapods-catalyst-support/xcodeproj/native_target.rb +92 -0
- data/lib/cocoapods-catalyst-support/xcodeproj/target_dependency.rb +5 -0
- data/lib/cocoapods_plugin.rb +4 -0
- metadata +121 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: fd48335575749960d7bd44d134e7baee612a6fb0f57f7b88b6269d3d5e9aac06
|
4
|
+
data.tar.gz: 95b1c1d1271bf1db00e1db8aedcbcd0ea1859f4e5029212466b201fb1c9d2091
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b51011609358a8ba97e54141b055b8e527df4de5209bf2d2dee06bbd31aebc87ccf9151c28be70f86399befc9acf8829bccfd0fdaff8389fe6a8c93595a23dd5
|
7
|
+
data.tar.gz: 21dcca268aebf42676ab90b27d3f02300f9c087179b47ccba8e62065b0ac0a601516fa31f738c5851867ec096c759408b2453059753e0fbfabb7ff52276d43e0
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'cocoapods-catalyst-support/gem_version'
|
2
|
+
require 'cocoapods'
|
3
|
+
|
4
|
+
require 'cocoapods-catalyst-support/utils'
|
5
|
+
require 'cocoapods-catalyst-support/catalyst_configuration'
|
6
|
+
|
7
|
+
require 'cocoapods-catalyst-support/pod_dependency'
|
8
|
+
require 'cocoapods-catalyst-support/os_platform'
|
9
|
+
|
10
|
+
require 'cocoapods-catalyst-support/xcodeproj/abstract_target'
|
11
|
+
require 'cocoapods-catalyst-support/xcodeproj/native_target'
|
12
|
+
require 'cocoapods-catalyst-support/xcodeproj/target_dependency'
|
13
|
+
|
14
|
+
require 'cocoapods-catalyst-support/pod/pod_target'
|
15
|
+
require 'cocoapods-catalyst-support/pod/podfile'
|
16
|
+
require 'cocoapods-catalyst-support/pod/installer'
|
17
|
+
|
18
|
+
include CocoapodsCatalystSupport
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require_relative 'utils'
|
2
|
+
|
3
|
+
module CocoapodsCatalystSupport
|
4
|
+
|
5
|
+
class CatalystConfiguration
|
6
|
+
|
7
|
+
attr_reader :ios_dependencies
|
8
|
+
attr_reader :mac_dependencies
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@ios_dependencies = Set.new
|
12
|
+
@mac_dependencies = Set.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def ios name
|
16
|
+
mac_dependencies.delete name
|
17
|
+
ios_dependencies << name
|
18
|
+
end
|
19
|
+
|
20
|
+
def macos name
|
21
|
+
ios_dependencies.delete name
|
22
|
+
mac_dependencies << name
|
23
|
+
end
|
24
|
+
|
25
|
+
def verbose!
|
26
|
+
$verbose = true
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
module Pod
|
34
|
+
$catalyst_configuration = CocoapodsCatalystSupport::CatalystConfiguration.new
|
35
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'cocoapods-catalyst-support/command/catalyst'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'colorize'
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
class Command
|
5
|
+
# This is an example of a cocoapods plugin adding a top-level subcommand
|
6
|
+
# to the 'pod' command.
|
7
|
+
#
|
8
|
+
# You can also create subcommands of existing or new commands. Say you
|
9
|
+
# wanted to add a subcommand to `list` to show newly deprecated pods,
|
10
|
+
# (e.g. `pod list deprecated`), there are a few things that would need
|
11
|
+
# to change.
|
12
|
+
#
|
13
|
+
# - move this file to `lib/pod/command/list/deprecated.rb` and update
|
14
|
+
# the class to exist in the the Pod::Command::List namespace
|
15
|
+
# - change this class to extend from `List` instead of `Command`. This
|
16
|
+
# tells the plugin system that it is a subcommand of `list`.
|
17
|
+
# - edit `lib/cocoapods_plugins.rb` to require this file
|
18
|
+
#
|
19
|
+
# @todo Create a PR to add your plugin to CocoaPods/cocoapods.org
|
20
|
+
# in the `plugins.json` file, once your plugin is released.
|
21
|
+
#
|
22
|
+
class Catalyst < Command
|
23
|
+
self.summary = 'Configure your catalyst dependencies'
|
24
|
+
|
25
|
+
self.description = <<-DESC
|
26
|
+
This plugin will set up your Podfile and create the necessary variables to configure your macCatalyst App.
|
27
|
+
See list of subcommands:
|
28
|
+
- `init`: Set up your Podfile to use `cocoapods-catalyst-support`
|
29
|
+
- `run`: Configure your catalyst dependencies
|
30
|
+
- `validate`: Validate your catalyst configuration
|
31
|
+
DESC
|
32
|
+
|
33
|
+
self.abstract_command = true
|
34
|
+
self.default_subcommand = 'run'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'cocoapods-catalyst-support/command_helpers'
|
2
|
+
|
3
|
+
include CocoapodsCatalystSupport
|
4
|
+
|
5
|
+
module Pod
|
6
|
+
class Command
|
7
|
+
class Catalyst
|
8
|
+
class Init < Catalyst
|
9
|
+
self.summary = 'Set up your Podfile to use `cocoapods-catalyst-support`'
|
10
|
+
self.arguments = []
|
11
|
+
|
12
|
+
def run
|
13
|
+
configure_podfile
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'colorize'
|
2
|
+
require 'cocoapods-catalyst-support/command_helpers'
|
3
|
+
|
4
|
+
include CocoapodsCatalystSupport
|
5
|
+
|
6
|
+
module Pod
|
7
|
+
class Command
|
8
|
+
class Catalyst
|
9
|
+
|
10
|
+
class Validate < Catalyst
|
11
|
+
|
12
|
+
self.summary = 'Validate your catalyst configuration.'
|
13
|
+
|
14
|
+
self.description = <<-DESC
|
15
|
+
Verify that the catalyst configuration you've given in your Podfile is valid and follows the guidelines.
|
16
|
+
Note that this doesn't verify your configuration is correct but it's valid.
|
17
|
+
DESC
|
18
|
+
|
19
|
+
self.arguments = []
|
20
|
+
|
21
|
+
def run
|
22
|
+
begin
|
23
|
+
validate_podfile
|
24
|
+
rescue ValidationError => e
|
25
|
+
puts e.message
|
26
|
+
else
|
27
|
+
puts "Congratulations! Your catalyst configuration is valid.".green
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'colorize'
|
2
|
+
require_relative 'utils'
|
3
|
+
|
4
|
+
module CocoapodsCatalystSupport
|
5
|
+
|
6
|
+
class ValidationError < StandardError
|
7
|
+
end
|
8
|
+
|
9
|
+
Podfile = String
|
10
|
+
|
11
|
+
class Podfile
|
12
|
+
def pods
|
13
|
+
lookup 'pod'
|
14
|
+
end
|
15
|
+
|
16
|
+
def ios_pods
|
17
|
+
lookup 'ios'
|
18
|
+
end
|
19
|
+
|
20
|
+
def mac_pods
|
21
|
+
lookup 'macos'
|
22
|
+
end
|
23
|
+
|
24
|
+
def validate
|
25
|
+
errors = []
|
26
|
+
ios_failures = ios_pods.filter do |pod| !pods.include? pod end
|
27
|
+
unless ios_failures.empty?
|
28
|
+
errors << "- Unrecognized dependencies for iOS:\n#{ios_failures.map do |pod| " + #{pod}" end.join("\n") }".red
|
29
|
+
end
|
30
|
+
|
31
|
+
mac_failures = mac_pods.filter do |pod| !pods.include? pod end
|
32
|
+
unless mac_failures.empty?
|
33
|
+
errors << "- Unrecognized dependencies for macOS:\n#{mac_failures.map do |pod| " + #{pod}" end.join("\n") }".red
|
34
|
+
end
|
35
|
+
|
36
|
+
return errors
|
37
|
+
end
|
38
|
+
|
39
|
+
@private
|
40
|
+
def lookup key
|
41
|
+
results = scan(/^[\s]*#{key}\s+[('|")][\S]*[('|")]/).map do |match|
|
42
|
+
match.gsub!('/\s+/', ' ' )
|
43
|
+
pod_name = match.split(' ')[1]
|
44
|
+
pod_name.gsub! /[('|")]/, ''
|
45
|
+
pod_name
|
46
|
+
end
|
47
|
+
return results
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def configure_podfile
|
52
|
+
podfile = File.read('Podfile')
|
53
|
+
|
54
|
+
unless podfile.include? "require 'cocoapods-catalyst-support'"
|
55
|
+
podfile = "require 'cocoapods-catalyst-support'\n\n" + podfile
|
56
|
+
end
|
57
|
+
|
58
|
+
config = ''
|
59
|
+
unless podfile.match(/catalyst_configuration\s+do/)
|
60
|
+
config += "\n# Configure your macCatalyst dependencies\n"
|
61
|
+
config += "catalyst_configuration do\n"
|
62
|
+
config += "\t# Uncomment the next line for a verbose output\n\t# verbose!\n\n"
|
63
|
+
config += "\t# ios '<pod_name>' # This dependency will only be available for iOS\n"
|
64
|
+
config += "\t# macos '<pod_name>' # This dependency will only be available for macOS\nend\n"
|
65
|
+
end
|
66
|
+
|
67
|
+
is_catalyst_configured = podfile.match(/post_install[\S\s]+installer[\S\s]configure_catalyst/)
|
68
|
+
changed = !(is_catalyst_configured && config.empty?)
|
69
|
+
unless podfile.match /post_install\s+do/
|
70
|
+
podfile += config
|
71
|
+
podfile += "\n# Configure your macCatalyst App\npost_install do |installer|\n\tinstaller.configure_catalyst\nend\n"
|
72
|
+
else
|
73
|
+
configure_line = (podfile.include? 'configure_catalyst') ? "" : "\n\tinstaller.configure_catalyst\n"
|
74
|
+
post_install_line = podfile.filter_lines do |line| line.include? 'post_install' end.first
|
75
|
+
|
76
|
+
if config.empty?
|
77
|
+
new_post_install_line = post_install_line + configure_line
|
78
|
+
else
|
79
|
+
new_post_install_line = "#{config}\n\n" + post_install_line + configure_line
|
80
|
+
end
|
81
|
+
|
82
|
+
podfile.gsub! post_install_line, new_post_install_line
|
83
|
+
end
|
84
|
+
|
85
|
+
unless podfile.nil?
|
86
|
+
File.open('Podfile', "w") { |file| file << podfile }
|
87
|
+
end
|
88
|
+
|
89
|
+
if changed
|
90
|
+
puts 'Done! Checkout your Podfile to start configuring your macCatalyst dependencies'
|
91
|
+
else
|
92
|
+
puts 'It seems your Podfile is ready. Go ahead and start configuring your macCatalyst dependencies'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def validate_podfile
|
97
|
+
podfile = File.read('Podfile')
|
98
|
+
errors = []
|
99
|
+
|
100
|
+
unless podfile.match(/require\s+[('|")]cocoapods-catalyst-support[('|")]/)
|
101
|
+
errors << "- Are you missing `require cocoapods-catalyst-support` in your Podfile".red
|
102
|
+
end
|
103
|
+
|
104
|
+
unless podfile.match(/catalyst_configuration\s+do/)
|
105
|
+
errors << "- Are you missing `require cocoapods-catalyst-support` in your Podfile".red
|
106
|
+
end
|
107
|
+
|
108
|
+
unless podfile.match(/post_install[\S\s]+installer[\S\s]configure_catalyst/)
|
109
|
+
errors << "- Are you calling `configure_catalyst` from `post_install` phase?".red
|
110
|
+
end
|
111
|
+
|
112
|
+
pod_errors = podfile.validate
|
113
|
+
unless pod_errors.empty?
|
114
|
+
errors << "#{pod_errors.reduce('') do |acc, s| "#{acc}\n#{s}" end }"
|
115
|
+
end
|
116
|
+
|
117
|
+
unless errors.empty?
|
118
|
+
raise ValidationError.new "Your catalyst configuration seems to have some errors:\n#{errors.join}"
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module CocoapodsCatalystSupport
|
2
|
+
|
3
|
+
class OSPlatform
|
4
|
+
attr_reader :name
|
5
|
+
attr_reader :sdk
|
6
|
+
attr_reader :sdk_root
|
7
|
+
attr_reader :filter
|
8
|
+
|
9
|
+
def self.ios
|
10
|
+
OSPlatform.new :ios, 'iphone*', 'iPhoneOS', 'ios'
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.macos
|
14
|
+
OSPlatform.new :macos, 'macosx*', 'MacOS', 'maccatalyst'
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.watchos
|
18
|
+
OSPlatform.new :watchos, 'watchos*', 'WatchOS', 'watchos'
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.tvos
|
22
|
+
OSPlatform.new :tvos, 'appletvos*', 'AppleTVOS', 'tvos'
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def initialize(name, sdk, sdk_root, filter)
|
27
|
+
@name = name
|
28
|
+
@sdk = sdk
|
29
|
+
@sdk_root = sdk_root
|
30
|
+
@filter = filter
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'colorize'
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
|
5
|
+
class Installer
|
6
|
+
|
7
|
+
def configure_catalyst
|
8
|
+
catalyst_pods_to_remove = $catalyst_configuration.ios_dependencies
|
9
|
+
if !catalyst_pods_to_remove.empty?
|
10
|
+
remove_dependencies catalyst_pods_to_remove, OSPlatform.macos, OSPlatform.ios
|
11
|
+
end
|
12
|
+
|
13
|
+
ios_pods_to_remove = $catalyst_configuration.mac_dependencies
|
14
|
+
if !ios_pods_to_remove.empty?
|
15
|
+
remove_dependencies ios_pods_to_remove, OSPlatform.ios, OSPlatform.macos
|
16
|
+
end
|
17
|
+
|
18
|
+
unless ios_pods_to_remove.empty? && catalyst_pods_to_remove.empty?
|
19
|
+
puts "Catalyst => Done! Your Catalyst dependencies are ready to go".green
|
20
|
+
else
|
21
|
+
puts "Catalyst => Nothing to configure"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def remove_dependencies pod_names_to_remove, remove_platform, keep_platform
|
27
|
+
|
28
|
+
loggs "\n#### Configuring #{remove_platform.name} dependencies ####\n"
|
29
|
+
|
30
|
+
###### Variable definition ######
|
31
|
+
all_pods = podfile.dependencies.flat_map do |d| [d.name, d.to_root_dependency.name] end.to_set.to_a.map do |s| s.sub('/', '') end
|
32
|
+
pod_names_to_remove = podfile.dependencies.filter do |d| pod_names_to_remove.include? d.name end.flat_map do |d| [d.name, d.to_root_dependency.name] end.map do |s| s.sub('/', '') end
|
33
|
+
pod_names_to_keep = all_pods.filter do |name| !pod_names_to_remove.include? name end
|
34
|
+
$verbose = (defined? podfile.debug) ? podfile.debug : $verbose
|
35
|
+
|
36
|
+
pod_names_to_keep = recursive_dependencies(pod_names_to_keep)
|
37
|
+
pod_targets_to_keep = pod_targets.filter do |pod| pod_names_to_keep.include? pod.module_name end # PodTarget
|
38
|
+
|
39
|
+
pod_names_to_remove = recursive_dependencies(pod_names_to_remove).filter do |name| !pod_names_to_keep.include? name end
|
40
|
+
pod_targets_to_remove = pod_targets.filter do |pod| pod_names_to_remove.include? pod.module_name end # PodTarget
|
41
|
+
|
42
|
+
loggs "\n#### Unsupported Libraries ####\n#{pod_names_to_remove}\n"
|
43
|
+
|
44
|
+
targets_to_remove = pods_project.targets.filter do |target| pod_names_to_remove.include?(target.module_name) end.filter do |target| target.platform_name == OSPlatform.ios.name end # AbstractTarget
|
45
|
+
pods_targets = pods_project.targets.filter do |target| target.name.start_with? "Pods-" end.filter do |target| target.platform_name == OSPlatform.ios.name end # AbstractTarget
|
46
|
+
targets_to_keep = pods_project.targets.filter do |target| !targets_to_remove.include?(target) && !pods_targets.include?(target) end.filter do |target| target.platform_name == OSPlatform.ios.name end # AbstractTarget
|
47
|
+
|
48
|
+
###### Determine which dependencies should be removed ######
|
49
|
+
dependencies_to_keep = targets_to_keep.reduce([]) do |dependencies, target| dependencies + target.other_linker_flags_dependencies end
|
50
|
+
dependencies_to_keep = dependencies_to_keep + targets_to_keep.flat_map do |target| target.to_dependency end + pod_targets_to_keep.flat_map do |pod| pod.vendor_products + pod.frameworks end
|
51
|
+
|
52
|
+
dependencies_to_remove = targets_to_remove.reduce([]) do |dependencies, target| dependencies + target.other_linker_flags_dependencies end
|
53
|
+
dependencies_to_remove = dependencies_to_remove + targets_to_remove.flat_map do |target| target.to_dependency end + pod_targets_to_remove.flat_map do |pod| pod.vendor_products + pod.frameworks end
|
54
|
+
dependencies_to_remove = dependencies_to_remove.filter do |d| !dependencies_to_keep.include? d end
|
55
|
+
|
56
|
+
###### CATALYST NOT SUPPORTED LINKS ######
|
57
|
+
unsupported_links = dependencies_to_remove.map do |d| d.link end.to_set.to_a
|
58
|
+
|
59
|
+
loggs "\n#### Unsupported dependencies ####\n"
|
60
|
+
loggs "#{dependencies_to_remove.map do |d| d.name end.to_set.to_a }\n\n"
|
61
|
+
|
62
|
+
###### CATALYST NOT SUPPORTED FRAMEWORKS AND RESOURCES
|
63
|
+
frameworks_to_uninstall = dependencies_to_remove.filter do |d| d.type == :framework || d.type == :weak_framework end.map do |d| "#{d.name}.framework" end
|
64
|
+
resources_to_uninstall = pod_targets_to_remove.flat_map do |pod| pod.resources end.to_set.to_a
|
65
|
+
|
66
|
+
loggs "#### Frameworks not to be included in the Archive ####\n"
|
67
|
+
loggs "#{frameworks_to_uninstall}\n\n"
|
68
|
+
|
69
|
+
loggs "#### Resources not to be included in the Archive ####\n"
|
70
|
+
loggs "#{resources_to_uninstall}\n\n"
|
71
|
+
|
72
|
+
###### OTHER LINKER FLAGS -> to iphone* ######
|
73
|
+
loggs "#### Flagging unsupported libraries ####"
|
74
|
+
pods_project.targets.filter do |target| target.platform_name == OSPlatform.ios.name end.each do |target| target.flag_libraries unsupported_links, keep_platform end
|
75
|
+
|
76
|
+
###### BUILD_PHASES AND DEPENDENCIES -> PLATFORM_FILTER 'ios' ######
|
77
|
+
loggs "\n#### Filtering build phases ####"
|
78
|
+
targets_to_remove.filter do |target|
|
79
|
+
pods_project.native_targets.include? target
|
80
|
+
end.each do |target|
|
81
|
+
loggs "\tTarget: #{target.name}"
|
82
|
+
target.add_platform_filter_to_build_phases keep_platform
|
83
|
+
target.add_platform_filter_to_dependencies keep_platform
|
84
|
+
end
|
85
|
+
|
86
|
+
loggs "\n#### Filtering dependencies ####"
|
87
|
+
targets_to_remove.filter do |target|
|
88
|
+
!pods_project.native_targets.include? target
|
89
|
+
end.each do |target|
|
90
|
+
loggs "\tTarget: #{target.name}"
|
91
|
+
target.add_platform_filter_to_dependencies keep_platform
|
92
|
+
end
|
93
|
+
|
94
|
+
###### FRAMEWORKS AND RESOURCES SCRIPT -> if [ "$SDKROOT" != "MacOS" ]; then #######
|
95
|
+
loggs "\n#### Changing frameworks and resources script ####"
|
96
|
+
pods_targets.each do |target|
|
97
|
+
loggs "\tTarget: #{target.name}"
|
98
|
+
loggs "\t\t-Uninstalling frameworks"
|
99
|
+
target.uninstall_frameworks frameworks_to_uninstall, remove_platform
|
100
|
+
|
101
|
+
loggs "\t\t-Uninstalling resources"
|
102
|
+
target.uninstall_resources resources_to_uninstall, remove_platform
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def recursive_dependencies to_filter_names
|
107
|
+
targets = pods_project.targets
|
108
|
+
targets_to_remove = pods_project.targets.filter do |target| to_filter_names.include? target.module_name end
|
109
|
+
dependencies = targets_to_remove.flat_map do |target| target.dependencies end
|
110
|
+
dependencies_names = dependencies.map do |d| d.module_name end
|
111
|
+
|
112
|
+
if dependencies.empty?
|
113
|
+
return to_filter_names + dependencies_names
|
114
|
+
else
|
115
|
+
return to_filter_names + recursive_dependencies(dependencies_names)
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Pod
|
2
|
+
class PodTarget
|
3
|
+
|
4
|
+
#build_settings[:debug].other_ldflags
|
5
|
+
include CocoapodsCatalystSupport::TargetUtils
|
6
|
+
|
7
|
+
def resources
|
8
|
+
resources = file_accessors.flat_map do |accessor| accessor.resources end.map do |path| "#{path.basename}" end
|
9
|
+
bundles = file_accessors.flat_map do |accessor| accessor.resource_bundles end.flat_map do |dic| dic.keys end.map do |s| s + ".bundle" end
|
10
|
+
return resources + bundles
|
11
|
+
end
|
12
|
+
|
13
|
+
def vendor_products
|
14
|
+
return file_accessors.flat_map do |accessor|
|
15
|
+
accessor.vendored_frameworks + accessor.vendored_libraries
|
16
|
+
end.map do |s| s.basename
|
17
|
+
end.map do |s|
|
18
|
+
name = "#{s}"
|
19
|
+
if name.include? "framework"
|
20
|
+
PodDependency.newFramework name.sub(".framework", "").sub(".xcframework", "")
|
21
|
+
else
|
22
|
+
PodDependency.newLibrary name.sub("lib", "").sub(".a", "")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def frameworks
|
28
|
+
return file_accessors.flat_map do |accessor|
|
29
|
+
accessor.spec_consumer.frameworks.map do |name| PodDependency.newFramework name end + accessor.spec_consumer.libraries.map do |name| PodDependency.newLibrary name end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'cocoapods-catalyst-support/catalyst_configuration.rb'
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
class Podfile
|
5
|
+
module DSL
|
6
|
+
def catalyst_configuration &block
|
7
|
+
$catalyst_configuration.instance_eval &block
|
8
|
+
end
|
9
|
+
|
10
|
+
def debug!
|
11
|
+
$verbose = true
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module CocoapodsCatalystSupport
|
2
|
+
|
3
|
+
class PodDependency
|
4
|
+
attr_reader :name
|
5
|
+
attr_reader :type
|
6
|
+
|
7
|
+
def link
|
8
|
+
case type
|
9
|
+
when :weak_framework
|
10
|
+
return "-weak_framework \"#{name}\""
|
11
|
+
when :library
|
12
|
+
return "-l\"#{name}\""
|
13
|
+
else
|
14
|
+
return "-framework \"#{name}\""
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.newWeakFramework name
|
19
|
+
return PodDependency.new(name, :weak_framework)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.newFramework name
|
23
|
+
return PodDependency.new(name, :framework)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.newLibrary name
|
27
|
+
return PodDependency.new(name, :library)
|
28
|
+
end
|
29
|
+
|
30
|
+
def ==(other)
|
31
|
+
(name == other.name) && (type == other.type)
|
32
|
+
end
|
33
|
+
|
34
|
+
def eql?(other)
|
35
|
+
self == other
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def initialize(name, type)
|
40
|
+
@name = name
|
41
|
+
@type = type
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class String
|
2
|
+
def filter_lines
|
3
|
+
lines = []
|
4
|
+
each_line do |line|
|
5
|
+
if yield line
|
6
|
+
lines = lines + [line]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
return lines
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module CocoapodsCatalystSupport
|
14
|
+
|
15
|
+
$verbose = false
|
16
|
+
|
17
|
+
def loggs string
|
18
|
+
if $verbose
|
19
|
+
puts string
|
20
|
+
end
|
21
|
+
return
|
22
|
+
end
|
23
|
+
|
24
|
+
module TargetUtils
|
25
|
+
def module_name
|
26
|
+
string = name.clone.gsub! /(-(iOS([0-9]+(\.[0-9])?)*|library|framework))*$/, ''
|
27
|
+
return string.nil? ? name : string
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Xcodeproj::Project::Object
|
2
|
+
class AbstractTarget
|
3
|
+
|
4
|
+
include CocoapodsCatalystSupport::TargetUtils
|
5
|
+
|
6
|
+
###### STEP 2 ######
|
7
|
+
# In all targets (aggregates + native), filter dependencies
|
8
|
+
def add_platform_filter_to_dependencies platform
|
9
|
+
loggs "\t\t- Filtering dependencies"
|
10
|
+
dependencies.each do |dependency|
|
11
|
+
dependency.platform_filter = platform.name.to_s
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
###### STEP 3 ######
|
16
|
+
# If any unsupported library, then flag as platform-dependant for every build configuration
|
17
|
+
def flag_libraries libraries, platform
|
18
|
+
loggs "\tTarget: #{name}"
|
19
|
+
build_configurations.filter do |config| !config.base_configuration_reference.nil?
|
20
|
+
end.each do |config|
|
21
|
+
loggs "\t\tScheme: #{config.name}"
|
22
|
+
xcconfig_path = config.base_configuration_reference.real_path
|
23
|
+
xcconfig = File.read(xcconfig_path)
|
24
|
+
|
25
|
+
changed = false
|
26
|
+
libraries.each do |framework|
|
27
|
+
if xcconfig.include? framework
|
28
|
+
xcconfig.gsub!(framework, '')
|
29
|
+
unless xcconfig.include? "OTHER_LDFLAGS[sdk=#{platform.sdk}]"
|
30
|
+
changed = true
|
31
|
+
xcconfig += "\nOTHER_LDFLAGS[sdk=#{platform.sdk}] = $(inherited) -ObjC "
|
32
|
+
end
|
33
|
+
xcconfig += framework + ' '
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
File.open(xcconfig_path, "w") { |file| file << xcconfig }
|
38
|
+
loggs "\t\t\t#{changed ? "Succeded" : "Nothing to flag"}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_dependency
|
43
|
+
# We return both as we don't know if build as library or framework
|
44
|
+
return [PodDependency.newFramework(module_name), PodDependency.newLibrary(name)]
|
45
|
+
end
|
46
|
+
|
47
|
+
# Dependencies contained in Other Linker Flags
|
48
|
+
def other_linker_flags_dependencies
|
49
|
+
config = build_configurations.filter do |config| not config.base_configuration_reference.nil? end.first
|
50
|
+
other_ldflags = config.resolve_build_setting 'OTHER_LDFLAGS'
|
51
|
+
|
52
|
+
if other_ldflags.nil?
|
53
|
+
return []
|
54
|
+
end
|
55
|
+
|
56
|
+
if other_ldflags.class == String
|
57
|
+
other_ldflags = other_ldflags.split ' '
|
58
|
+
end
|
59
|
+
|
60
|
+
libraries = other_ldflags.filter do |flag| flag.start_with? '-l' end.map do |flag| flag.gsub! /(["|\-l]*)/, '' end.map do |name| PodDependency.newLibrary name end
|
61
|
+
mixed_frameworks = other_ldflags.filter do |flag| !flag.start_with? '-l' end
|
62
|
+
|
63
|
+
weak_frameworks = mixed_frameworks.length.times.filter do |i| mixed_frameworks[i].include? 'weak_framework' end.map do |i| PodDependency.newWeakFramework(mixed_frameworks[i+1].gsub! '"', '') end
|
64
|
+
frameworks = mixed_frameworks.length.times.select do |i| mixed_frameworks[i].match /^([^{weak_}]*)framework$/ end.map do |i| PodDependency.newFramework(mixed_frameworks[i+1].gsub! '"', '') end
|
65
|
+
|
66
|
+
return libraries + frameworks + weak_frameworks
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Xcodeproj::Project::Object
|
2
|
+
|
3
|
+
class PBXNativeTarget
|
4
|
+
|
5
|
+
###### STEP 4 ######
|
6
|
+
# In "Pods-" targets, modify "*frameworks.sh" to not install unsupported frameworks for SDK
|
7
|
+
def uninstall_frameworks frameworks, platform
|
8
|
+
uninstall frameworks, "#{name}-frameworks.sh", platform.sdk_root
|
9
|
+
end
|
10
|
+
|
11
|
+
###### STEP 5 ######
|
12
|
+
# In "Pods-" targets, modify "*resources.sh" to not install unsupported resources for SDK
|
13
|
+
def uninstall_resources resources, platform
|
14
|
+
uninstall resources, "#{name}-resources.sh", platform.sdk_root
|
15
|
+
end
|
16
|
+
|
17
|
+
def support_files_folder
|
18
|
+
build_configurations.filter do |config| not config.base_configuration_reference.nil? end.first.base_configuration_reference.real_path.parent
|
19
|
+
end
|
20
|
+
|
21
|
+
@private
|
22
|
+
def uninstall keys, file_name, sdk_root
|
23
|
+
configurations = build_configurations.map do |b| b.name end
|
24
|
+
keys = keys.to_set.to_a
|
25
|
+
loggs "\t\t\tUninstalling for configurations: #{configurations}"
|
26
|
+
if support_files_folder.nil?
|
27
|
+
loggs "\t\t\tNothing to uninstall"
|
28
|
+
return
|
29
|
+
end
|
30
|
+
|
31
|
+
script_path = support_files_folder.join file_name
|
32
|
+
if !script_path.exist?
|
33
|
+
loggs "\t\t\tNothing to uninstall"
|
34
|
+
return
|
35
|
+
end
|
36
|
+
|
37
|
+
script = File.read(script_path)
|
38
|
+
snippets = script.scan(/if \[\[ \"\$CONFIGURATION\" [\S\s]*?(?=fi\n)fi/)
|
39
|
+
archs_condition = "[[ \"$SDKROOT\" != *\"#{sdk_root}\"* ]]"
|
40
|
+
file_condition_format = 'if [ -d "%s" ]; then'
|
41
|
+
changed = false
|
42
|
+
|
43
|
+
snippets.each do |snippet|
|
44
|
+
new_snippet = snippet.clone
|
45
|
+
should_uninstall = configurations.map do |string| snippet.include? string end.reduce(false) do |total, condition| total = total || condition end
|
46
|
+
keys.each do |key|
|
47
|
+
lines_to_replace = snippet.filter_lines do |line| line.include? "#{key}" end.to_set.to_a
|
48
|
+
unless lines_to_replace.empty?
|
49
|
+
changed = true
|
50
|
+
lines_to_replace.each do |line|
|
51
|
+
if should_uninstall
|
52
|
+
new_snippet.gsub! line, "\tif #{archs_condition}; then \n\t#{line}\tfi\n"
|
53
|
+
elsif file_name.include? 'resources'
|
54
|
+
path = line.scan(/[^(install_resource| |")].*[^*("|\n)]/).first
|
55
|
+
file_condition = file_condition_format % path
|
56
|
+
new_snippet.gsub! line, "\t#{file_condition} \n\t#{line}\tfi\n"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
script.gsub! snippet, new_snippet
|
62
|
+
end
|
63
|
+
|
64
|
+
if changed
|
65
|
+
File.open(script_path, "w") { |file| file << script }
|
66
|
+
end
|
67
|
+
loggs "\t\t\t#{changed ? "Succeded" : "Nothing to uninstall"}"
|
68
|
+
end
|
69
|
+
|
70
|
+
###### STEP 1 ######
|
71
|
+
# In native target's build phases, add platform filter to:
|
72
|
+
# - Resources
|
73
|
+
# - Compile Sources
|
74
|
+
# - Frameworks
|
75
|
+
# - Headers
|
76
|
+
def add_platform_filter_to_build_phases platform
|
77
|
+
loggs "\t\t- Filtering resources"
|
78
|
+
resources_build_phase.files.to_a.map do |build_file| build_file.platform_filter = platform.filter end
|
79
|
+
|
80
|
+
loggs "\t\t- Filtering compile sources"
|
81
|
+
source_build_phase.files.to_a.map do |build_file| build_file.platform_filter = platform.filter end
|
82
|
+
|
83
|
+
loggs "\t\t- Filtering frameworks"
|
84
|
+
frameworks_build_phase.files.to_a.map do |build_file| build_file.platform_filter = platform.filter end
|
85
|
+
|
86
|
+
loggs "\t\t- Filtering headers"
|
87
|
+
headers_build_phase.files.to_a.map do |build_file| build_file.platform_filter = platform.filter end
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cocoapods-catalyst-support
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- fermoya
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-02-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: colorize
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.8'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.8'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: cocoapods
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.9'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.9'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '10.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '10.0'
|
69
|
+
description: Helps you configure your Catalyst dependencies.
|
70
|
+
email:
|
71
|
+
- fmdr.ct@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- lib/cocoapods-catalyst-support.rb
|
77
|
+
- lib/cocoapods-catalyst-support/catalyst_configuration.rb
|
78
|
+
- lib/cocoapods-catalyst-support/command.rb
|
79
|
+
- lib/cocoapods-catalyst-support/command/catalyst.rb
|
80
|
+
- lib/cocoapods-catalyst-support/command/catalyst/init.rb
|
81
|
+
- lib/cocoapods-catalyst-support/command/catalyst/run.rb
|
82
|
+
- lib/cocoapods-catalyst-support/command/catalyst/validate.rb
|
83
|
+
- lib/cocoapods-catalyst-support/command_helpers.rb
|
84
|
+
- lib/cocoapods-catalyst-support/gem_version.rb
|
85
|
+
- lib/cocoapods-catalyst-support/os_platform.rb
|
86
|
+
- lib/cocoapods-catalyst-support/pod/installer.rb
|
87
|
+
- lib/cocoapods-catalyst-support/pod/pod_target.rb
|
88
|
+
- lib/cocoapods-catalyst-support/pod/podfile.rb
|
89
|
+
- lib/cocoapods-catalyst-support/pod_dependency.rb
|
90
|
+
- lib/cocoapods-catalyst-support/utils.rb
|
91
|
+
- lib/cocoapods-catalyst-support/xcodeproj/abstract_target.rb
|
92
|
+
- lib/cocoapods-catalyst-support/xcodeproj/native_target.rb
|
93
|
+
- lib/cocoapods-catalyst-support/xcodeproj/target_dependency.rb
|
94
|
+
- lib/cocoapods_plugin.rb
|
95
|
+
homepage: https://github.com/fermoya/CatalystPodSupport
|
96
|
+
licenses:
|
97
|
+
- MIT
|
98
|
+
metadata: {}
|
99
|
+
post_install_message:
|
100
|
+
rdoc_options: []
|
101
|
+
require_paths:
|
102
|
+
- lib
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '2.6'
|
108
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
requirements: []
|
114
|
+
rubygems_version: 3.0.3
|
115
|
+
signing_key:
|
116
|
+
specification_version: 4
|
117
|
+
summary: Many libraries you may use for iOS won't compile for your macCatalyst App,
|
118
|
+
thus, making porting your App to the Mac world more difficult than initially expected.
|
119
|
+
This is due to those libraries not being compiled for `x86_64`. `cocoapods-catalyst-support`
|
120
|
+
helps you configure which libraries you'll be using for iOS and which for macCatalyst.
|
121
|
+
test_files: []
|