cocoapods-bb-bin 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +19 -0
  3. data/README.md +68 -0
  4. data/lib/cocoapods-bb-bin/command/bin/archive.rb +234 -0
  5. data/lib/cocoapods-bb-bin/command/bin/auto.rb +226 -0
  6. data/lib/cocoapods-bb-bin/command/bin/code.rb +295 -0
  7. data/lib/cocoapods-bb-bin/command/bin/dup.rb +78 -0
  8. data/lib/cocoapods-bb-bin/command/bin/imy.rb +46 -0
  9. data/lib/cocoapods-bb-bin/command/bin/init.rb +69 -0
  10. data/lib/cocoapods-bb-bin/command/bin/initHotKey.rb +70 -0
  11. data/lib/cocoapods-bb-bin/command/bin/install.rb +44 -0
  12. data/lib/cocoapods-bb-bin/command/bin/lib/lint.rb +69 -0
  13. data/lib/cocoapods-bb-bin/command/bin/repo/update.rb +43 -0
  14. data/lib/cocoapods-bb-bin/command/bin/spec/create.rb +73 -0
  15. data/lib/cocoapods-bb-bin/command/bin/spec/push.rb +114 -0
  16. data/lib/cocoapods-bb-bin/command/bin/update.rb +154 -0
  17. data/lib/cocoapods-bb-bin/command/bin.rb +59 -0
  18. data/lib/cocoapods-bb-bin/command.rb +2 -0
  19. data/lib/cocoapods-bb-bin/config/config.rb +136 -0
  20. data/lib/cocoapods-bb-bin/config/config_asker.rb +57 -0
  21. data/lib/cocoapods-bb-bin/config/config_builder.rb +234 -0
  22. data/lib/cocoapods-bb-bin/config/config_hot_key.rb +102 -0
  23. data/lib/cocoapods-bb-bin/config/config_hot_key_asker.rb +57 -0
  24. data/lib/cocoapods-bb-bin/gem_version.rb +10 -0
  25. data/lib/cocoapods-bb-bin/helpers/Info.plist +0 -0
  26. data/lib/cocoapods-bb-bin/helpers/build_helper.rb +217 -0
  27. data/lib/cocoapods-bb-bin/helpers/build_utils.rb +63 -0
  28. data/lib/cocoapods-bb-bin/helpers/framework.rb +85 -0
  29. data/lib/cocoapods-bb-bin/helpers/framework_builder.rb +446 -0
  30. data/lib/cocoapods-bb-bin/helpers/library.rb +54 -0
  31. data/lib/cocoapods-bb-bin/helpers/library_builder.rb +90 -0
  32. data/lib/cocoapods-bb-bin/helpers/sources_helper.rb +36 -0
  33. data/lib/cocoapods-bb-bin/helpers/spec_creator.rb +170 -0
  34. data/lib/cocoapods-bb-bin/helpers/spec_files_helper.rb +77 -0
  35. data/lib/cocoapods-bb-bin/helpers/spec_source_creator.rb +227 -0
  36. data/lib/cocoapods-bb-bin/helpers/upload_helper.rb +96 -0
  37. data/lib/cocoapods-bb-bin/helpers/xcframework_builder.rb +77 -0
  38. data/lib/cocoapods-bb-bin/helpers.rb +5 -0
  39. data/lib/cocoapods-bb-bin/native/acknowledgements.rb +27 -0
  40. data/lib/cocoapods-bb-bin/native/analyzer.rb +55 -0
  41. data/lib/cocoapods-bb-bin/native/file_accessor.rb +28 -0
  42. data/lib/cocoapods-bb-bin/native/installation_options.rb +25 -0
  43. data/lib/cocoapods-bb-bin/native/installer.rb +135 -0
  44. data/lib/cocoapods-bb-bin/native/linter.rb +26 -0
  45. data/lib/cocoapods-bb-bin/native/path_source.rb +33 -0
  46. data/lib/cocoapods-bb-bin/native/pod_source_installer.rb +19 -0
  47. data/lib/cocoapods-bb-bin/native/pod_target_installer.rb +94 -0
  48. data/lib/cocoapods-bb-bin/native/podfile.rb +91 -0
  49. data/lib/cocoapods-bb-bin/native/podfile_env.rb +37 -0
  50. data/lib/cocoapods-bb-bin/native/podfile_generator.rb +199 -0
  51. data/lib/cocoapods-bb-bin/native/podspec_finder.rb +25 -0
  52. data/lib/cocoapods-bb-bin/native/resolver.rb +230 -0
  53. data/lib/cocoapods-bb-bin/native/sandbox_analyzer.rb +34 -0
  54. data/lib/cocoapods-bb-bin/native/source.rb +35 -0
  55. data/lib/cocoapods-bb-bin/native/sources_manager.rb +20 -0
  56. data/lib/cocoapods-bb-bin/native/specification.rb +31 -0
  57. data/lib/cocoapods-bb-bin/native/target_validator.rb +41 -0
  58. data/lib/cocoapods-bb-bin/native/validator.rb +40 -0
  59. data/lib/cocoapods-bb-bin/native.rb +23 -0
  60. data/lib/cocoapods-bb-bin/source_provider_hook.rb +66 -0
  61. data/lib/cocoapods-bb-bin.rb +2 -0
  62. data/lib/cocoapods_plugin.rb +3 -0
  63. data/spec/command/bin_spec.rb +12 -0
  64. data/spec/spec_helper.rb +51 -0
  65. metadata +200 -0
