xcframework_converter 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 261230f022e462a9840a009590e212c543833902b44795f80476971ff828dae7
4
- data.tar.gz: 5a383fe7e654d79ea3d292a6369e4ba1d1b177c03f8967c9d6ec4fca2d942563
3
+ metadata.gz: 105e63e07d147cd791c478f9351e73e1f71bbd861160b5a1391d99c7c0affc9d
4
+ data.tar.gz: cf2e6a358aeb0a7018d06a2bf48382ab01d768eb870589da0abddab7044278e3
5
5
  SHA512:
6
- metadata.gz: c284b721156bc30b0e818d8048513c023c2e931cb659d7211959f356c08f36f133a61494078edb35b24b490ccd6b15b5c71d7c61b1a42b6da14adab664517700
7
- data.tar.gz: 2be83f317ea5fa0e2e108ac81cbfbfaf1095c5738559555fafabcf0f215efaf1c08308f6f01b6fd337b1a190bc319367c7634e6a00a73a0ccbf029edd7471683
6
+ metadata.gz: fe005277c05790de2d906188fbc0ab3818b9dd27980bf68bdeb2e56ec3ef2f0184fc61224ddeb32c29689ad316f3179eb51dd4a3345bf423bdd7cd5d75569697
7
+ data.tar.gz: '0805b456eebbfc655bd5991c001b241b29bf614f154615be67be7124d3bc1fc95532a0612647ac1d56e05d10373c97c7f6e14489adb68481e24e6b5a03ff89c6'
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
- # XcframeworkConverter
2
-
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/xcframework_converter`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
1
+ # XCFrameworkConverter
2
+ [![Gem](https://img.shields.io/gem/v/xcframework_converter.svg)](https://rubygems.org/gems/xcframework_converter)
3
+ [![Twitter: @igormaka](https://img.shields.io/badge/contact-@igormaka-blue.svg?style=flat)](https://twitter.com/igormaka)
4
+ [![License](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](./LICENSE.txt)
6
5
 
6
+ This little gem allows to take an ancient `.framework` (static or dynamic), and turn it into a fully fledged `.xcframework`. In addition, it will patch the binary to add an `arm64` simulator slice. There's also a CocoaPods patcher that allows this to operate without customizing the `Podfile` dependencies.
7
7
  ## Installation
8
8
 
9
9
  Add this line to your application's Gemfile:
@@ -22,17 +22,40 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- TODO: Write usage instructions here
25
+ ### CLI
26
+
27
+ ```bash
28
+ xcfconvert <path/to/Framework.framework>
29
+ ```
30
+
31
+ ### CocoaPods
32
+ In your podfile:
33
+ ```ruby
34
+ require 'xcframework_converter'
35
+ # Define your dependencies...
36
+ pre_install do |installer|
37
+ XCFrameworkConverter.convert_frameworks_to_xcframeworks!(installer)
38
+ end
39
+ ```
40
+
41
+ This will achieve two things:
42
+
43
+ 1. When a pod with vendored `.framework`-s is added, they will be converted to `.xcframework`-s.
44
+ 2. Upon each `pod install`, the corresponding pod specifications will be patched so that the project will consume the `.xcframework`-s correctly.
45
+
46
+ ## Is it reliable?
47
+ Sort of. The software is provided as is, with no guarantees of correctnes. It's meant to be a workaround. For the correct solution, ask the framework vendor for an update. However, PRs are welcome.
26
48
 
27
- ## Development
49
+ ## How does it work?
50
+ An XCFramework is basically a bundle of folders.
28
51
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
52
+ The tool will create the folder and its subfolders, write the correct `Info.plist`, and clean up the relevant fat binary files so that they contain only the relevant architectures.
30
53
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
54
+ Additionally, the tool will create a new, patched `arm64` binary for the iOS Simulator. For that, it uses the code and knowledge of [Bogo Giertler](https://github.com/bogo). The binary patching code is embedded in the gem. For more info, check Bogo's blog for the posts on how to patch a [static library](https://bogo.wtf/arm64-to-sim.html) and a [dynamic library](https://bogo.wtf/arm64-to-sim-dylibs.html).
32
55
 
33
56
  ## Contributing
34
57
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/xcframework_converter. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/xcframework_converter/blob/master/CODE_OF_CONDUCT.md).
58
+ Pull requests are welcome on GitHub at https://github.com/igor-makarov/XCFrameworkConverter. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/igor-makarov/XCFrameworkConverter/blob/master/CODE_OF_CONDUCT.md).
36
59
 
37
60
  ## License
38
61
 
@@ -40,4 +63,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
40
63
 
41
64
  ## Code of Conduct
42
65
 
43
- Everyone interacting in the XcframeworkConverter project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/xcframework_converter/blob/master/CODE_OF_CONDUCT.md).
66
+ Everyone interacting in the XcframeworkConverter project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/igor-makarov/XCFrameworkConverter/blob/master/CODE_OF_CONDUCT.md).
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cocoapods'
4
+ require 'cocoapods/xcode/xcframework'
5
+ require 'fileutils'
6
+ require 'xcodeproj'
7
+
8
+ # rubocop:disable Metrics/AbcSize
9
+
10
+ module XCFrameworkConverter
11
+ # Patches a binary (static or dynamic), turning an arm64-device into an arm64-simualtor.
12
+ # For more info:
13
+ # static libs: https://bogo.wtf/arm64-to-sim.html
14
+ # dylibs: https://bogo.wtf/arm64-to-sim-dylibs.html
15
+ module ArmPatcher
16
+ class << self
17
+ def patch_arm_binary(slice)
18
+ require 'macho'
19
+
20
+ case slice.build_type.linkage
21
+ when :dynamic
22
+ patch_arm_binary_dynamic(slice)
23
+ when :static
24
+ patch_arm_binary_static(slice)
25
+ end
26
+
27
+ slice.path.glob('**/arm64*.swiftinterface').each do |interface_file|
28
+ `sed -i '' -E 's/target arm64-apple-ios([0-9.]+) /target arm64-apple-ios\\1-simulator /g' "#{interface_file}"`
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def patch_arm_binary_dynamic(slice)
35
+ extracted_path = slice.path.join('arm64.dylib')
36
+ `xcrun lipo \"#{slice.binary_path}\" -thin arm64 -output \"#{extracted_path}\"`
37
+
38
+ file = MachO::MachOFile.new(extracted_path)
39
+ sdk_version = file[:LC_VERSION_MIN_IPHONEOS].first.version_string
40
+ `xcrun vtool -arch arm64 -set-build-version 7 #{sdk_version} #{sdk_version} -replace -output \"#{extracted_path}\" \"#{extracted_path}\"`
41
+ `xcrun lipo \"#{slice.binary_path}\" -replace arm64 \"#{extracted_path}\" -output \"#{slice.binary_path}\"`
42
+ extracted_path.rmtree
43
+ end
44
+
45
+ def arm2sim_path
46
+ Pathname.new(__FILE__).dirname.join('../arm2sim.swift')
47
+ end
48
+
49
+ def patch_arm_binary_static(slice)
50
+ extracted_path = slice.path.join('arm64.a')
51
+ `xcrun lipo \"#{slice.binary_path}\" -thin arm64 -output \"#{extracted_path}\"`
52
+ extracted_path_dir = slice.path.join('arm64-objects')
53
+ extracted_path_dir.mkdir
54
+ `cd \"#{extracted_path_dir}\" ; ar x \"#{extracted_path}\"`
55
+ Dir[extracted_path_dir.join('*.o')].each do |object_file|
56
+ file = MachO::MachOFile.new(object_file)
57
+ sdk_version = file[:LC_VERSION_MIN_IPHONEOS].first.version_string.to_i
58
+ `xcrun swift \"#{arm2sim_path}\" \"#{object_file}\" \"#{sdk_version}\" \"#{sdk_version}\"`
59
+ end
60
+ `cd \"#{extracted_path_dir}\" ; ar crv \"#{extracted_path}\" *.o`
61
+
62
+ `xcrun lipo \"#{slice.binary_path}\" -replace arm64 \"#{extracted_path}\" -output \"#{slice.binary_path}\"`
63
+ extracted_path_dir.rmtree
64
+ extracted_path.rmtree
65
+ end
66
+
67
+ public
68
+
69
+ def cleanup_unused_archs(slice)
70
+ supported_archs = slice.supported_archs
71
+ unsupported_archs = `xcrun lipo \"#{slice.binary_path}\" -archs`.split - supported_archs
72
+ unsupported_archs.each do |arch|
73
+ `xcrun lipo \"#{slice.binary_path}\" -remove \"#{arch}\" -output \"#{slice.binary_path}\"`
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'arm_patcher'
4
+ require_relative 'xcframework_ext'
5
+
6
+ require 'cocoapods'
7
+ require 'cocoapods/xcode/xcframework'
8
+ require 'fileutils'
9
+ require 'xcodeproj'
10
+
11
+ # rubocop:disable Metrics/AbcSize
12
+
13
+ # Converts a framework (static or dynamic) to an XCFramework, adding an arm64 simulator patch.
14
+ # For more info:
15
+ # static libs: https://bogo.wtf/arm64-to-sim.html
16
+ # dylibs: https://bogo.wtf/arm64-to-sim-dylibs.html
17
+ module XCFrameworkConverter
18
+ class << self
19
+ def plist_template_path
20
+ Pathname.new(__FILE__).dirname.join('../xcframework_template.plist')
21
+ end
22
+
23
+ def convert_framework_to_xcframework(path)
24
+ plist = Xcodeproj::Plist.read_from_path(plist_template_path)
25
+ xcframework_path = Pathname.new(path).sub_ext('.xcframework')
26
+ xcframework_path.mkdir
27
+ plist['AvailableLibraries'].each do |slice|
28
+ slice_path = xcframework_path.join(slice['LibraryIdentifier'])
29
+ slice_path.mkdir
30
+ slice['LibraryPath'] = File.basename(path)
31
+ FileUtils.cp_r(path, slice_path)
32
+ end
33
+ Xcodeproj::Plist.write_to_path(plist, xcframework_path.join('Info.plist'))
34
+ FileUtils.rm_rf(path)
35
+ final_framework = Pod::Xcode::XCFramework.open_xcframework(xcframework_path)
36
+ final_framework.slices.each do |slice|
37
+ ArmPatcher.patch_arm_binary(slice) if slice.platform == :ios && slice.platform_variant == :simulator
38
+ ArmPatcher.cleanup_unused_archs(slice)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'arm_patcher'
4
+ require_relative 'xcframework_ext'
5
+
6
+ require 'cocoapods'
7
+ require 'cocoapods/xcode/xcframework'
8
+ require 'fileutils'
9
+ require 'xcodeproj'
10
+
11
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
12
+
13
+ # Converts a framework (static or dynamic) to an XCFramework, adding an arm64 simulator patch.
14
+ # For more info:
15
+ # static libs: https://bogo.wtf/arm64-to-sim.html
16
+ # dylibs: https://bogo.wtf/arm64-to-sim-dylibs.html
17
+ module XCFrameworkConverter
18
+ class << self
19
+ def patch_xcframework(xcframework_path)
20
+ xcframework = Pod::Xcode::XCFramework.open_xcframework(xcframework_path)
21
+
22
+ return nil if xcframework.slices.any? do |slice|
23
+ slice.platform == :ios &&
24
+ slice.platform_variant == :simulator &&
25
+ slice.supported_archs.include?('arm64')
26
+ end
27
+
28
+ original_arm_slice_identifier = xcframework.slices.find do |slice|
29
+ slice.platform == :ios && slice.supported_archs.include?('arm64')
30
+ end.identifier
31
+
32
+ patched_arm_slice_identifier = 'ios-arm64-simulator'
33
+
34
+ STDERR.puts "Will patch #{xcframework_path}: #{original_arm_slice_identifier} -> #{patched_arm_slice_identifier}"
35
+
36
+ plist = xcframework.plist
37
+ slice_plist_to_add = plist['AvailableLibraries'].find { |s| s['LibraryIdentifier'] == original_arm_slice_identifier }.dup
38
+ slice_plist_to_add['LibraryIdentifier'] = patched_arm_slice_identifier
39
+ slice_plist_to_add['SupportedArchitectures'] = ['arm64']
40
+ slice_plist_to_add['SupportedPlatformVariant'] = 'simulator'
41
+ plist['AvailableLibraries'] << slice_plist_to_add
42
+
43
+ FileUtils.rm_rf(xcframework_path.join(patched_arm_slice_identifier))
44
+ FileUtils.cp_r(xcframework_path.join(original_arm_slice_identifier), xcframework_path.join(patched_arm_slice_identifier))
45
+
46
+ Xcodeproj::Plist.write_to_path(plist, xcframework_path.join('Info.plist'))
47
+
48
+ xcframework = Pod::Xcode::XCFramework.open_xcframework(xcframework_path)
49
+
50
+ slice = xcframework.slices.find { |s| s.identifier == patched_arm_slice_identifier }
51
+
52
+ ArmPatcher.patch_arm_binary(slice)
53
+ ArmPatcher.cleanup_unused_archs(slice)
54
+
55
+ xcframework_path
56
+ end
57
+ end
58
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module XCFrameworkConverter
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cocoapods'
4
+ require 'cocoapods/xcode/xcframework'
5
+
6
+ module Pod
7
+ module Xcode
8
+ # open XCFramework
9
+ class XCFramework
10
+ def self.open_xcframework(xcframework_path)
11
+ if instance_method(:initialize).arity == 2
12
+ new(File.basename(xcframework_path), xcframework_path.realpath)
13
+ else
14
+ new(xcframework_path.realpath)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'xcframework_converter/creation'
4
+ require_relative 'xcframework_converter/patching'
3
5
  require_relative 'xcframework_converter/version'
