cocoapods-packager-boco 1.5.2

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.
Files changed (78) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +3 -0
  4. data/.rubocop-cocoapods.yml +71 -0
  5. data/.rubocop.yml +38 -0
  6. data/.travis.yml +9 -0
  7. data/Gemfile +12 -0
  8. data/Gemfile.lock +129 -0
  9. data/LICENSE +22 -0
  10. data/README.md +42 -0
  11. data/Rakefile +12 -0
  12. data/cocoapods-packager-boco.gemspec +22 -0
  13. data/lib/cocoapods-packager/builder.rb +333 -0
  14. data/lib/cocoapods-packager/framework.rb +66 -0
  15. data/lib/cocoapods-packager/mangle.rb +32 -0
  16. data/lib/cocoapods-packager/pod_utils.rb +253 -0
  17. data/lib/cocoapods-packager/spec_builder.rb +63 -0
  18. data/lib/cocoapods-packager/symbols.rb +42 -0
  19. data/lib/cocoapods-packager/user_interface/build_failed_report.rb +15 -0
  20. data/lib/cocoapods_packager.rb +5 -0
  21. data/lib/cocoapods_plugin.rb +8 -0
  22. data/lib/pod/command/package.rb +179 -0
  23. data/scripts/lstconst.sh +9 -0
  24. data/scripts/lstsym.sh +8 -0
  25. data/spec/command/error_spec.rb +81 -0
  26. data/spec/command/package_spec.rb +410 -0
  27. data/spec/command/subspecs_spec.rb +30 -0
  28. data/spec/fixtures/Archs.podspec +13 -0
  29. data/spec/fixtures/Builder.podspec +25 -0
  30. data/spec/fixtures/CPDColors.podspec +19 -0
  31. data/spec/fixtures/FH.podspec +18 -0
  32. data/spec/fixtures/KFData.podspec +73 -0
  33. data/spec/fixtures/LibraryConsumerDemo/.gitignore +22 -0
  34. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer/AppDelegate.h +17 -0
  35. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer/AppDelegate.m +27 -0
  36. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer/Info.plist +40 -0
  37. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer/main.m +16 -0
  38. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer.xcodeproj/project.pbxproj +343 -0
  39. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  40. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer.xcodeproj/xcshareddata/xcschemes/LibraryConsumer.xcscheme +100 -0
  41. data/spec/fixtures/LibraryConsumerDemo/LibraryConsumer.xcworkspace/contents.xcworkspacedata +10 -0
  42. data/spec/fixtures/LibraryConsumerDemo/Podfile +5 -0
  43. data/spec/fixtures/LibraryDemo.podspec +14 -0
  44. data/spec/fixtures/LocalSources/LICENSE +0 -0
  45. data/spec/fixtures/LocalSources/LocalNikeKit.h +4 -0
  46. data/spec/fixtures/LocalSources/LocalNikeKit.m +9 -0
  47. data/spec/fixtures/LocalSources/LocalNikeKit.podspec +19 -0
  48. data/spec/fixtures/NikeKit.podspec +19 -0
  49. data/spec/fixtures/OpenSans.podspec +18 -0
  50. data/spec/fixtures/PackagerTest/.gitignore +21 -0
  51. data/spec/fixtures/PackagerTest/PackagerTest/CPDAppDelegate.h +15 -0
  52. data/spec/fixtures/PackagerTest/PackagerTest/CPDAppDelegate.m +49 -0
  53. data/spec/fixtures/PackagerTest/PackagerTest/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  54. data/spec/fixtures/PackagerTest/PackagerTest/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  55. data/spec/fixtures/PackagerTest/PackagerTest/PackagerTest-Info.plist +38 -0
  56. data/spec/fixtures/PackagerTest/PackagerTest/PackagerTest-Prefix.pch +16 -0
  57. data/spec/fixtures/PackagerTest/PackagerTest/en.lproj/InfoPlist.strings +2 -0
  58. data/spec/fixtures/PackagerTest/PackagerTest/main.m +18 -0
  59. data/spec/fixtures/PackagerTest/PackagerTest.xcodeproj/project.pbxproj +539 -0
  60. data/spec/fixtures/PackagerTest/PackagerTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  61. data/spec/fixtures/PackagerTest/PackagerTest.xcodeproj/xcshareddata/xcschemes/PackagerTest.xcscheme +110 -0
  62. data/spec/fixtures/PackagerTest/PackagerTest.xcworkspace/contents.xcworkspacedata +1 -0
  63. data/spec/fixtures/PackagerTest/PackagerTestTests/PackagerTestTests-Info.plist +22 -0
  64. data/spec/fixtures/PackagerTest/PackagerTestTests/PackagerTestTests.m +34 -0
  65. data/spec/fixtures/PackagerTest/PackagerTestTests/en.lproj/InfoPlist.strings +2 -0
  66. data/spec/fixtures/PackagerTest/Podfile +10 -0
  67. data/spec/fixtures/PackagerTest/Podfile.lock +32 -0
  68. data/spec/fixtures/Weakly.podspec +13 -0
  69. data/spec/fixtures/a.podspec +19 -0
  70. data/spec/fixtures/foo-bar.podspec +19 -0
  71. data/spec/fixtures/layer-client-messaging-schema.podspec +13 -0
  72. data/spec/integration/project_spec.rb +70 -0
  73. data/spec/pod/utils_spec.rb +58 -0
  74. data/spec/spec_helper.rb +50 -0
  75. data/spec/specification/builder_spec.rb +43 -0
  76. data/spec/specification/spec_builder_spec.rb +61 -0
  77. data/spec/user_interface/build_failed_report_spec.rb +11 -0
  78. metadata +222 -0