@@ -0,0 +1,85 @@
1
+ # copy from https://github.com/CocoaPods/cocoapods-packager
2
+
3
+ module CBin
4
+ class Framework
5
+ attr_reader :headers_path
6
+ attr_reader :module_map_path
7
+ attr_reader :resources_path
8
+ attr_reader :root_path
9
+ attr_reader :versions_path
10
+ attr_reader :swift_module_path
11
+ attr_reader :fwk_path
12
+
13
+ def initialize(name, platform)
14
+ @name = name
15
+ @platform = platform
16
+ end
17
+
18
+ def make
19
+ make_root
20
+ make_framework
21
+ make_headers
22
+ make_resources
23
+ make_current_version
24
+ end
25
+
26
+ def delete_resources
27
+ Pathname.new(@resources_path).rmtree if File.exist? (@resources_path)
28
+ (Pathname.new(@fwk_path) + Pathname.new('Resources')).delete if File.exist?(Pathname.new(@fwk_path) + Pathname.new('Resources'))
29
+ end
30
+
31
+ def remove_current_version
32
+ FileUtils.rm_f(File.join(@fwk_path,@name))
33
+ FileUtils.rm_f(File.join(@fwk_path,"Headers"))
34
+ FileUtils.rm_f(File.join(@fwk_path,"Resources"))
35
+
36
+ FileUtils.cp_r("#{@versions_path}/.", @fwk_path)
37
+ # FileUtils.remove_dir(@versions_path)
38
+ FileUtils.remove_dir("#{@fwk_path}/Versions")
39
+
40
+ # current_version_path = @versions_path + Pathname.new('../Current')
41
+ # `ln -sf A #{current_version_path}`
42
+ # `ln -sf Versions/Current/Headers #{@fwk_path}/`
43
+ # `ln -sf Versions/Current/Resources #{@fwk_path}/`
44
+ # `ln -sf Versions/Current/#{@name} #{@fwk_path}/`
45
+ end
46
+
47
+ private
48
+
49
+ def make_current_version
50
+ current_version_path = @versions_path + Pathname.new('../Current')
51
+ `ln -sf A #{current_version_path}`
52
+ `ln -sf Versions/Current/Headers #{@fwk_path}/`
53
+ `ln -sf Versions/Current/Resources #{@fwk_path}/`
54
+ `ln -sf Versions/Current/#{@name} #{@fwk_path}/`
55
+ end
56
+
57
+
58
+
59
+ def make_framework
60
+ @fwk_path = @root_path + Pathname.new(@name + '.framework')
61
+ @fwk_path.mkdir unless @fwk_path.exist?
62
+
63
+ @module_map_path = @fwk_path + Pathname.new('Modules')
64
+ @swift_module_path = @module_map_path + Pathname.new(@name + '.swiftmodule')
65
+
66
+
67
+ @versions_path = @fwk_path + Pathname.new('Versions/A')
68
+ end
69
+
70
+ def make_headers
71
+ @headers_path = @versions_path + Pathname.new('Headers')
72
+ @headers_path.mkpath unless @headers_path.exist?
73
+ end
74
+
75
+ def make_resources
76
+ @resources_path = @versions_path + Pathname.new('Resources')
77
+ @resources_path.mkpath unless @resources_path.exist?
78
+ end
79
+
80
+ def make_root
81
+ @root_path = Pathname.new(@platform)
82
+ @root_path.mkpath unless @root_path.exist?
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,446 @@
1
+ # copy from https://github.com/CocoaPods/cocoapods-packager
2
+
3
+ require 'cocoapods-bb-bin/helpers/framework.rb'
4
+ require 'English'
5
+ require 'cocoapods-bb-bin/config/config_builder'
6
+ require 'shellwords'
7
+ require 'cocoapods-bb-bin/helpers/build_utils'
8
+
9
+ module CBin
10
+ class Framework
11
+ class Builder
12
+ include Pod
13
+ #Debug下还待完成
14
+ def initialize(spec, file_accessor, platform, source_dir, isRootSpec = true, build_model="Debug")
15
+ @spec = spec
16
+ @source_dir = source_dir
17
+ @file_accessor = file_accessor
18
+ @platform = platform
19
+ @build_model = build_model
20
+ @isRootSpec = isRootSpec
21
+ #vendored_static_frameworks 只有 xx.framework 需要拼接为 xx.framework/xx by slj
22
+ vendored_static_frameworks = file_accessor.vendored_static_frameworks.map do |framework|
23
+ path = framework
24
+ extn = File.extname path
25
+ if extn.downcase == '.framework'
26
+ path = File.join(path,File.basename(path, extn))
27
+ end
28
+ path
29
+ end
30
+
31
+ @vendored_libraries = (vendored_static_frameworks + file_accessor.vendored_static_libraries).map(&:to_s)
32
+ end
33
+
34
+ def build
35
+ defines = compile
36
+ build_sim_libraries(defines)
37
+
38
+ defines
39
+ end
40
+
41
+ def lipo_build(defines)
42
+
43
+ UI.puts "framework lipo build"
44
+
45
+ if CBin::Build::Utils.is_swift_module(@spec) || !CBin::Build::Utils.uses_frameworks?
46
+ UI.section("Building static Library #{@spec}") do
47
+ # defines = compile
48
+ UI.puts "swift framework lipo build"
49
+ # build_sim_libraries(defines)
50
+ output = framework.versions_path + Pathname.new(@spec.name)
51
+
52
+ build_static_library_for_ios(output)
53
+
54
+ copy_headers
55
+ copy_license
56
+ copy_resources
57
+
58
+ cp_to_source_dir
59
+ end
60
+ else
61
+ # begin
62
+ UI.section("Building framework #{@spec}") do
63
+ # defines = compile
64
+ UI.puts "oc framework lipo build"
65
+ # build_sim_libraries(defines)
66
+ output = framework.fwk_path + Pathname.new(@spec.name)
67
+
68
+ copy_static_framework_dir_for_ios
69
+
70
+ build_static_framework_machO_for_ios(output)
71
+
72
+ # copy_license
73
+ copy_framework_resources
74
+
75
+ #cp_to_source_dir#
76
+
77
+ # rescue Object => exception
78
+ # UI.puts exception
79
+ # end
80
+ end
81
+ end
82
+
83
+ framework
84
+ end
85
+
86
+ private
87
+
88
+ def cp_to_source_dir
89
+ # 删除Versions 软链接
90
+ framework.remove_current_version if CBin::Build::Utils.is_swift_module(@spec)
91
+
92
+ framework_name = "#{@spec.name}.framework"
93
+ target_dir = File.join(CBin::Config::Builder.instance.zip_dir,framework_name)
94
+ FileUtils.rm_rf(target_dir) if File.exist?(target_dir)
95
+
96
+ zip_dir = CBin::Config::Builder.instance.zip_dir
97
+ FileUtils.mkdir_p(zip_dir) unless File.exist?(zip_dir)
98
+
99
+ `cp -fa #{@platform}/#{framework_name} #{target_dir}`
100
+ end
101
+
102
+ #模拟器,目前只支持 debug x86-64
103
+ def build_sim_libraries(defines)
104
+ UI.message 'Building simulator libraries'
105
+
106
+ # archs = %w[i386 x86_64]
107
+ archs = ios_architectures_sim
108
+ archs.map do |arch|
109
+ xcodebuild(defines, "-sdk iphonesimulator ARCHS=\'#{arch}\' ", "build-#{arch}",@build_model)
110
+ end
111
+
112
+ end
113
+
114
+
115
+ def static_libs_in_sandbox(build_dir = 'build')
116
+ file = Dir.glob("#{build_dir}/lib#{target_name}.a")
117
+ unless file
118
+ UI.warn "file no find = #{build_dir}/lib#{target_name}.a"
119
+ end
120
+ file
121
+ end
122
+
123
+ def build_static_library_for_ios(output)
124
+ UI.message "Building ios libraries with archs #{ios_architectures}"
125
+ static_libs = static_libs_in_sandbox('build') + static_libs_in_sandbox('build-simulator') + @vendored_libraries
126
+
127
+ ios_architectures.map do |arch|
128
+ static_libs += static_libs_in_sandbox("build-#{arch}") + @vendored_libraries
129
+ end
130
+ ios_architectures_sim do |arch|
131
+ static_libs += static_libs_in_sandbox("build-#{arch}") + @vendored_libraries
132
+ end
133
+
134
+ build_path = Pathname("build")
135
+ build_path.mkpath unless build_path.exist?
136
+
137
+ libs = (ios_architectures + ios_architectures_sim) .map do |arch|
138
+ library = "build-#{arch}/lib#{@spec.name}.a"
139
+ library
140
+ end
141
+
142
+ UI.message "lipo -create -output #{output} #{libs.join(' ')}"
143
+ `lipo -create -output #{output} #{libs.join(' ')}`
144
+ end
145
+
146
+ def ios_build_options
147
+ "ARCHS=\'#{ios_architectures.join(' ')}\' OTHER_CFLAGS=\'-fembed-bitcode -Qunused-arguments\'"
148
+ end
149
+
150
+ def ios_architectures
151
+ # >armv7
152
+ # iPhone4
153
+ # iPhone4S
154
+ # >armv7s 去掉
155
+ # iPhone5
156
+ # iPhone5C
157
+ # >arm64
158
+ # iPhone5S(以上)
159
+ # >i386
160
+ # iphone5,iphone5s以下的模拟器
161
+ # >x86_64
162
+ # iphone6以上的模拟器
163
+ archs = %w[arm64 armv7]
164
+ # archs = %w[x86_64 arm64 armv7s i386]
165
+ # @vendored_libraries.each do |library|
166
+ # archs = `lipo -info #{library}`.split & archs
167
+ # end
168
+ archs
169
+ end
170
+
171
+ def ios_architectures_sim
172
+
173
+ archs = %w[x86_64]
174
+ # TODO 处理是否需要 i386
175
+ archs
176
+ end
177
+
178
+ def compile
179
+ defines = "GCC_PREPROCESSOR_DEFINITIONS='$(inherited)'"
180
+ defines += ' '
181
+ defines += @spec.consumer(@platform).compiler_flags.join(' ')
182
+
183
+ options = ios_build_options
184
+ # if is_debug_model
185
+ archs = ios_architectures
186
+ # archs = %w[arm64 armv7 armv7s]
187
+ archs.map do |arch|
188
+ xcodebuild(defines, "ARCHS=\'#{arch}\' OTHER_CFLAGS=\'-fembed-bitcode -Qunused-arguments\'","build-#{arch}",@build_model)
189
+ end
190
+ # else
191
+ # xcodebuild(defines,options)
192
+ # end
193
+
194
+ defines
195
+ end
196
+
197
+ def is_debug_model
198
+ @build_model == "Debug"
199
+ end
200
+
201
+ def target_name
202
+ #区分多平台,如配置了多平台,会带上平台的名字
203
+ # 如libwebp-iOS
204
+ if @spec.available_platforms.count > 1
205
+ "#{@spec.name}-#{Platform.string_name(@spec.consumer(@platform).platform_name)}"
206
+ else
207
+ @spec.name
208
+ end
209
+ end
210
+
211
+ def xcodebuild(defines = '', args = '', build_dir = 'build', build_model = 'Debug')
212
+
213
+ unless File.exist?("Pods.xcodeproj") #cocoapods-generate v2.0.0
214
+ 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 2>&1"
215
+ else
216
+ command = "xcodebuild #{defines} #{args} CONFIGURATION_BUILD_DIR=#{build_dir} clean build -configuration #{build_model} -target #{target_name} -project ./Pods.xcodeproj 2>&1"
217
+ end
218
+
219
+ UI.message "command = #{command}"
220
+ output = `#{command}`.lines.to_a
221
+
222
+ if $CHILD_STATUS.exitstatus != 0
223
+ raise <<~EOF
224
+ Build command failed: #{command}
225
+ Output:
226
+ #{output.map { |line| " #{line}" }.join}
227
+ EOF
228
+
229
+ Process.exit
230
+ end
231
+ end
232
+
233
+ def copy_headers
234
+ #走 podsepc中的public_headers
235
+ public_headers = Array.new
236
+
237
+ #by slj 如果没有头文件,去 "Headers/Public"拿
238
+ # if public_headers.empty?
239
+ spec_header_dir = "./Headers/Public/#{@spec.name}"
240
+ unless File.exist?(spec_header_dir)
241
+ spec_header_dir = "./Pods/Headers/Public/#{@spec.name}"
242
+ end
243
+ raise "copy_headers #{spec_header_dir} no exist " unless File.exist?(spec_header_dir)
244
+ Dir.chdir(spec_header_dir) do
245
+ headers = Dir.glob('*.h')
246
+ headers.each do |h|
247
+ public_headers << Pathname.new(File.join(Dir.pwd,h))
248
+ end
249
+ end
250
+ # end
251
+
252
+ # UI.message "Copying public headers #{public_headers.map(&:basename).map(&:to_s)}"
253
+
254
+ public_headers.each do |h|
255
+ `ditto #{h} #{framework.headers_path}/#{h.basename}`
256
+ end
257
+
258
+ # If custom 'module_map' is specified add it to the framework distribution
259
+ # otherwise check if a header exists that is equal to 'spec.name', if so
260
+ # create a default 'module_map' one using it.
261
+ if !@spec.module_map.nil?
262
+ module_map_file = @file_accessor.module_map
263
+ if Pathname(module_map_file).exist?
264
+ module_map = File.read(module_map_file)
265
+ end
266
+ elsif public_headers.map(&:basename).map(&:to_s).include?("#{@spec.name}-umbrella.h")
267
+ module_map = <<-MAP
268
+ framework module #{@spec.name} {
269
+ umbrella header "#{@spec.name}-umbrella.h"
270
+
271
+ export *
272
+ module * { export * }
273
+ }
274
+ MAP
275
+ end
276
+
277
+ unless module_map.nil?
278
+ UI.message "Writing module map #{module_map}"
279
+ unless framework.module_map_path.exist?
280
+ framework.module_map_path.mkpath
281
+ end
282
+ File.write("#{framework.module_map_path}/module.modulemap", module_map)
283
+
284
+ # unless framework.swift_module_path.exist?
285
+ # framework.swift_module_path.mkpath
286
+ # end
287
+ # todo 所有架构的swiftModule拷贝到 framework.swift_module_path
288
+ archs = ios_architectures + ios_architectures_sim
289
+ archs.map do |arch|
290
+ swift_module = "build-#{arch}/#{@spec.name}.swiftmodule"
291
+ if File.directory?(swift_module)
292
+ FileUtils.cp_r("#{swift_module}/.", framework.swift_module_path)
293
+ end
294
+ end
295
+ swift_Compatibility_Header = "build-#{archs.first}/Swift\ Compatibility\ Header/#{@spec.name}-Swift.h"
296
+ FileUtils.cp(swift_Compatibility_Header,framework.headers_path) if File.exist?(swift_Compatibility_Header)
297
+ info_plist_file = File.join(File.dirname(__FILE__),"info.plist")
298
+ FileUtils.cp(info_plist_file,framework.fwk_path)
299
+ end
300
+ end
301
+
302
+ def copy_swift_header
303
+
304
+ end
305
+
306
+ def copy_license
307
+ UI.message 'Copying license'
308
+ license_file = @spec.license[:file] || 'LICENSE'
309
+ `cp "#{license_file}" .` if Pathname(license_file).exist?
310
+ end
311
+
312
+ def copy_resources
313
+ resource_dir = './build/*.bundle'
314
+ resource_dir = './build-armv7/*.bundle' if File.exist?('./build-armv7')
315
+ resource_dir = './build-arm64/*.bundle' if File.exist?('./build-arm64')
316
+
317
+ bundles = Dir.glob(resource_dir)
318
+
319
+ bundle_names = [@spec, *@spec.recursive_subspecs].flat_map do |spec|
320
+ consumer = spec.consumer(@platform)
321
+ consumer.resource_bundles.keys +
322
+ consumer.resources.map do |r|
323
+ File.basename(r, '.bundle') if File.extname(r) == 'bundle'
324
+ end
325
+ end.compact.uniq
326
+
327
+ bundles.select! do |bundle|
328
+ bundle_name = File.basename(bundle, '.bundle')
329
+ bundle_names.include?(bundle_name)
330
+ end
331
+
332
+ if bundles.count > 0
333
+ UI.message "Copying bundle files #{bundles}"
334
+ bundle_files = bundles.join(' ')
335
+ `cp -rp #{bundle_files} #{framework.resources_path} 2>&1`
336
+ end
337
+
338
+ real_source_dir = @source_dir
339
+ unless @isRootSpec
340
+ spec_source_dir = File.join(Dir.pwd,"#{@spec.name}")
341
+ unless File.exist?(spec_source_dir)
342
+ spec_source_dir = File.join(Dir.pwd,"Pods/#{@spec.name}")
343
+ end
344
+ raise "copy_resources #{spec_source_dir} no exist " unless File.exist?(spec_source_dir)
345
+
346
+ spec_source_dir = File.join(Dir.pwd,"#{@spec.name}")
347
+ real_source_dir = spec_source_dir
348
+ end
349
+
350
+ resources = [@spec, *@spec.recursive_subspecs].flat_map do |spec|
351
+ expand_paths(real_source_dir, spec.consumer(@platform).resources)
352
+ end.compact.uniq
353
+
354
+ if resources.count == 0 && bundles.count == 0
355
+ framework.delete_resources
356
+ return
357
+ end
358
+
359
+ if resources.count > 0
360
+ #把 路径转义。 避免空格情况下拷贝失败
361
+ escape_resource = []
362
+ resources.each do |source|
363
+ escape_resource << Shellwords.join(source)
364
+ end
365
+ UI.message "Copying resources #{escape_resource}"
366
+ `cp -rp #{escape_resource.join(' ')} #{framework.resources_path}`
367
+ end
368
+ end
369
+
370
+ def expand_paths(source_dir, path_specs)
371
+ path_specs.map do |path_spec|
372
+ Dir.glob(File.join(source_dir, path_spec))
373
+ end
374
+ end
375
+
376
+ #---------------------------------swift--------------------------------------#
377
+ # lipo -create .a
378
+ def build_static_framework_machO_for_ios(output)
379
+ UI.message "Building ios framework with archs #{ios_architectures}"
380
+
381
+ static_libs = static_libs_in_sandbox('build') + @vendored_libraries
382
+ ios_architectures.map do |arch|
383
+ static_libs += static_libs_in_sandbox("build-#{arch}") + @vendored_libraries
384
+ end
385
+
386
+ ios_architectures_sim do |arch|
387
+ static_libs += static_libs_in_sandbox("build-#{arch}") + @vendored_libraries
388
+ end
389
+
390
+ build_path = Pathname("build")
391
+ build_path.mkpath unless build_path.exist?
392
+
393
+ libs = (ios_architectures + ios_architectures_sim) .map do |arch|
394
+ library = "build-#{arch}/#{@spec.name}.framework/#{@spec.name}"
395
+ library
396
+ end
397
+
398
+ UI.message "lipo -create -output #{output} #{libs.join(' ')}"
399
+ `lipo -create -output #{output} #{libs.join(' ')}`
400
+ end
401
+
402
+ def copy_static_framework_dir_for_ios
403
+
404
+ archs = ios_architectures + ios_architectures_sim
405
+ framework_dir = "build-#{ios_architectures_sim.first}/#{@spec.name}.framework"
406
+ framework_dir = "build-#{ios_architectures.first}/#{@spec.name}.framework" unless File.exist?(framework_dir)
407
+ unless File.exist?(framework_dir)
408
+ raise "#{framework_dir} path no exist"
409
+ end
410
+ File.join(Dir.pwd, "build-#{ios_architectures_sim.first}/#{@spec.name}.framework")
411
+ FileUtils.cp_r(framework_dir, framework.root_path)
412
+
413
+ # todo 所有架构的swiftModule拷贝到 framework.swift_module_path
414
+ archs.map do |arch|
415
+ swift_module = "build-#{arch}/#{@spec.name}.framework/Modules/#{@spec.name}.swiftmodule"
416
+ if File.directory?(swift_module)
417
+ FileUtils.cp_r("#{swift_module}/.", framework.swift_module_path)
418
+ end
419
+ end
420
+
421
+ # 删除Versions 软链接
422
+ framework.remove_current_version
423
+ end
424
+
425
+ def copy_framework_resources
426
+ resources = Dir.glob("#{framework.fwk_path + Pathname.new('Resources')}/*")
427
+ if resources.count == 0
428
+ framework.delete_resources
429
+ end
430
+ end
431
+
432
+
433
+ #---------------------------------getter and setter--------------------------------------#
434
+
435
+ def framework
436
+ @framework ||= begin
437
+ framework = Framework.new(@spec.name, @platform.name.to_s)
438
+ framework.make
439
+ framework
440
+ end
441
+ end
442
+
443
+
444
+ end
445
+ end
446
+ 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-bb-bin/helpers/framework.rb'
5
+ require 'cocoapods-bb-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