apple_frameworks 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/apple_frameworks/fat.rb +56 -0
- data/lib/apple_frameworks/framework.rb +1 -1
- data/lib/apple_frameworks/version.rb +1 -1
- data/lib/apple_frameworks/xcframework.rb +9 -3
- data/lib/apple_frameworks.rb +1 -0
- data/spec/fat_spec.rb +79 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2458b11ac8aa7472cacff84481f16d4b7ea95f6231353de7ae3faa0b33bc9a38
|
4
|
+
data.tar.gz: c77c610834c38fd433b16e89083e589d13fb44c92ac1adf9d710c0b9077ddd39
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c23401f609cd5e7395eefdb38a132c21103adef7e603638028874a8e965628ecdb8fd5a45c364f20d4fd107ea28149c44e7dcc2e2f0b16353cd9270e5197828d
|
7
|
+
data.tar.gz: 89328d4e21ceba6ad978353a162a5a1802d734d66d905f009f73a001d20f858a91c2d110df89ce985beac5a341e730fb3cf6c141a251b049da27b626e7523324
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module AppleFrameworks
|
2
|
+
# Creates "fat" or "universal" libraries by combining two builds of the same
|
3
|
+
# library with different architectures.
|
4
|
+
#
|
5
|
+
# Note: While it's possible (and used to be recommended) to make a fat library
|
6
|
+
# for multiple platforms (iOS simulator and device), it's no longer
|
7
|
+
# recommended to have these mixed in a single fat binary. For mixing
|
8
|
+
# platforms, use `XCFramework`.
|
9
|
+
#
|
10
|
+
class Fat
|
11
|
+
class CombineUsingLipoFailure < StandardError; end
|
12
|
+
|
13
|
+
# - parameter output_path: The path of the resulting library.
|
14
|
+
# - parameter library_paths: An array of paths to the static libraries
|
15
|
+
# (`.a` files).
|
16
|
+
#
|
17
|
+
def initialize(output_path, library_paths)
|
18
|
+
@output_path = output_path
|
19
|
+
@library_paths = library_paths
|
20
|
+
end
|
21
|
+
|
22
|
+
# Uses the `lipo -create` command to combine two or more libraries into a
|
23
|
+
# single fat library.
|
24
|
+
#
|
25
|
+
def combine_using_lipo
|
26
|
+
validations
|
27
|
+
|
28
|
+
path_args = @library_paths.join(" ")
|
29
|
+
|
30
|
+
cmd = "lipo #{path_args} -create -output #{@output_path}"
|
31
|
+
|
32
|
+
logfile = Tempfile.new(['fat', '.log'])
|
33
|
+
|
34
|
+
system("#{cmd} >#{logfile.path} 2>&1") ||
|
35
|
+
raise(CombineUsingLipoFailure.new(File.read(logfile).strip.split(/\/.*\/lipo: /).last))
|
36
|
+
ensure
|
37
|
+
if logfile
|
38
|
+
logfile.close
|
39
|
+
logfile.delete
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
|
46
|
+
def validations
|
47
|
+
if File.directory?(@output_path)
|
48
|
+
raise "Directory already exists at Fat library output_path"
|
49
|
+
end
|
50
|
+
|
51
|
+
if File.file?(@output_path)
|
52
|
+
raise "File already exists at Fat library output_path"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -26,8 +26,6 @@ module AppleFrameworks
|
|
26
26
|
# LibraryName.framework
|
27
27
|
# ```
|
28
28
|
#
|
29
|
-
# Note: Binaries with multiple platforms are not supported by Xcode.
|
30
|
-
#
|
31
29
|
class XCFramework
|
32
30
|
class BuildUsingXcodeFailure < StandardError; end
|
33
31
|
|
@@ -51,7 +49,15 @@ module AppleFrameworks
|
|
51
49
|
# Uses the `xcodebuild -create-xcframework` command to create the
|
52
50
|
# XCFramework.
|
53
51
|
#
|
54
|
-
#
|
52
|
+
# This will require Xcode and its command line tools to be installed.
|
53
|
+
#
|
54
|
+
# Xcode has a couple of notable annoyances:
|
55
|
+
#
|
56
|
+
# * Fat binaries with multiple platforms (e.g. a single binary containing
|
57
|
+
# iOS simulator x64 and iOS arm64) are not supported.
|
58
|
+
# * To include multiple architectures of the same platform (e.g. iOS
|
59
|
+
# simulator x64 and arm64), they first need to be combined as a Fat
|
60
|
+
# binary.
|
55
61
|
#
|
56
62
|
def build_using_xcode
|
57
63
|
validations
|
data/lib/apple_frameworks.rb
CHANGED
data/spec/fat_spec.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
RSpec.describe AppleFrameworks::Fat do
|
2
|
+
let(:output_path) { Bundler.root.join("tmp", "fat") }
|
3
|
+
let(:library_paths) do
|
4
|
+
[
|
5
|
+
Bundler.root.join("spec", "fixtures", "fake.a"),
|
6
|
+
Bundler.root.join("spec", "fixtures", "fake-x64.a")
|
7
|
+
]
|
8
|
+
end
|
9
|
+
let(:described_instance) { described_class.new(output_path, library_paths) }
|
10
|
+
|
11
|
+
describe "#combine_using_lipo" do
|
12
|
+
subject { described_instance.combine_using_lipo }
|
13
|
+
before { FileUtils.rm_rf(output_path) }
|
14
|
+
after { FileUtils.rm_rf(output_path) }
|
15
|
+
|
16
|
+
context "when there is already a directory in the parent_directory" do
|
17
|
+
before do
|
18
|
+
FileUtils.mkdir_p(File.join(output_path))
|
19
|
+
|
20
|
+
expect(File.directory?(output_path))
|
21
|
+
.to eq(true)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "raises an error" do
|
25
|
+
expect { subject }
|
26
|
+
.to raise_error("Directory already exists at Fat library output_path")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "when there is a file at the target parent_directory" do
|
31
|
+
before do
|
32
|
+
FileUtils.mkdir_p(Bundler.root.join("tmp"))
|
33
|
+
FileUtils.touch(output_path)
|
34
|
+
|
35
|
+
expect(File.file?(output_path))
|
36
|
+
.to eq(true)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "raises an error" do
|
40
|
+
expect { subject }
|
41
|
+
.to raise_error("File already exists at Fat library output_path")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "when there is an error from lipo" do
|
46
|
+
let(:library_paths) do
|
47
|
+
["doesnt_exist"]
|
48
|
+
end
|
49
|
+
|
50
|
+
it "raises an error" do
|
51
|
+
expect { subject }
|
52
|
+
.to raise_error(
|
53
|
+
AppleFrameworks::Fat::CombineUsingLipoFailure,
|
54
|
+
"can't open input file: doesnt_exist (No such file or directory)"
|
55
|
+
)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "when there isn't a file or directory at output_path" do
|
60
|
+
before do
|
61
|
+
expect(File.directory?(output_path))
|
62
|
+
.to eq(false)
|
63
|
+
|
64
|
+
expect(File.file?(output_path))
|
65
|
+
.to eq(false)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "creates the fat library" do
|
69
|
+
subject
|
70
|
+
|
71
|
+
expect(File.file?(output_path))
|
72
|
+
.to eq(true)
|
73
|
+
|
74
|
+
expect(`lipo -info #{output_path}`.strip)
|
75
|
+
.to end_with("are: x86_64 arm64")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apple_frameworks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Inkpen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-10-
|
11
|
+
date: 2021-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -32,9 +32,11 @@ extensions: []
|
|
32
32
|
extra_rdoc_files: []
|
33
33
|
files:
|
34
34
|
- lib/apple_frameworks.rb
|
35
|
+
- lib/apple_frameworks/fat.rb
|
35
36
|
- lib/apple_frameworks/framework.rb
|
36
37
|
- lib/apple_frameworks/version.rb
|
37
38
|
- lib/apple_frameworks/xcframework.rb
|
39
|
+
- spec/fat_spec.rb
|
38
40
|
- spec/framework_spec.rb
|
39
41
|
- spec/spec_helper.rb
|
40
42
|
- spec/xcframework_spec.rb
|