4
6
 
5
7
  require 'cocoapods'
@@ -17,108 +19,56 @@ module XCFrameworkConverter
17
19
  class << self
18
20
  def convert_frameworks_to_xcframeworks!(installer)
19
21
  installer.analysis_result.specifications.each do |spec|
20
- next unless spec.attributes_hash['vendored_frameworks']
21
-
22
- frameworks = Array(spec.attributes_hash['vendored_frameworks'])
23
- unconverted_frameworks = frameworks.select { |f| File.extname(f) == '.framework' }
24
- next if unconverted_frameworks.empty?
25
- next if spec.local?
22
+ next if spec.source && spec.local?
26
23
 
27
24
  pod_path = installer.sandbox.pod_dir(Pod::Specification.root_name(spec.name))
28
- convert_xcframeworks_if_present(pod_path)
29
25
 
30
- converted_frameworks = unconverted_frameworks.map do |path|
31
- Pathname.new(path).sub_ext('.xcframework').to_s
32
- end
33
- spec.attributes_hash['vendored_frameworks'] = frameworks - unconverted_frameworks + converted_frameworks
34
- # some pods put these as a way to NOT support arm64 sim
35
- spec.attributes_hash['pod_target_xcconfig']&.delete('EXCLUDED_ARCHS[sdk=iphonesimulator*]')
36
- spec.attributes_hash['user_target_xcconfig']&.delete('EXCLUDED_ARCHS[sdk=iphonesimulator*]')
37
- end
38
- end
26
+ xcframeworks_to_patch = spec.available_platforms.map do |platform|
27
+ consumer = Pod::Specification::Consumer.new(spec, platform)
28
+ consumer.vendored_frameworks.select { |f| File.extname(f) == '.xcframework' }
29
+ .map { |f| pod_path.join(f) }
30
+ end.flatten.uniq
39
31
 