@@ -0,0 +1,66 @@
1
+ module Framework
2
+ class Tree
3
+ attr_reader :headers_path
4
+ attr_reader :module_map_path
5
+ attr_reader :resources_path
6
+ attr_reader :root_path
7
+ attr_reader :versions_path
8
+
9
+ def delete_resources
10
+ Pathname.new(@resources_path).rmtree
11
+ (Pathname.new(@fwk_path) + Pathname.new('Resources')).delete
12
+ end
13
+
14
+ def initialize(name, platform, embedded)
15
+ @name = name
16
+ @platform = platform
17
+ @embedded = embedded
18
+ end
19
+
20
+ def make
21
+ make_root
22
+ make_framework
23
+ make_headers
24
+ make_resources
25
+ make_current_version
26
+ end
27
+
28
+ private
29
+
30
+ def make_current_version
31
+ current_version_path = @versions_path + Pathname.new('../Current')
32
+ `ln -sf A #{current_version_path}`
33
+ `ln -sf Versions/Current/Headers #{@fwk_path}/`
34
+ `ln -sf Versions/Current/Resources #{@fwk_path}/`
35
+ `ln -sf Versions/Current/#{@name} #{@fwk_path}/`
36
+ end
37
+
38
+ def make_framework
39
+ @fwk_path = @root_path + Pathname.new(@name + '.framework')
40
+ @fwk_path.mkdir unless @fwk_path.exist?
41
+
42
+ @module_map_path = @fwk_path + Pathname.new('Modules')
43
+ @versions_path = @fwk_path + Pathname.new('Versions/A')
44
+ end
45
+
46
+ def make_headers
47
+ @headers_path = @versions_path + Pathname.new('Headers')
48
+ @headers_path.mkpath unless @headers_path.exist?
49
+ end
50
+
51
+ def make_resources
52
+ @resources_path = @versions_path + Pathname.new('Resources')
53
+ @resources_path.mkpath unless @resources_path.exist?
54
+ end
55
+
56
+ def make_root
57
+ @root_path = Pathname.new(@platform)
58
+
59
+ if @embedded
60
+ @root_path += Pathname.new(@name + '.embeddedframework')
61
+ end
62
+
63
+ @root_path.mkpath unless @root_path.exist?
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,32 @@
1
+ module Symbols
2
+ #
3
+ # performs symbol aliasing
4
+ #
5
+ # for each dependency:
6
+ # - determine symbols for classes and global constants
7
+ # - alias each symbol to Pod#{pod_name}_#{symbol}
8
+ # - put defines into `GCC_PREPROCESSOR_DEFINITIONS` for passing to Xcode
9
+ #
10
+ def mangle_for_pod_dependencies(pod_name, sandbox_root)
11
+ pod_libs = Dir.glob("#{sandbox_root}/build/lib*.a").select do |file|
12
+ file !~ /lib#{pod_name}.a$/
13
+ end
14
+
15
+ dummy_alias = alias_symbol "PodsDummy_#{pod_name}", pod_name
16
+ all_syms = [dummy_alias]
17
+
18
+ pod_libs.each do |pod_lib|
19
+ syms = Symbols.symbols_from_library(pod_lib)
20
+ all_syms += syms.map! { |sym| alias_symbol sym, pod_name }
21
+ end
22
+
23
+ "GCC_PREPROCESSOR_DEFINITIONS='$(inherited) #{all_syms.uniq.join(' ')}'"
24
+ end
25
+
26
+ def alias_symbol(sym, pod_name)
27
+ pod_name = pod_name.tr('-', '_')
28
+ sym + "=Pod#{pod_name}_" + sym
29
+ end
30
+
31
+ module_function :mangle_for_pod_dependencies, :alias_symbol
32
+ end
@@ -0,0 +1,253 @@
1
+ module Pod
2
+ class Command
3
+ class Package < Command
4
+ private
5
+
6
+ def build_static_sandbox(dynamic)
7
+ static_sandbox_root = if dynamic
8
+ Pathname.new(config.sandbox_root + '/Static')
9
+ else
10
+ Pathname.new(config.sandbox_root)
11
+ end
12
+ Sandbox.new(static_sandbox_root)
13
+ end
14
+
15
+ def install_pod(platform_name, sandbox)
16
+ podfile = podfile_from_spec(
17
+ @path,
18
+ @spec.name,
19
+ platform_name,
20
+ @spec.deployment_target(platform_name),
21
+ @subspecs,
22
+ @spec_sources
23
+ )
24
+
25
+ #添加插件
26
+ if work_directory != nil
27
+ @spec.dependencies.each do |dependency|
28
+ if dependency.to_s.include?"BocoJTI"
29
+ podfile.pre_install do |installer|
30
+ puts File.join(installer.sandbox.root.to_s ,"BocoJTI/BocoJTI/")
31
+ puts work_directory
32
+ require File.expand_path('BocoJTIConfigurator.rb', File.join(installer.sandbox.root.to_s, "BocoJTI/BocoJTI/Tools/"))
33
+ options = {
34
+ bocoJTIRoot: File.join(installer.sandbox.root.to_s ,"BocoJTI/BocoJTI/"),
35
+ jarPath: File.join(work_directory ,"jars"),
36
+ dependPath: File.join(work_directory ,"DependPath"),
37
+ }
38
+ bocoJTIRoot = options[:bocoJTIRoot] || installer.sandbox.root.to_s + '/BocoJTI/BocoJTI/'
39
+ BocoJTIConfigurator::install(installer, options)
40
+ end
41
+ break
42
+ end
43
+ end
44
+ end
45
+
46
+ static_installer = Installer.new(sandbox, podfile)
47
+ static_installer.install!
48
+
49
+ unless static_installer.nil?
50
+ static_installer.pods_project.targets.each do |target|
51
+ target.build_configurations.each do |config|
52
+ config.build_settings['CLANG_MODULES_AUTOLINK'] = 'NO'
53
+ config.build_settings['GCC_GENERATE_DEBUGGING_SYMBOLS'] = 'NO'
54
+ end
55
+ end
56
+ static_installer.pods_project.save
57
+ end
58
+
59
+ static_installer
60
+ end
61
+
62
+ def podfile_from_spec(path, spec_name, platform_name, deployment_target, subspecs, sources)
63
+ options = {}
64
+ if path
65
+ if @local
66
+ options[:path] = path
67
+ else
68
+ options[:podspec] = path
69
+ end
70
+ end
71
+ options[:subspecs] = subspecs if subspecs
72
+ Pod::Podfile.new do
73
+ sources.each { |s| source s }
74
+ platform(platform_name, deployment_target)
75
+ pod(spec_name, options)
76
+
77
+ install!('cocoapods',
78
+ :integrate_targets => false,
79
+ :deterministic_uuids => false)
80
+
81
+ target('packager') do
82
+ inherit! :complete
83
+ end
84
+ end
85
+ end
86
+
87
+ def binary_only?(spec)
88
+ deps = spec.dependencies.map { |dep| spec_with_name(dep.name) }
89
+ [spec, *deps].each do |specification|
90
+ %w(vendored_frameworks vendored_libraries).each do |attrib|
91
+ if specification.attributes_hash[attrib]
92
+ return true
93
+ end
94
+ end
95
+ end
96
+
97
+ false
98
+ end
99
+
100
+ def spec_with_name(name)
101
+ return if name.nil?
102
+
103
+ set = Pod::Config.instance.sources_manager.search(Dependency.new(name))
104
+ return nil if set.nil?
105
+
106
+ set.specification.root
107
+ end
108
+
109
+ def spec_with_path(path)
110
+ return if path.nil? || !Pathname.new(path).exist?
111
+
112
+ @path = Pathname.new(path).expand_path
113
+
114
+ if @path.directory?
115
+ help! @path + ': is a directory.'
116
+ return
117
+ end
118
+
119
+ unless ['.podspec', '.json'].include? @path.extname
120
+ help! @path + ': is not a podspec.'
121
+ return
122
+ end
123
+
124
+ Specification.from_file(@path)
125
+ end
126
+
127
+ #----------------------
128
+ # Dynamic Project Setup
129
+ #----------------------
130
+
131
+ def build_dynamic_sandbox(_static_sandbox, _static_installer)
132
+ dynamic_sandbox_root = Pathname.new(config.sandbox_root + '/Dynamic')
133
+ dynamic_sandbox = Sandbox.new(dynamic_sandbox_root)
134
+
135
+ dynamic_sandbox
136
+ end
137
+
138
+ def install_dynamic_pod(dynamic_sandbox, static_sandbox, static_installer)
139
+ # 1 Create a dynamic target for only the spec pod.
140
+ dynamic_target = build_dynamic_target(dynamic_sandbox, static_installer)
141
+
142
+ # 2. Build a new xcodeproj in the dynamic_sandbox with only the spec pod as a target.
143
+ project = prepare_pods_project(dynamic_sandbox, dynamic_target.name, static_installer)
144
+
145
+ # 3. Copy the source directory for the dynamic framework from the static sandbox.
146
+ copy_dynamic_target(static_sandbox, dynamic_target, dynamic_sandbox)
147
+
148
+ # 5. Update the file accecssors.
149
+ dynamic_target = update_file_accessors(dynamic_target, dynamic_sandbox)
150
+
151
+ # 6. Create the file references.
152
+ install_file_references(dynamic_sandbox, [dynamic_target], project)
153
+
154
+ # 7. Install the target.
155
+ install_library(dynamic_sandbox, dynamic_target)
156
+
157
+ # 9. Write the actual Xcodeproject to the dynamic sandbox.
158
+ write_pod_project(project, dynamic_sandbox)
159
+ end
160
+
161
+ def build_dynamic_target(dynamic_sandbox, static_installer)
162
+ spec_targets = static_installer.pod_targets.select do |target|
163
+ target.name == @spec.name
164
+ end
165
+ static_target = spec_targets[0]
166
+
167
+ dynamic_target = Pod::PodTarget.new(static_target.specs, static_target.target_definitions, dynamic_sandbox)
168
+ dynamic_target.host_requires_frameworks = true
169
+ dynamic_target.user_build_configurations = static_target.user_build_configurations
170
+ dynamic_target
171
+ end
172
+
173
+ def prepare_pods_project(dynamic_sandbox, spec_name, installer)
174
+ # Create a new pods project
175
+ pods_project = Pod::Project.new(dynamic_sandbox.project_path)
176
+
177
+ # Update build configurations
178
+ installer.analysis_result.all_user_build_configurations.each do |name, type|
179
+ pods_project.add_build_configuration(name, type)
180
+ end
181
+
182
+ # Add the pod group for only the dynamic framework
183
+ local = dynamic_sandbox.local?(spec_name)
184
+ path = dynamic_sandbox.pod_dir(spec_name)
185
+ was_absolute = dynamic_sandbox.local_path_was_absolute?(spec_name)
186
+ pods_project.add_pod_group(spec_name, path, local, was_absolute)
187
+
188
+ dynamic_sandbox.project = pods_project
189
+ pods_project
190
+ end
191
+
192
+ def copy_dynamic_target(static_sandbox, _dynamic_target, dynamic_sandbox)
193
+ command = "cp -a #{static_sandbox.root}/#{@spec.name} #{dynamic_sandbox.root}"
194
+ `#{command}`
195
+ end
196
+
197
+ def update_file_accessors(dynamic_target, dynamic_sandbox)
198
+ pod_root = dynamic_sandbox.pod_dir(dynamic_target.root_spec.name)
199
+
200
+ path_list = Sandbox::PathList.new(pod_root)
201
+ file_accessors = dynamic_target.specs.map do |spec|
202
+ Sandbox::FileAccessor.new(path_list, spec.consumer(dynamic_target.platform))
203
+ end
204
+
205
+ dynamic_target.file_accessors = file_accessors
206
+ dynamic_target
207
+ end
208
+
209
+ def install_file_references(dynamic_sandbox, pod_targets, pods_project)
210
+ installer = Pod::Installer::Xcode::PodsProjectGenerator::FileReferencesInstaller.new(dynamic_sandbox, pod_targets, pods_project)
211
+ installer.install!
212
+ end
213
+
214
+ def install_library(dynamic_sandbox, dynamic_target)
215
+ return if dynamic_target.target_definitions.flat_map(&:dependencies).empty?
216
+ target_installer = Pod::Installer::Xcode::PodsProjectGenerator::PodTargetInstaller.new(dynamic_sandbox, dynamic_target)
217
+ target_installer.install!
218
+
219
+ # Installs System Frameworks
220
+ dynamic_target.file_accessors.each do |file_accessor|
221
+ file_accessor.spec_consumer.frameworks.each do |framework|
222
+ if dynamic_target.should_build?
223
+ dynamic_target.native_target.add_system_framework(framework)
224
+ end
225
+ end
226
+
227
+ file_accessor.spec_consumer.libraries.each do |library|
228
+ if dynamic_target.should_build?
229
+ dynamic_target.native_target.add_system_library(library)
230
+ end
231
+ end
232
+ end
233
+ end
234
+
235
+ def write_pod_project(dynamic_project, dynamic_sandbox)
236
+ UI.message "- Writing Xcode project file to #{UI.path dynamic_sandbox.project_path}" do
237
+ dynamic_project.pods.remove_from_project if dynamic_project.pods.empty?
238
+ dynamic_project.development_pods.remove_from_project if dynamic_project.development_pods.empty?
239
+ dynamic_project.sort(:groups_position => :below)
240
+ dynamic_project.recreate_user_schemes(false)
241
+
242
+ # Edit search paths so that we can find our dependency headers
243
+ dynamic_project.targets.first.build_configuration_list.build_configurations.each do |config|
244
+ config.build_settings['HEADER_SEARCH_PATHS'] = "$(inherited) #{Dir.pwd}/Pods/Static/Headers/**"
245
+ config.build_settings['USER_HEADER_SEARCH_PATHS'] = "$(inherited) #{Dir.pwd}/Pods/Static/Headers/**"
246
+ config.build_settings['OTHER_LDFLAGS'] = '$(inherited) -ObjC'
247
+ end
248
+ dynamic_project.save
249
+ end
250
+ end
251
+ end
252
+ end
253
+ end
@@ -0,0 +1,63 @@
1
+ module Pod
2
+ class SpecBuilder
3
+ def initialize(spec, source, embedded, dynamic)
4
+ @spec = spec
5
+ @source = source.nil? ? '{ :path => \'.\' }' : source
6
+ @embedded = embedded
7
+ @dynamic = dynamic
8
+ end
9
+
10
+ def framework_path
11
+ if @embedded
12
+ @spec.name + '.embeddedframework' + '/' + @spec.name + '.framework'
13
+ else
14
+ @spec.name + '.framework'
15
+ end
16
+ end
17
+
18
+ def spec_platform(platform)
19
+ fwk_base = platform.name.to_s + '/' + framework_path
20
+ spec = <<RB
21
+ s.#{platform.name}.deployment_target = '#{platform.deployment_target}'
22
+ s.#{platform.name}.vendored_framework = '#{fwk_base}'
23
+ RB
24
+
25
+ %w(frameworks weak_frameworks libraries requires_arc xcconfig).each do |attribute|
26
+ attributes_hash = @spec.attributes_hash[platform.name.to_s]
27
+ next if attributes_hash.nil?
28
+ value = attributes_hash[attribute]
29
+ next if value.nil?
30
+
31
+ value = "'#{value}'" if value.class == String
32
+ spec += " s.#{platform.name}.#{attribute} = #{value}\n"
33
+ end
34
+ spec
35
+ end
36
+
37
+ def spec_metadata
38
+ spec = spec_header
39
+ spec
40
+ end
41
+
42
+ def spec_close
43
+ "end\n"
44
+ end
45
+
46
+ private
47
+
48
+ def spec_header
49
+ spec = "Pod::Spec.new do |s|\n"
50
+
51
+ %w(name version summary license authors homepage description social_media_url
52
+ docset_url documentation_url screenshots frameworks weak_frameworks libraries requires_arc
53
+ deployment_target xcconfig).each do |attribute|
54
+ value = @spec.attributes_hash[attribute]
55
+ next if value.nil?
56
+ value = value.dump if value.class == String
57
+ spec += " s.#{attribute} = #{value}\n"
58
+ end
59
+
60
+ spec + " s.source = #{@source}\n\n"
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,42 @@
1
+ module Symbols
2
+ def symbols_from_library(library)
3
+ syms = `nm -gU #{library}`.split("\n")
4
+ result = classes_from_symbols(syms)
5
+ result += constants_from_symbols(syms)
6
+
7
+ result.select do |e|
8
+ case e
9
+ when 'llvm.cmdline', 'llvm.embedded.module', '__clang_at_available_requires_core_foundation_framework'
10
+ false
11
+ else
12
+ true
13
+ end
14
+ end
15
+ end
16
+
17
+ module_function :symbols_from_library
18
+
19
+ private
20
+
21
+ def classes_from_symbols(syms)
22
+ classes = syms.select { |klass| klass[/OBJC_CLASS_\$_/] }
23
+ classes = classes.uniq
24
+ classes.map! { |klass| klass.gsub(/^.*\$_/, '') }
25
+ end
26
+
27
+ def constants_from_symbols(syms)
28
+ consts = syms.select { |const| const[/ S /] }
29
+ consts = consts.select { |const| const !~ /OBJC|\.eh/ }
30
+ consts = consts.uniq
31
+ consts = consts.map! { |const| const.gsub(/^.* _/, '') }
32
+
33
+ other_consts = syms.select { |const| const[/ T /] }
34
+ other_consts = other_consts.uniq
35
+ other_consts = other_consts.map! { |const| const.gsub(/^.* _/, '') }
36
+
37
+ consts + other_consts
38
+ end
39
+
40
+ module_function :classes_from_symbols
41
+ module_function :constants_from_symbols
42
+ end