cocoapods-mtxx-bin 0.0.1
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 +7 -0
- data/LICENSE.txt +22 -0
- data/README.md +11 -0
- data/lib/cocoapods-mtxx-bin/command/bin/archive.rb +206 -0
- data/lib/cocoapods-mtxx-bin/command/bin/auto.rb +212 -0
- data/lib/cocoapods-mtxx-bin/command/bin/code.rb +232 -0
- data/lib/cocoapods-mtxx-bin/command/bin/imy.rb +45 -0
- data/lib/cocoapods-mtxx-bin/command/bin/init.rb +94 -0
- data/lib/cocoapods-mtxx-bin/command/bin/initHotKey.rb +70 -0
- data/lib/cocoapods-mtxx-bin/command/bin/install.rb +44 -0
- data/lib/cocoapods-mtxx-bin/command/bin/lib/lint.rb +67 -0
- data/lib/cocoapods-mtxx-bin/command/bin/repo/push.rb +115 -0
- data/lib/cocoapods-mtxx-bin/command/bin/repo/update.rb +42 -0
- data/lib/cocoapods-mtxx-bin/command/bin/repo.rb +14 -0
- data/lib/cocoapods-mtxx-bin/command/bin/spec/create.rb +73 -0
- data/lib/cocoapods-mtxx-bin/command/bin/spec/lint.rb +109 -0
- data/lib/cocoapods-mtxx-bin/command/bin/spec.rb +13 -0
- data/lib/cocoapods-mtxx-bin/command/bin/update.rb +154 -0
- data/lib/cocoapods-mtxx-bin/command/bin.rb +65 -0
- data/lib/cocoapods-mtxx-bin/command.rb +1 -0
- data/lib/cocoapods-mtxx-bin/config/config.rb +166 -0
- data/lib/cocoapods-mtxx-bin/config/config_asker.rb +60 -0
- data/lib/cocoapods-mtxx-bin/config/config_builder.rb +216 -0
- data/lib/cocoapods-mtxx-bin/config/config_hot_key.rb +103 -0
- data/lib/cocoapods-mtxx-bin/config/config_hot_key_asker.rb +57 -0
- data/lib/cocoapods-mtxx-bin/gem_version.rb +9 -0
- data/lib/cocoapods-mtxx-bin/helpers/Info.plist +0 -0
- data/lib/cocoapods-mtxx-bin/helpers/build_helper.rb +167 -0
- data/lib/cocoapods-mtxx-bin/helpers/build_utils.rb +64 -0
- data/lib/cocoapods-mtxx-bin/helpers/framework.rb +86 -0
- data/lib/cocoapods-mtxx-bin/helpers/framework_builder.rb +551 -0
- data/lib/cocoapods-mtxx-bin/helpers/library.rb +54 -0
- data/lib/cocoapods-mtxx-bin/helpers/library_builder.rb +90 -0
- data/lib/cocoapods-mtxx-bin/helpers/sources_helper.rb +35 -0
- data/lib/cocoapods-mtxx-bin/helpers/spec_creator.rb +170 -0
- data/lib/cocoapods-mtxx-bin/helpers/spec_files_helper.rb +80 -0
- data/lib/cocoapods-mtxx-bin/helpers/spec_source_creator.rb +304 -0
- data/lib/cocoapods-mtxx-bin/helpers/upload_helper.rb +104 -0
- data/lib/cocoapods-mtxx-bin/helpers.rb +5 -0
- data/lib/cocoapods-mtxx-bin/native/acknowledgements.rb +27 -0
- data/lib/cocoapods-mtxx-bin/native/analyzer.rb +85 -0
- data/lib/cocoapods-mtxx-bin/native/file_accessor.rb +28 -0
- data/lib/cocoapods-mtxx-bin/native/gen.rb +79 -0
- data/lib/cocoapods-mtxx-bin/native/installation_options.rb +25 -0
- data/lib/cocoapods-mtxx-bin/native/installer.rb +135 -0
- data/lib/cocoapods-mtxx-bin/native/linter.rb +26 -0
- data/lib/cocoapods-mtxx-bin/native/path_source.rb +33 -0
- data/lib/cocoapods-mtxx-bin/native/pod_source_installer.rb +19 -0
- data/lib/cocoapods-mtxx-bin/native/pod_target_installer.rb +94 -0
- data/lib/cocoapods-mtxx-bin/native/podfile.rb +91 -0
- data/lib/cocoapods-mtxx-bin/native/podfile_env.rb +37 -0
- data/lib/cocoapods-mtxx-bin/native/podfile_generator.rb +201 -0
- data/lib/cocoapods-mtxx-bin/native/podspec_finder.rb +25 -0
- data/lib/cocoapods-mtxx-bin/native/resolver.rb +238 -0
- data/lib/cocoapods-mtxx-bin/native/sandbox_analyzer.rb +34 -0
- data/lib/cocoapods-mtxx-bin/native/source.rb +35 -0
- data/lib/cocoapods-mtxx-bin/native/sources_manager.rb +19 -0
- data/lib/cocoapods-mtxx-bin/native/specification.rb +31 -0
- data/lib/cocoapods-mtxx-bin/native/target_validator.rb +41 -0
- data/lib/cocoapods-mtxx-bin/native/validator.rb +40 -0
- data/lib/cocoapods-mtxx-bin/native.rb +25 -0
- data/lib/cocoapods-mtxx-bin/source_provider_hook.rb +53 -0
- data/lib/cocoapods-mtxx-bin.rb +2 -0
- data/lib/cocoapods_plugin.rb +2 -0
- data/spec/command/bin_spec.rb +12 -0
- data/spec/spec_helper.rb +50 -0
- metadata +182 -0
@@ -0,0 +1,551 @@
|
|
1
|
+
# copy from https://github.com/CocoaPods/cocoapods-packager
|
2
|
+
|
3
|
+
require 'cocoapods-mtxx-bin/helpers/framework.rb'
|
4
|
+
require 'English'
|
5
|
+
require 'cocoapods-mtxx-bin/config/config_builder'
|
6
|
+
require 'shellwords'
|
7
|
+
|
8
|
+
module CBin
|
9
|
+
class Framework
|
10
|
+
class Builder
|
11
|
+
include Pod
|
12
|
+
#Debug下还待完成
|
13
|
+
def initialize(spec, installer, platform, source_dir, isRootSpec = true, build_model="Release")
|
14
|
+
@spec = spec
|
15
|
+
@source_dir = source_dir
|
16
|
+
@installer = installer
|
17
|
+
@platform = platform
|
18
|
+
@build_model = build_model
|
19
|
+
@isRootSpec = isRootSpec
|
20
|
+
|
21
|
+
@file_accessors = @installer.pod_targets.select { |t| t.pod_name == @spec.name }.flat_map(&:file_accessors) if installer
|
22
|
+
end
|
23
|
+
|
24
|
+
# 利用xcodebuild打包
|
25
|
+
def build
|
26
|
+
defines = compile
|
27
|
+
build_sim_libraries(defines)
|
28
|
+
|
29
|
+
defines
|
30
|
+
end
|
31
|
+
|
32
|
+
def lipo_create(defines)
|
33
|
+
# 合并静态库
|
34
|
+
merge_static_libs
|
35
|
+
# 拷贝资源文件
|
36
|
+
copy_all_resources
|
37
|
+
# 拷贝swiftmodule
|
38
|
+
copy_swiftmodules
|
39
|
+
# # 拷贝vendored_libraries
|
40
|
+
# copy_vendored_libraries
|
41
|
+
# 拷贝vendored_frameworks
|
42
|
+
copy_vendored_frameworks
|
43
|
+
# # 拷贝动态库
|
44
|
+
# copy_dynamic_libs
|
45
|
+
# # 拷贝xcframework
|
46
|
+
# copy_xcframeworks
|
47
|
+
# 拷贝最终产物
|
48
|
+
copy_target_product
|
49
|
+
# 返回Framework目录
|
50
|
+
framework
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
# 拷贝最终产物
|
56
|
+
def copy_target_product
|
57
|
+
framework
|
58
|
+
fwk = "#{build_device_dir}/#{framework_name}.framework"
|
59
|
+
`cp -r #{fwk} #{framework.root_path}`
|
60
|
+
end
|
61
|
+
|
62
|
+
# 拷贝xcframework
|
63
|
+
def copy_xcframeworks
|
64
|
+
xcframeworks = vendored_xcframeworks
|
65
|
+
unless xcframeworks.empty?
|
66
|
+
des_dir = dynamic_libs_des_dir
|
67
|
+
FileUtils.mkdir(des_dir) unless File.exist?(des_dir)
|
68
|
+
xcframeworks.map { |xcf| `cp -r #{xcf} #{des_dir}` }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# 拷贝动态库
|
73
|
+
def copy_dynamic_libs
|
74
|
+
dynamic_libs = vendored_dynamic_libraries
|
75
|
+
if dynamic_libs && dynamic_libs.size > 0
|
76
|
+
des_dir = dynamic_libs_des_dir
|
77
|
+
FileUtils.mkdir(des_dir) unless File.exist?(des_dir)
|
78
|
+
dynamic_libs.map { |lib| `cp -r #{lib} #{des_dir}` }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# 拷贝vendored_frameworks
|
83
|
+
def copy_vendored_frameworks
|
84
|
+
fwks = vendored_frameworks
|
85
|
+
unless fwks.empty?
|
86
|
+
des_dir = dynamic_libs_des_dir
|
87
|
+
FileUtils.mkdir(des_dir) unless File.exist?(des_dir)
|
88
|
+
fwks.map { |fwk| `cp -r #{fwk} #{des_dir}` }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# 拷贝vendored_libraries
|
93
|
+
def copy_vendored_libraries
|
94
|
+
libs = vendored_libraries
|
95
|
+
unless libs.empty?
|
96
|
+
des_dir = vendored_libraries_dir
|
97
|
+
FileUtils.mkdir(des_dir) unless File.exist?(des_dir)
|
98
|
+
libs.map { |lib| `cp -r #{lib} #{des_dir}` }
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# 拷贝swiftmodule
|
103
|
+
def copy_swiftmodules
|
104
|
+
swift_module = "#{build_device_dir}/#{framework_name}.framework/Modules/#{framework_name}.swiftmodule"
|
105
|
+
if File.exist?(swift_module)
|
106
|
+
src_swift = "#{build_sim_dir}/#{framework_name}.framework/Modules/#{framework_name}.swiftmodule"
|
107
|
+
`cp -af #{src_swift}/* #{swift_module}`
|
108
|
+
`cp -af #{src_swift}/Project/* #{swift_module}/Project`
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# 拷贝资源文件
|
113
|
+
def copy_all_resources
|
114
|
+
# 拷贝resource_bundles
|
115
|
+
copy_resource_bundles
|
116
|
+
# 拷贝resources/resource
|
117
|
+
copy_other_resources
|
118
|
+
end
|
119
|
+
|
120
|
+
# 拷贝resource_bundles
|
121
|
+
def copy_resource_bundles
|
122
|
+
bundles = resource_bundles
|
123
|
+
return if bundles.size == 0
|
124
|
+
des_dir = resources_des_dir
|
125
|
+
FileUtils.mkdir(des_dir) unless File.exist?(des_dir)
|
126
|
+
bundles.map { |bundle| `cp -r #{bundle} #{des_dir}` }
|
127
|
+
end
|
128
|
+
|
129
|
+
# 拷贝resources/resource
|
130
|
+
def copy_other_resources
|
131
|
+
resources = other_resources
|
132
|
+
return if resources.size == 0
|
133
|
+
des_dir = resources_des_dir
|
134
|
+
FileUtils.mkdir(des_dir) unless File.exist?(des_dir)
|
135
|
+
resources.map { |res| `cp -r #{res} #{des_dir}` }
|
136
|
+
end
|
137
|
+
|
138
|
+
# 获取podspec中的resource_bundles
|
139
|
+
def resource_bundles
|
140
|
+
return [] if @file_accessors.nil?
|
141
|
+
resource_bundles = @file_accessors.flat_map(&:resource_bundles)
|
142
|
+
return [] if resource_bundles.nil? || resource_bundles.size == 0
|
143
|
+
resource_bundles.compact.flat_map(&:keys).map { |key| "#{build_device_dir}/#{key}.bundle" }
|
144
|
+
end
|
145
|
+
|
146
|
+
# 获取podspec中resource/resources
|
147
|
+
def other_resources
|
148
|
+
return [] if @file_accessors.nil?
|
149
|
+
resources = @file_accessors.flat_map(&:resources)
|
150
|
+
return [] if resources.nil? || resources.size == 0
|
151
|
+
resources.compact.reject { |res| reject_resource_ext.include?(res.extname) }.map(&:to_s)
|
152
|
+
end
|
153
|
+
|
154
|
+
# 需要排除的资源文件后缀
|
155
|
+
def reject_resource_ext
|
156
|
+
%w[.xcdatamodeld .xcdatamodel .xcmappingmodel .xib .storyboard]
|
157
|
+
end
|
158
|
+
|
159
|
+
# 合并静态库
|
160
|
+
def merge_static_libs
|
161
|
+
# 合并真机静态库
|
162
|
+
merge_static_libs_for_device if @isRootSpec
|
163
|
+
# 合并模拟器静态库
|
164
|
+
merge_static_libs_for_sim if @isRootSpec
|
165
|
+
# 合并真机和模拟器
|
166
|
+
merge_device_sim
|
167
|
+
end
|
168
|
+
|
169
|
+
# 合并真机和模拟器
|
170
|
+
def merge_device_sim
|
171
|
+
libs = static_libs_in_sandbox + static_libs_in_sandbox(build_sim_dir)
|
172
|
+
output = "#{build_device_dir}/#{framework_name}.framework/#{framework_name}"
|
173
|
+
`lipo -create -output #{output} #{libs.join(' ')}` unless libs.empty?
|
174
|
+
end
|
175
|
+
|
176
|
+
# 合并真机静态库
|
177
|
+
def merge_static_libs_for_device
|
178
|
+
static_libs = static_libs_in_sandbox + vendored_static_libraries
|
179
|
+
return if static_libs.empty?
|
180
|
+
libs = ios_architectures.map do |arch|
|
181
|
+
library = "#{build_device_dir}/package-#{framework_name}-#{arch}.a"
|
182
|
+
`libtool -arch_only #{arch} -static -o #{library} #{static_libs.join(' ')}`
|
183
|
+
library
|
184
|
+
end
|
185
|
+
output = "#{build_device_dir}/#{framework_name}.framework/#{framework_name}"
|
186
|
+
`lipo -create -output #{output} #{libs.join(' ')}` if libs.size > 0
|
187
|
+
end
|
188
|
+
|
189
|
+
# 合并模拟器静态库
|
190
|
+
def merge_static_libs_for_sim
|
191
|
+
static_libs = static_libs_in_sandbox(build_sim_dir) + vendored_static_libraries
|
192
|
+
return if static_libs.empty?
|
193
|
+
libs = ios_architectures_sim.map do |arch|
|
194
|
+
library = "#{build_sim_dir}/package-#{framework_name}-#{arch}.a"
|
195
|
+
`libtool -arch_only #{arch} -static -o #{library} #{static_libs.join(' ')}`
|
196
|
+
library
|
197
|
+
end
|
198
|
+
output = "#{build_sim_dir}/#{framework_name}.framework/#{framework_name}"
|
199
|
+
`lipo -create -output #{output} #{libs.join(' ')}` if libs.size > 0
|
200
|
+
end
|
201
|
+
|
202
|
+
# 存放资源的目录
|
203
|
+
def resources_des_dir
|
204
|
+
"#{build_device_dir}/#{framework_name}.framework/resources"
|
205
|
+
end
|
206
|
+
|
207
|
+
# 存放动态库的目录
|
208
|
+
def dynamic_libs_des_dir
|
209
|
+
"#{build_device_dir}/#{framework_name}.framework/fwks"
|
210
|
+
end
|
211
|
+
|
212
|
+
# 存放vendored_libraries的目录
|
213
|
+
def vendored_libraries_dir
|
214
|
+
"#{build_device_dir}/#{framework_name}.framework/libs"
|
215
|
+
end
|
216
|
+
|
217
|
+
# 真机路径
|
218
|
+
def build_device_dir
|
219
|
+
'build-device'
|
220
|
+
end
|
221
|
+
|
222
|
+
# 模拟器路径
|
223
|
+
def build_sim_dir
|
224
|
+
'build-simulator'
|
225
|
+
end
|
226
|
+
|
227
|
+
# 获取vendored_libraries
|
228
|
+
def vendored_libraries
|
229
|
+
return [] if @file_accessors.nil?
|
230
|
+
libs = @file_accessors.flat_map(&:vendored_libraries) || []
|
231
|
+
libs.compact.map(&:to_s)
|
232
|
+
end
|
233
|
+
|
234
|
+
# 获取vendored_frameworks
|
235
|
+
def vendored_frameworks
|
236
|
+
return [] if @file_accessors.nil?
|
237
|
+
fwks = @file_accessors.flat_map(&:vendored_frameworks) || []
|
238
|
+
fwks.compact.map(&:to_s)
|
239
|
+
end
|
240
|
+
|
241
|
+
# 获取静态库
|
242
|
+
def vendored_static_libraries
|
243
|
+
return [] if @file_accessors.nil?
|
244
|
+
file_accessors = @file_accessors
|
245
|
+
# libs = file_accessors.flat_map(&:vendored_static_frameworks).map { |f| f + f.basename('.*') } || []
|
246
|
+
# libs += file_accessors.flat_map(&:vendored_static_libraries)
|
247
|
+
libs = file_accessors.flat_map(&:vendored_static_libraries) || []
|
248
|
+
@vendored_static_libraries = libs.compact.map(&:to_s)
|
249
|
+
@vendored_static_libraries
|
250
|
+
end
|
251
|
+
|
252
|
+
# 获取动态库
|
253
|
+
def vendored_dynamic_libraries
|
254
|
+
return [] if @file_accessors.nil?
|
255
|
+
file_accessors = @file_accessors
|
256
|
+
libs = file_accessors.flat_map(&:vendored_dynamic_frameworks) || []
|
257
|
+
libs += file_accessors.flat_map(&:vendored_dynamic_libraries)
|
258
|
+
@vendored_dynamic_libraries = libs.compact.map(&:to_s)
|
259
|
+
@vendored_dynamic_libraries
|
260
|
+
end
|
261
|
+
|
262
|
+
# 获取xcframework
|
263
|
+
def vendored_xcframeworks
|
264
|
+
return [] if @file_accessors.nil?
|
265
|
+
xcframeworks = @file_accessors.flat_map(&:vendored_xcframeworks) || []
|
266
|
+
xcframeworks.compact.map(&:to_s)
|
267
|
+
end
|
268
|
+
|
269
|
+
# 获取静态库
|
270
|
+
def static_libs_in_sandbox(build_dir = build_device_dir)
|
271
|
+
Dir.glob("#{build_dir}/#{framework_name}.framework/#{framework_name}")
|
272
|
+
end
|
273
|
+
|
274
|
+
# 最终生成的framework的name
|
275
|
+
# 先判断是否有module_name,再判断是否有header_dir,如果都没有,使用name
|
276
|
+
def framework_name
|
277
|
+
@spec.module_name
|
278
|
+
end
|
279
|
+
|
280
|
+
# 真机CPU架构
|
281
|
+
def ios_architectures
|
282
|
+
archs = %w[arm64]
|
283
|
+
vendored_static_libraries.each do |library|
|
284
|
+
archs = `lipo -info #{library}`.split & archs
|
285
|
+
end
|
286
|
+
archs
|
287
|
+
end
|
288
|
+
|
289
|
+
# 模拟器CPU架构
|
290
|
+
def ios_architectures_sim
|
291
|
+
archs = %w[x86_64]
|
292
|
+
vendored_static_libraries.each do |library|
|
293
|
+
archs = `lipo -info #{library}`.split & archs
|
294
|
+
end
|
295
|
+
archs
|
296
|
+
end
|
297
|
+
|
298
|
+
# 真机编译(只支持 arm64)
|
299
|
+
def compile
|
300
|
+
defines = "GCC_PREPROCESSOR_DEFINITIONS='$(inherited)' GCC_WARN_INHIBIT_ALL_WARNINGS=YES -quiet"
|
301
|
+
# defines = "GCC_PREPROCESSOR_DEFINITIONS='$(inherited)' -quiet"
|
302
|
+
unless @spec.consumer(@platform).compiler_flags.empty?
|
303
|
+
defines += ' '
|
304
|
+
defines += @spec.consumer(@platform).compiler_flags.join(' ')
|
305
|
+
end
|
306
|
+
|
307
|
+
options = "ARCHS=\'#{ios_architectures.join(' ')}\' OTHER_CFLAGS=\'-fembed-bitcode -Qunused-arguments\'"
|
308
|
+
xcodebuild(defines, options, build_device_dir, @build_model)
|
309
|
+
|
310
|
+
defines
|
311
|
+
end
|
312
|
+
|
313
|
+
# 模拟器编译(只支持 x86-64)
|
314
|
+
def build_sim_libraries(defines)
|
315
|
+
if @platform.name == :ios
|
316
|
+
options = "-sdk iphonesimulator ARCHS=\'#{ios_architectures_sim.join(' ')}\'"
|
317
|
+
xcodebuild(defines, options, build_sim_dir, @build_model)
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
def target_name
|
322
|
+
# 区分多平台,如配置了多平台,会带上平台的名字
|
323
|
+
# 如libwebp-iOS
|
324
|
+
if @spec.available_platforms.count > 1
|
325
|
+
name = "#{@spec.name}-#{Platform.string_name(@spec.consumer(@platform).platform_name)}"
|
326
|
+
return name if @installer && @installer.pod_targets.map { |pod| pod.name }.include?(name)
|
327
|
+
@spec.name
|
328
|
+
else
|
329
|
+
@spec.name
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
# 调用 xcodebuild 编译
|
334
|
+
def xcodebuild(defines = '', args = '', build_dir = 'build', build_model = 'Release')
|
335
|
+
unless File.exist?("Pods.xcodeproj") #cocoapods-generate v2.0.0
|
336
|
+
command = "xcodebuild #{defines} #{args} CONFIGURATION_BUILD_DIR=#{File.join(File.expand_path("..", build_dir), File.basename(build_dir))} clean build -configuration #{build_model} -target #{target_name} -project ./Pods/Pods.xcodeproj"
|
337
|
+
else
|
338
|
+
command = "xcodebuild #{defines} #{args} CONFIGURATION_BUILD_DIR=#{build_dir} clean build -configuration #{build_model} -target #{target_name} -project ./Pods.xcodeproj"
|
339
|
+
end
|
340
|
+
|
341
|
+
UI.info "#{command}"
|
342
|
+
output = `#{command}`.lines.to_a
|
343
|
+
|
344
|
+
if $CHILD_STATUS.exitstatus != 0
|
345
|
+
log_file = File.join(Dir.pwd, "build_error.log")
|
346
|
+
error_msg = <<~EOF
|
347
|
+
😈 可恶,编译失败了~ 😈
|
348
|
+
请查看下面的报错信息或者打开 #{log_file} 查看
|
349
|
+
编译命令:
|
350
|
+
#{command}
|
351
|
+
报错信息:
|
352
|
+
#{output.map { |line| " #{line}" }.join}
|
353
|
+
EOF
|
354
|
+
FileUtils.rm_f(log_file) if File.exist?(log_file)
|
355
|
+
file = File.new(log_file, "w+")
|
356
|
+
file.puts(error_msg)
|
357
|
+
file.close
|
358
|
+
|
359
|
+
raise Informative, error_msg
|
360
|
+
|
361
|
+
Process.exit
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
def framework
|
366
|
+
@framework ||= begin
|
367
|
+
framework = Framework.new(framework_name, @platform.name.to_s)
|
368
|
+
framework.make
|
369
|
+
framework
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
# ---------- 以下方法无用 -------------
|
374
|
+
|
375
|
+
def is_debug_model
|
376
|
+
@build_model == "Debug"
|
377
|
+
end
|
378
|
+
|
379
|
+
def build_static_library_for_ios(output)
|
380
|
+
static_libs = static_libs_in_sandbox('build') + static_libs_in_sandbox('build-simulator') + @vendored_libraries
|
381
|
+
# if is_debug_model
|
382
|
+
ios_architectures.map do |arch|
|
383
|
+
static_libs += static_libs_in_sandbox("build-#{arch}") + @vendored_libraries
|
384
|
+
end
|
385
|
+
ios_architectures_sim do |arch|
|
386
|
+
static_libs += static_libs_in_sandbox("build-#{arch}") + @vendored_libraries
|
387
|
+
end
|
388
|
+
# end
|
389
|
+
|
390
|
+
build_path = Pathname("build")
|
391
|
+
build_path.mkpath unless build_path.exist?
|
392
|
+
|
393
|
+
# if is_debug_model
|
394
|
+
libs = (ios_architectures + ios_architectures_sim) .map do |arch|
|
395
|
+
# library = "build-#{arch}/lib#{target_name}.a"
|
396
|
+
library = "build-#{arch}/#{target_name}.framework/#{target_name}"
|
397
|
+
library
|
398
|
+
end
|
399
|
+
# else
|
400
|
+
# libs = ios_architectures.map do |arch|
|
401
|
+
# library = "build/package-#{@spec.name}-#{arch}.a"
|
402
|
+
# # libtool -arch_only arm64 -static -o build/package-armv64.a build/libIMYFoundation.a build-simulator/libIMYFoundation.a
|
403
|
+
# # 从liBFoundation.a 文件中,提取出 arm64 架构的文件,命名为build/package-armv64.a
|
404
|
+
# UI.message "libtool -arch_only #{arch} -static -o #{library} #{static_libs.join(' ')}"
|
405
|
+
# `libtool -arch_only #{arch} -static -o #{library} #{static_libs.join(' ')}`
|
406
|
+
# library
|
407
|
+
# end
|
408
|
+
# end
|
409
|
+
|
410
|
+
UI.message "lipo -create -output #{output} #{libs.join(' ')}"
|
411
|
+
`lipo -create -output #{output} #{libs.join(' ')}`
|
412
|
+
end
|
413
|
+
|
414
|
+
def cp_to_source_dir
|
415
|
+
framework_name = "#{@spec.name}.framework"
|
416
|
+
target_dir = File.join(CBin::Config::Builder.instance.zip_dir,framework_name)
|
417
|
+
FileUtils.rm_rf(target_dir) if File.exist?(target_dir)
|
418
|
+
|
419
|
+
zip_dir = CBin::Config::Builder.instance.zip_dir
|
420
|
+
FileUtils.mkdir_p(zip_dir) unless File.exist?(zip_dir)
|
421
|
+
|
422
|
+
`cp -fa #{framework.root_path}/#{framework_name} #{target_dir}`
|
423
|
+
end
|
424
|
+
|
425
|
+
def copy_headers
|
426
|
+
#走 podsepc中的public_headers
|
427
|
+
public_headers = Array.new
|
428
|
+
|
429
|
+
#by slj 如果没有头文件,去 "Headers/Public"拿
|
430
|
+
# if public_headers.empty?
|
431
|
+
spec_header_dir = "./Headers/Public/#{@spec.name}"
|
432
|
+
unless File.exist?(spec_header_dir)
|
433
|
+
spec_header_dir = "./Pods/Headers/Public/#{@spec.name}"
|
434
|
+
end
|
435
|
+
return unless File.exist?(spec_header_dir)
|
436
|
+
# raise "copy_headers #{spec_header_dir} no exist " unless File.exist?(spec_header_dir)
|
437
|
+
Dir.chdir(spec_header_dir) do
|
438
|
+
headers = Dir.glob('*.h')
|
439
|
+
headers.each do |h|
|
440
|
+
public_headers << Pathname.new(File.join(Dir.pwd,h))
|
441
|
+
end
|
442
|
+
end
|
443
|
+
# end
|
444
|
+
|
445
|
+
# UI.message "Copying public headers #{public_headers.map(&:basename).map(&:to_s)}"
|
446
|
+
|
447
|
+
public_headers.each do |h|
|
448
|
+
`ditto #{h} #{framework.headers_path}/#{h.basename}`
|
449
|
+
end
|
450
|
+
|
451
|
+
# If custom 'module_map' is specified add it to the framework distribution
|
452
|
+
# otherwise check if a header exists that is equal to 'spec.name', if so
|
453
|
+
# create a default 'module_map' one using it.
|
454
|
+
if !@spec.module_map.nil?
|
455
|
+
module_map_file = @file_accessor.module_map
|
456
|
+
if Pathname(module_map_file).exist?
|
457
|
+
module_map = File.read(module_map_file)
|
458
|
+
end
|
459
|
+
elsif public_headers.map(&:basename).map(&:to_s).include?("#{@spec.name}.h")
|
460
|
+
module_map = <<-MAP
|
461
|
+
framework module #{@spec.name} {
|
462
|
+
umbrella header "#{@spec.name}.h"
|
463
|
+
|
464
|
+
export *
|
465
|
+
module * { export * }
|
466
|
+
}
|
467
|
+
MAP
|
468
|
+
end
|
469
|
+
|
470
|
+
unless module_map.nil?
|
471
|
+
UI.message "Writing module map #{module_map}"
|
472
|
+
unless framework.module_map_path.exist?
|
473
|
+
framework.module_map_path.mkpath
|
474
|
+
end
|
475
|
+
File.write("#{framework.module_map_path}/module.modulemap", module_map)
|
476
|
+
end
|
477
|
+
end
|
478
|
+
|
479
|
+
def copy_license
|
480
|
+
UI.section "Copying license #{@spec}" do
|
481
|
+
license_file = @spec.license[:file] || 'LICENSE'
|
482
|
+
`cp "#{license_file}" .` if Pathname(license_file).exist?
|
483
|
+
end
|
484
|
+
end
|
485
|
+
|
486
|
+
# def copy_resources
|
487
|
+
# UI.section "copy_resources #{@spec}" do
|
488
|
+
# resource_dir = './build/*.bundle'
|
489
|
+
# resource_dir = './build-armv7/*.bundle' if File.exist?('./build-armv7')
|
490
|
+
# resource_dir = './build-arm64/*.bundle' if File.exist?('./build-arm64')
|
491
|
+
#
|
492
|
+
# bundles = Dir.glob(resource_dir)
|
493
|
+
#
|
494
|
+
# bundle_names = [@spec, *@spec.recursive_subspecs].flat_map do |spec|
|
495
|
+
# consumer = spec.consumer(@platform)
|
496
|
+
# consumer.resource_bundles.keys +
|
497
|
+
# consumer.resources.map do |r|
|
498
|
+
# File.basename(r, '.bundle') if File.extname(r) == 'bundle'
|
499
|
+
# end
|
500
|
+
# end.compact.uniq
|
501
|
+
#
|
502
|
+
# bundles.select! do |bundle|
|
503
|
+
# bundle_name = File.basename(bundle, '.bundle')
|
504
|
+
# bundle_names.include?(bundle_name)
|
505
|
+
# end
|
506
|
+
#
|
507
|
+
# if bundles.count > 0
|
508
|
+
# UI.message "Copying bundle files #{bundles}"
|
509
|
+
# bundle_files = bundles.join(' ')
|
510
|
+
# `cp -rp #{bundle_files} #{framework.resources_path} 2>&1`
|
511
|
+
# end
|
512
|
+
#
|
513
|
+
# real_source_dir = @source_dir
|
514
|
+
# unless @isRootSpec
|
515
|
+
# spec_source_dir = File.join(Dir.pwd,"#{@spec.name}")
|
516
|
+
# unless File.exist?(spec_source_dir)
|
517
|
+
# spec_source_dir = File.join(Dir.pwd,"Pods/#{@spec.name}")
|
518
|
+
# end
|
519
|
+
# raise "copy_resources #{spec_source_dir} no exist " unless File.exist?(spec_source_dir)
|
520
|
+
#
|
521
|
+
# real_source_dir = spec_source_dir
|
522
|
+
# end
|
523
|
+
# resources = [@spec, *@spec.recursive_subspecs].flat_map do |spec|
|
524
|
+
# expand_paths(real_source_dir, spec.consumer(@platform).resources)
|
525
|
+
# end.compact.uniq
|
526
|
+
#
|
527
|
+
# if resources.count == 0 && bundles.count == 0
|
528
|
+
# framework.delete_resources
|
529
|
+
# return
|
530
|
+
# end
|
531
|
+
#
|
532
|
+
# if resources.count > 0
|
533
|
+
# #把 路径转义。 避免空格情况下拷贝失败
|
534
|
+
# escape_resource = []
|
535
|
+
# resources.each do |source|
|
536
|
+
# escape_resource << Shellwords.join(source)
|
537
|
+
# end
|
538
|
+
# UI.message "Copying resources #{escape_resource}"
|
539
|
+
# `cp -rp #{escape_resource.join(' ')} #{framework.resources_path}`
|
540
|
+
# end
|
541
|
+
# end
|
542
|
+
# end
|
543
|
+
|
544
|
+
def expand_paths(source_dir, path_specs)
|
545
|
+
path_specs.map do |path_spec|
|
546
|
+
Dir.glob(File.join(source_dir, path_spec))
|
547
|
+
end
|
548
|
+
end
|
549
|
+
end
|
550
|
+
end
|
551
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# copy from https://github.com/CocoaPods/cocoapods-packager
|
2
|
+
|
3
|
+
module CBin
|
4
|
+
class Library
|
5
|
+
attr_reader :headers_path
|
6
|
+
attr_reader :resources_path
|
7
|
+
attr_reader :root_path
|
8
|
+
attr_reader :versions_path
|
9
|
+
attr_reader :name_path
|
10
|
+
|
11
|
+
def initialize(name, platform, version)
|
12
|
+
@name = name
|
13
|
+
@platform = platform
|
14
|
+
@version = version
|
15
|
+
end
|
16
|
+
|
17
|
+
def make
|
18
|
+
make_root
|
19
|
+
make_library
|
20
|
+
make_headers
|
21
|
+
make_resources
|
22
|
+
end
|
23
|
+
|
24
|
+
def delete_resources
|
25
|
+
Pathname.new(@resources_path).rmtree
|
26
|
+
(Pathname.new(@fwk_path) + Pathname.new('Resources')).delete
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def make_library
|
32
|
+
@name_path = CBin::Config::Builder.instance.library_name_version(@name,@version)
|
33
|
+
@fwk_path = @root_path + Pathname.new(@name_path)
|
34
|
+
@fwk_path.mkdir unless @fwk_path.exist?
|
35
|
+
|
36
|
+
@versions_path = @fwk_path
|
37
|
+
end
|
38
|
+
|
39
|
+
def make_headers
|
40
|
+
@headers_path = @versions_path + Pathname.new('Headers')
|
41
|
+
@headers_path.mkpath unless @headers_path.exist?
|
42
|
+
end
|
43
|
+
|
44
|
+
def make_resources
|
45
|
+
@resources_path = @versions_path + Pathname.new('Resources')
|
46
|
+
@resources_path.mkpath unless @resources_path.exist?
|
47
|
+
end
|
48
|
+
|
49
|
+
def make_root
|
50
|
+
@root_path = Pathname.new(@platform)
|
51
|
+
@root_path.mkpath unless @root_path.exist?
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
|
2
|
+
# copy from https://github.com/CocoaPods/cocoapods-packager
|
3
|
+
|
4
|
+
require 'cocoapods-mtxx-bin/helpers/framework.rb'
|
5
|
+
require 'cocoapods-mtxx-bin/helpers/library.rb'
|
6
|
+
|
7
|
+
require 'English'
|
8
|
+
|
9
|
+
module CBin
|
10
|
+
class Library
|
11
|
+
class Builder
|
12
|
+
include Pod
|
13
|
+
|
14
|
+
def initialize(spec, file_accessor, platform, source_dir,framework_path)
|
15
|
+
@spec = spec
|
16
|
+
@source_dir = source_dir
|
17
|
+
@file_accessor = file_accessor
|
18
|
+
@platform = platform
|
19
|
+
@framework = framework_path
|
20
|
+
@source_files = "#{@source_dir}/#{library.name_path}"
|
21
|
+
@source_zip_file = "#{@source_files}.zip"
|
22
|
+
end
|
23
|
+
|
24
|
+
def build
|
25
|
+
UI.section("Building static library #{@spec}") do
|
26
|
+
|
27
|
+
clean_source_dir
|
28
|
+
|
29
|
+
copy_headers
|
30
|
+
copy_library
|
31
|
+
copy_resources
|
32
|
+
|
33
|
+
cp_to_source_dir
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def clean_source_dir
|
40
|
+
FileUtils.rm_rf(@source_files) if File.exist?(@source_files)
|
41
|
+
FileUtils.rm_rf(@source_zip_file) if File.exist?(@source_zip_file)
|
42
|
+
end
|
43
|
+
|
44
|
+
def cp_to_source_dir
|
45
|
+
target_dir = library.versions_path
|
46
|
+
dest_file = "#{@source_dir}/#{library.name_path}"
|
47
|
+
FileUtils.rm_rf(dest_file) if File.exist?(dest_file)
|
48
|
+
|
49
|
+
`cp -fa #{target_dir} #{dest_file}/`
|
50
|
+
end
|
51
|
+
|
52
|
+
def copy_headers
|
53
|
+
FileUtils.cp_r(framework.headers_path,library.versions_path) if File.exist?(framework.headers_path)
|
54
|
+
end
|
55
|
+
|
56
|
+
def copy_library
|
57
|
+
src_file = "#{framework.versions_path}/#{@spec.name}"
|
58
|
+
unless File.exist?(src_file)
|
59
|
+
raise Informative, "framework没有文件:#{src_file}"
|
60
|
+
end
|
61
|
+
|
62
|
+
dest_file = "#{library.versions_path}/#{@spec.name}"
|
63
|
+
rename_dest_file = "#{library.versions_path}/lib#{@spec.name}.a"
|
64
|
+
FileUtils.cp_r(src_file,dest_file)
|
65
|
+
File.rename(dest_file, rename_dest_file ) if File.exist?(dest_file)
|
66
|
+
end
|
67
|
+
|
68
|
+
def copy_resources
|
69
|
+
FileUtils.cp_r(framework.resources_path,library.versions_path) if File.exist?(framework.resources_path)
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
def framework
|
74
|
+
@framework ||= begin
|
75
|
+
framework = Framework.new(@spec.name, @platform.name.to_s)
|
76
|
+
framework.make
|
77
|
+
framework
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def library
|
82
|
+
@library ||= begin
|
83
|
+
library = Library.new(@spec.name, @platform.name.to_s,@spec.version)
|
84
|
+
library.make
|
85
|
+
library
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|