40
- def convert_xcframeworks_if_present(pod_path)
41
- unconverted_paths = Dir[pod_path.join('**/*.framework')] - Dir[pod_path.join('**/*.xcframework/**/*')]
42
- unconverted_paths.each do |path|
43
- convert_framework_to_xcframework(path)
44
- end
45
- end
32
+ patch_xcframeworks_if_needed(spec, xcframeworks_to_patch)
46
33
 
47
- def plist_template_path
48
- Pathname.new(__FILE__).dirname.join('xcframework_template.plist')
49
- end
34
+ frameworks_to_convert = spec.available_platforms.map do |platform|
35
+ consumer = Pod::Specification::Consumer.new(spec, platform)
36
+ before_rename = consumer.vendored_frameworks.select { |f| File.extname(f) == '.framework' }
37
+ next [] if before_rename.empty?
50
38
 
51
- def convert_framework_to_xcframework(path)
52
- plist = Xcodeproj::Plist.read_from_path(plist_template_path)
53
- xcframework_path = Pathname.new(path).sub_ext('.xcframework')
54
- xcframework_path.mkdir
55
- plist['AvailableLibraries'].each do |slice|
56
- slice_path = xcframework_path.join(slice['LibraryIdentifier'])
57
- slice_path.mkdir
58
- slice['LibraryPath'] = File.basename(path)
59
- FileUtils.cp_r(path, slice_path)
60
- end
61
- Xcodeproj::Plist.write_to_path(plist, xcframework_path.join('Info.plist'))
62
- FileUtils.rm_rf(path)
63
- final_framework = Pod::Xcode::XCFramework.new(xcframework_path.realpath)
64
- final_framework.slices.each do |slice|
65
- patch_arm_binary(slice) if slice.platform == :ios && slice.platform_variant == :simulator
66
- cleanup_unused_archs(slice)
67
- end
68
- end
39
+ after_rename = before_rename.map { |f| Pathname.new(f).sub_ext('.xcframework').to_s }
40
+ proxy = Pod::Specification::DSL::PlatformProxy.new(spec, platform.symbolic_name)
41
+ proxy.vendored_frameworks = consumer.vendored_frameworks - before_rename + after_rename
42
+ before_rename.map { |f| pod_path.join(f) }
43
+ end.flatten.uniq
69
44
 
