xcframework_converter 0.5.0 → 0.6.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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77324350e0b69d68739d71e4e2bd510b2c46e82076d82c066eb1af2ab7019ff0
|
4
|
+
data.tar.gz: dd8c817ba142772da87f18c46fffe50f32e2bad22d4bb8a9e3101650b38818a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7a7693803108e192822db1f4ab0de16bed32d4dc134dd3a69b1b6e54eab4e185e4d466d0626ecd46adc4c0bee677de8a9b8ca28d99485a0f5975147133cd94b
|
7
|
+
data.tar.gz: 59a9cac8d54309ddd9efea3901425ad5499cccac741cd6d35cb4a493794a8cf35d083ad63ba6e0528065cd717ee1521c7a8794cd445d2093813f65336af9209e
|
@@ -104,7 +104,7 @@ public enum Transmogrifier {
|
|
104
104
|
return datas.merge()
|
105
105
|
}
|
106
106
|
|
107
|
-
private static func
|
107
|
+
private static func createLcBuildVersion(minos: UInt32, sdk: UInt32) -> Data {
|
108
108
|
var command = build_version_command(cmd: UInt32(LC_BUILD_VERSION),
|
109
109
|
cmdsize: UInt32(MemoryLayout<build_version_command>.stride),
|
110
110
|
platform: UInt32(PLATFORM_IOSSIMULATOR),
|
@@ -115,6 +115,15 @@ public enum Transmogrifier {
|
|
115
115
|
return Data(bytes: &command, count: MemoryLayout<build_version_command>.stride)
|
116
116
|
}
|
117
117
|
|
118
|
+
private static func updateLcBuildVersion(_ data: Data, minos: UInt32, sdk: UInt32) -> Data {
|
119
|
+
var command: build_version_command = data.asStruct()
|
120
|
+
command.platform = UInt32(PLATFORM_IOSSIMULATOR)
|
121
|
+
command.minos = minos << 16 | 0 << 8 | 0
|
122
|
+
command.sdk = sdk << 16 | 0 << 8 | 0
|
123
|
+
|
124
|
+
return Data(bytes: &command, count: data.count)
|
125
|
+
}
|
126
|
+
|
118
127
|
private static func updateDataInCode(_ data: Data, _ offset: UInt32) -> Data {
|
119
128
|
var command: linkedit_data_command = data.asStruct()
|
120
129
|
command.dataoff += offset
|
@@ -154,8 +163,6 @@ public enum Transmogrifier {
|
|
154
163
|
}
|
155
164
|
|
156
165
|
if contains_LC_VERSION_MIN_IPHONEOS {
|
157
|
-
// `offset` is kind of a magic number here, since we know that's the only meaningful change to binary size
|
158
|
-
// having a dynamic `offset` requires two passes over the load commands and is left as an exercise to the reader
|
159
166
|
return updatePreiOS12ObjectFile
|
160
167
|
} else {
|
161
168
|
return updatePostiOS12ObjectFile
|
@@ -167,7 +174,7 @@ public enum Transmogrifier {
|
|
167
174
|
let cmd = Int32(bitPattern: lc.loadCommand)
|
168
175
|
switch cmd {
|
169
176
|
case LC_BUILD_VERSION:
|
170
|
-
return
|
177
|
+
return updateLcBuildVersion(lc, minos: minos, sdk: sdk)
|
171
178
|
default:
|
172
179
|
return lc
|
173
180
|
}
|
@@ -182,28 +189,25 @@ public enum Transmogrifier {
|
|
182
189
|
case LC_SEGMENT_64:
|
183
190
|
return updateSegment64(lc, offset)
|
184
191
|
case LC_VERSION_MIN_IPHONEOS:
|
185
|
-
return
|
192
|
+
return createLcBuildVersion(minos: minos, sdk: sdk)
|
186
193
|
case LC_DATA_IN_CODE, LC_LINKER_OPTIMIZATION_HINT:
|
187
194
|
return updateDataInCode(lc, offset)
|
188
195
|
case LC_SYMTAB:
|
189
196
|
return updateSymTab(lc, offset)
|
190
197
|
case LC_BUILD_VERSION:
|
191
|
-
|
198
|
+
fatalError("pre-12 object file shold not contain LC_BUILD_VERSION!")
|
192
199
|
default:
|
193
200
|
return lc
|
194
201
|
}
|
195
202
|
}
|
196
203
|
|
197
204
|
static func updateDylibFile(lc: Data, minos: UInt32, sdk: UInt32) -> Data {
|
198
|
-
// `offset` is kind of a magic number here, since we know that's the only meaningful change to binary size
|
199
|
-
// having a dynamic `offset` requires two passes over the load commands and is left as an exercise to the reader
|
200
|
-
let offset = UInt32(abs(MemoryLayout<build_version_command>.stride - MemoryLayout<version_min_command>.stride))
|
201
205
|
let cmd = Int32(bitPattern: lc.loadCommand)
|
202
206
|
guard cmd != LC_BUILD_VERSION else {
|
203
207
|
fatalError("This arm64 binary already contains an LC_BUILD_VERSION load command!")
|
204
208
|
}
|
205
209
|
if cmd == LC_VERSION_MIN_IPHONEOS {
|
206
|
-
return
|
210
|
+
return createLcBuildVersion(minos: minos, sdk: sdk)
|
207
211
|
}
|
208
212
|
return lc
|
209
213
|
}
|
@@ -37,9 +37,8 @@ module XCFrameworkConverter
|
|
37
37
|
extracted_path = slice.path.join('arm64.dylib')
|
38
38
|
`xcrun lipo \"#{slice.binary_path}\" -thin arm64 -output \"#{extracted_path}\"`
|
39
39
|
|
40
|
-
|
41
|
-
sdk_version
|
42
|
-
`xcrun vtool -arch arm64 -set-build-version 7 #{sdk_version} #{sdk_version} -replace -output \"#{extracted_path}\" \"#{extracted_path}\"`
|
40
|
+
minos_version, sdk_version = version_strings(extracted_path).map(&:to_i)
|
41
|
+
`xcrun vtool -arch arm64 -set-build-version 7 #{minos_version} #{sdk_version} -replace -output \"#{extracted_path}\" \"#{extracted_path}\"`
|
43
42
|
`xcrun lipo \"#{slice.binary_path}\" -replace arm64 \"#{extracted_path}\" -output \"#{slice.binary_path}\"`
|
44
43
|
extracted_path.rmtree
|
45
44
|
end
|
@@ -63,36 +62,61 @@ module XCFrameworkConverter
|
|
63
62
|
`xcrun lipo \"#{slice.binary_path}\" -thin arm64 -output \"#{extracted_path}\"`
|
64
63
|
extracted_path_dir = slice.path.join('arm64-objects')
|
65
64
|
extracted_path_dir.mkdir
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
65
|
+
if macho_file_type(extracted_path) == :object
|
66
|
+
patch_object_file(extracted_path)
|
67
|
+
else
|
68
|
+
object_files = `ar t \"#{extracted_path}\"`.split("\n").map(&:chomp).sort
|
69
|
+
.select { |o| o.end_with?('.o') }
|
70
|
+
.group_by(&:itself).transform_values(&:count)
|
71
|
+
processed_files = []
|
72
|
+
index = 0
|
73
|
+
while object_files.any?
|
74
|
+
object_files.keys.each do |object_file|
|
75
|
+
file_shard = Digest::MD5.hexdigest(object_file).to_s[0..2]
|
76
|
+
file_dir = extracted_path_dir.join("#{index}-#{file_shard}")
|
77
|
+
file_path = file_dir.join(object_file)
|
78
|
+
file_dir.mkdir unless file_dir.exist?
|
79
|
+
`ar p \"#{extracted_path}\" \"#{object_file}\" > \"#{file_path}\"`
|
80
|
+
patch_object_file(file_path)
|
81
|
+
$stderr.printf '.'
|
82
|
+
processed_files << file_path
|
83
|
+
end
|
84
|
+
`ar d \"#{extracted_path}\" #{object_files.keys.map(&:shellescape).join(' ')}`
|
85
|
+
$stderr.printf '#'
|
86
|
+
object_files.reject! { |_, count| count <= index + 1 }
|
87
|
+
index += 1
|
83
88
|
end
|
84
|
-
|
85
|
-
|
86
|
-
object_files.reject! { |_, count| count <= index + 1 }
|
87
|
-
index += 1
|
89
|
+
$stderr.puts
|
90
|
+
`cd \"#{extracted_path_dir}\" ; ar cqv \"#{extracted_path}\" #{processed_files.map(&:shellescape).join(' ')}`
|
88
91
|
end
|
89
|
-
$stderr.puts
|
90
|
-
`cd \"#{extracted_path_dir}\" ; ar cqv \"#{extracted_path}\" #{processed_files.map(&:shellescape).join(' ')}`
|
91
92
|
`xcrun lipo \"#{slice.binary_path}\" -replace arm64 \"#{extracted_path}\" -output \"#{slice.binary_path}\"`
|
92
93
|
extracted_path_dir.rmtree
|
93
94
|
extracted_path.rmtree
|
94
95
|
end
|
95
96
|
|
97
|
+
def macho_file_type(file_path)
|
98
|
+
MachO.open(file_path).filetype
|
99
|
+
rescue MachO::MagicError
|
100
|
+
nil
|
101
|
+
end
|
102
|
+
|
103
|
+
def patch_object_file(file_path)
|
104
|
+
minos_version, sdk_version = version_strings(file_path).map(&:to_i)
|
105
|
+
`\"#{arm2sim_path}\" \"#{file_path}\" \"#{minos_version}\" \"#{sdk_version}\"`
|
106
|
+
end
|
107
|
+
|
108
|
+
def version_strings(file_path)
|
109
|
+
macho_file = MachO::MachOFile.new(file_path)
|
110
|
+
if (version_min_command = macho_file.load_commands.find { |c| c.is_a?(MachO::LoadCommands::VersionMinCommand) })
|
111
|
+
return [version_min_command.version_string, version_min_command.sdk_string]
|
112
|
+
end
|
113
|
+
if (build_version_command = macho_file.load_commands.find { |c| c.is_a?(MachO::LoadCommands::BuildVersionCommand) })
|
114
|
+
return [build_version_command.minos_string, build_version_command.sdk_string]
|
115
|
+
end
|
116
|
+
|
117
|
+
raise "Could not find version strings in #{file_path}"
|
118
|
+
end
|
119
|
+
|
96
120
|
public
|
97
121
|
|
98
122
|
def cleanup_unused_archs(slice)
|
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.
|
4
|
+
version: 0.6.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: 2022-05-
|
11
|
+
date: 2022-05-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cocoapods
|