70
- def patch_arm_binary(slice)
71
- require 'macho'
72
-
73
- case slice.build_type.linkage
74
- when :dynamic
75
- patch_arm_binary_dynamic(slice)
76
- when :static
77
- patch_arm_binary_static(slice)
45
+ convert_xcframeworks_if_present(spec, frameworks_to_convert)
78
46
  end
79
47
  end
80
48
 
81
- def patch_arm_binary_dynamic(slice)
82
- extracted_path = slice.path.join('arm64.dylib')
83
- `xcrun lipo \"#{slice.binary_path}\" -thin arm64 -output \"#{extracted_path}\"`
84
-
85
- file = MachO::MachOFile.new(extracted_path)
86
- sdk_version = file[:LC_VERSION_MIN_IPHONEOS].first.version_string
87
- `xcrun vtool -arch arm64 -set-build-version 7 #{sdk_version} #{sdk_version} -replace -output \"#{extracted_path}\" \"#{extracted_path}\"`
88
- `xcrun lipo \"#{slice.binary_path}\" -replace arm64 \"#{extracted_path}\" -output \"#{slice.binary_path}\"`
89
- extracted_path.rmtree
90
- end
91
-
92
- def arm2sim_path
93
- Pathname.new(__FILE__).dirname.join('arm2sim.swift')
49
+ def convert_xcframeworks_if_present(spec, frameworks_to_convert)
50
+ frameworks_to_convert.each do |path|
51
+ convert_framework_to_xcframework(path) if Dir.exist?(path)
52
+ end
53
+ remove_troublesome_xcconfig_items(spec) unless frameworks_to_convert.empty?
94
54
  end
95
55
 
96
- def patch_arm_binary_static(slice)
97
- extracted_path = slice.path.join('arm64.a')
98
- `xcrun lipo \"#{slice.binary_path}\" -thin arm64 -output \"#{extracted_path}\"`
99
- extracted_path_dir = slice.path.join('arm64-objects')
100
- extracted_path_dir.mkdir
101
- `cd \"#{extracted_path_dir}\" ; ar x \"#{extracted_path}\"`
102
- Dir[extracted_path_dir.join('*.o')].each do |object_file|
103
- file = MachO::MachOFile.new(object_file)
104
- sdk_version = file[:LC_VERSION_MIN_IPHONEOS].first.version_string.to_i
105
- `xcrun swift \"#{arm2sim_path}\" \"#{object_file}\" \"#{sdk_version}\" \"#{sdk_version}\"`
106
- end
107
- `cd \"#{extracted_path_dir}\" ; ar crv \"#{extracted_path}\" *.o`
56
+ def patch_xcframeworks_if_needed(spec, xcframeworks)
57
+ patched = xcframeworks.map do |path|
58
+ next nil unless Dir.exist?(path)
108
59
 
109
- `xcrun lipo \"#{slice.binary_path}\" -replace arm64 \"#{extracted_path}\" -output \"#{slice.binary_path}\"`
110
- extracted_path_dir.rmtree
111
- extracted_path.rmtree
60
+ patch_xcframework(path)
61
+ end.compact
62
+ remove_troublesome_xcconfig_items(spec) unless patched.empty?
112
63
  end
113
64
 
114
- def cleanup_unused_archs(slice)
115
- supported_archs = slice.supported_archs
116
- unsupported_archs = `xcrun lipo \"#{slice.binary_path}\" -archs`.split - supported_archs
117
- unsupported_archs.each do |arch|
118
- `xcrun lipo \"#{slice.binary_path}\" -remove \"#{arch}\" -output \"#{slice.binary_path}\"`
119
- end
65
+ def remove_troublesome_xcconfig_items(spec)
66
+ # some pods put these as a way to NOT support arm64 sim
67
+ # may stop working if a pod decides to put these in a platform proxy
68
+ spec.attributes_hash['pod_target_xcconfig']&.delete('EXCLUDED_ARCHS[sdk=iphonesimulator*]')
69
+ spec.attributes_hash['user_target_xcconfig']&.delete('EXCLUDED_ARCHS[sdk=iphonesimulator*]')
70
+ spec.attributes_hash['pod_target_xcconfig']&.delete('VALID_ARCHS[sdk=iphonesimulator*]')
71
+ spec.attributes_hash['user_target_xcconfig']&.delete('VALID_ARCHS[sdk=iphonesimulator*]')
120
72
  end
121
73
  end
122
74
  end
123
-
124
- # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xcframework_converter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Makarov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-19 00:00:00.000000000 Z
11
+ date: 2022-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cocoapods
@@ -63,7 +63,11 @@ files:
63
63
  - bin/xcfconvert
64
64
  - lib/arm2sim.swift
65
65
  - lib/xcframework_converter.rb
66
+ - lib/xcframework_converter/arm_patcher.rb
67
+ - lib/xcframework_converter/creation.rb
68
+ - lib/xcframework_converter/patching.rb
66
69
  - lib/xcframework_converter/version.rb
70
+ - lib/xcframework_converter/xcframework_ext.rb
67
71
  - lib/xcframework_template.plist
68
72
  homepage: https://github.com/igor-makarov/XCFrameworkConverter
69
73
  licenses: