cocoapods-packager 1.3.0 → 1.4.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.
@@ -25,7 +25,7 @@ module Framework
25
25
  make_current_version
26
26
  end
27
27
 
28
- :private
28
+ private
29
29
 
30
30
  def make_current_version
31
31
  current_version_path = @versions_path + Pathname.new('../Current')
@@ -8,8 +8,8 @@ module Symbols
8
8
  # - put defines into `GCC_PREPROCESSOR_DEFINITIONS` for passing to Xcode
9
9
  #
10
10
  def mangle_for_pod_dependencies(pod_name, sandbox_root)
11
- pod_libs = Dir.glob("#{sandbox_root}/build/lib*.a").select do
12
- |file| file !~ /lib#{pod_name}.a$/
11
+ pod_libs = Dir.glob("#{sandbox_root}/build/lib*.a").select do |file|
12
+ file !~ /lib#{pod_name}.a$/
13
13
  end
14
14
 
15
15
  dummy_alias = alias_symbol "PodsDummy_#{pod_name}", pod_name
@@ -20,11 +20,11 @@ module Symbols
20
20
  all_syms += syms.map! { |sym| alias_symbol sym, pod_name }
21
21
  end
22
22
 
23
- "GCC_PREPROCESSOR_DEFINITIONS='${inherited} #{all_syms.uniq.join(' ')}'"
23
+ "GCC_PREPROCESSOR_DEFINITIONS='$(inherited) #{all_syms.uniq.join(' ')}'"
24
24
  end
25
25
 
26
26
  def alias_symbol(sym, pod_name)
27
- pod_name = pod_name.gsub('-', '_')
27
+ pod_name = pod_name.tr('-', '_')
28
28
  sym + "=Pod#{pod_name}_" + sym
29
29
  end
30
30
 
@@ -1,48 +1,70 @@
1
1
  module Pod
2
2
  class Command
3
3
  class Package < Command
4
- :private
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
5
14
 
6
- def install_pod(platform_name)
15
+ def install_pod(platform_name, sandbox)
7
16
  podfile = podfile_from_spec(
8
17
  File.basename(@path),
9
18
  @spec.name,
10
19
  platform_name,
11
20
  @spec.deployment_target(platform_name),
12
21
  @subspecs,
13
- @spec_sources,
22
+ @spec_sources
14
23
  )
15
24
 
16
- sandbox = Sandbox.new(config.sandbox_root)
17
- installer = Installer.new(sandbox, podfile)
18
- installer.install!
25
+ static_installer = Installer.new(sandbox, podfile)
26
+ static_installer.install!
19
27
 
20
- unless installer.nil?
21
- installer.pods_project.targets.each do |target|
28
+ unless static_installer.nil?
29
+ static_installer.pods_project.targets.each do |target|
22
30
  target.build_configurations.each do |config|
23
31
  config.build_settings['CLANG_MODULES_AUTOLINK'] = 'NO'
32
+ config.build_settings['GCC_GENERATE_DEBUGGING_SYMBOLS'] = 'NO'
24
33
  end
25
34
  end
26
- installer.pods_project.save
35
+ static_installer.pods_project.save
27
36
  end
28
37
 
29
- sandbox
38
+ static_installer
30
39
  end
31
40
 
32
41
  def podfile_from_spec(path, spec_name, platform_name, deployment_target, subspecs, sources)
42
+ options = {}
43
+ if path
44
+ options[:podspec] = path
45
+ else
46
+ options[:path] = '.'
47
+ end
48
+ options[:subspecs] = subspecs if subspecs
33
49
  Pod::Podfile.new do
34
50
  sources.each { |s| source s }
35
51
  platform(platform_name, deployment_target)
36
- if path
37
- if subspecs
38
- subspecs.each do |subspec|
39
- pod spec_name + '/' + subspec, :podspec => path
52
+ pod(spec_name, options)
53
+
54
+ install!('cocoapods',
55
+ :integrate_targets => false,
56
+ :deterministic_uuids => false)
57
+
58
+ target('packager') do
59
+ if path
60
+ if subspecs
61
+ subspecs.each do |subspec|
62
+ pod spec_name + '/' + subspec, :podspec => path
63
+ end
64
+ else
65
+ pod spec_name, :podspec => path
40
66
  end
41
- else
42
- pod spec_name, :podspec => path
43
- end
44
- else
45
- if subspecs
67
+ elsif subspecs
46
68
  subspecs.each do |subspec|
47
69
  pod spec_name + '/' + subspec, :path => '.'
48
70
  end
@@ -55,7 +77,6 @@ module Pod
55
77
 
56
78
  def binary_only?(spec)
57
79
  deps = spec.dependencies.map { |dep| spec_with_name(dep.name) }
58
-
59
80
  [spec, *deps].each do |specification|
60
81
  %w(vendored_frameworks vendored_libraries).each do |attrib|
61
82
  if specification.attributes_hash[attrib]
@@ -70,7 +91,7 @@ module Pod
70
91
  def spec_with_name(name)
71
92
  return if name.nil?
72
93
 
73
- set = SourcesManager.search(Dependency.new(name))
94
+ set = Pod::Config.instance.sources_manager.search(Dependency.new(name))
74
95
  return nil if set.nil?
75
96
 
76
97
  set.specification.root
@@ -93,6 +114,139 @@ module Pod
93
114
 
94
115
  Specification.from_file(path)
95
116
  end
117
+
118
+ #----------------------
119
+ # Dynamic Project Setup
120
+ #----------------------
121
+
122
+ def build_dynamic_sandbox(_static_sandbox, _static_installer)
123
+ dynamic_sandbox_root = Pathname.new(config.sandbox_root + '/Dynamic')
124
+ dynamic_sandbox = Sandbox.new(dynamic_sandbox_root)
125
+
126
+ dynamic_sandbox
127
+ end
128
+
129
+ def install_dynamic_pod(dynamic_sandbox, static_sandbox, static_installer)
130
+ # 1 Create a dynamic target for only the spec pod.
131
+ dynamic_target = build_dynamic_target(dynamic_sandbox, static_installer)
132
+
133
+ # 2. Build a new xcodeproj in the dynamic_sandbox with only the spec pod as a target.
134
+ project = prepare_pods_project(dynamic_sandbox, dynamic_target.name, static_installer)
135
+
136
+ # 3. Copy the source directory for the dynamic framework from the static sandbox.
137
+ copy_dynamic_target(static_sandbox, dynamic_target, dynamic_sandbox)
138
+
139
+ # 4. Copy the supporting files for the dynamic framework from the static sandbox.
140
+ copy_dynamic_supporting_files(static_sandbox, dynamic_target, dynamic_sandbox)
141
+
142
+ # 5. Update the file accecssors.
143
+ dynamic_target = update_file_accessors(dynamic_target, dynamic_sandbox)
144
+
145
+ # 6. Create the file references.
146
+ install_file_references(dynamic_sandbox, [dynamic_target], project)
147
+
148
+ # 7. Install the target.
149
+ install_library(dynamic_sandbox, dynamic_target)
150
+
151
+ # 9. Write the actual Xcodeproject to the dynamic sandbox.
152
+ write_pod_project(project, dynamic_sandbox)
153
+ end
154
+
155
+ def build_dynamic_target(dynamic_sandbox, static_installer)
156
+ spec_targets = static_installer.pod_targets.select do |target|
157
+ target.name == @spec.name
158
+ end
159
+ static_target = spec_targets[0]
160
+
161
+ dynamic_target = Pod::PodTarget.new(static_target.specs, static_target.target_definitions, dynamic_sandbox)
162
+ dynamic_target.host_requires_frameworks = true
163
+ dynamic_target.user_build_configurations = static_target.user_build_configurations
164
+ dynamic_target
165
+ end
166
+
167
+ def prepare_pods_project(dynamic_sandbox, spec_name, installer)
168
+ # Create a new pods project
169
+ pods_project = Pod::Project.new(dynamic_sandbox.project_path)
170
+
171
+ # Update build configurations
172
+ installer.analysis_result.all_user_build_configurations.each do |name, type|
173
+ pods_project.add_build_configuration(name, type)
174
+ end
175
+
176
+ # Add the pod group for only the dynamic framework
177
+ local = dynamic_sandbox.local?(spec_name)
178
+ path = dynamic_sandbox.pod_dir(spec_name)
179
+ was_absolute = dynamic_sandbox.local_path_was_absolute?(spec_name)
180
+ pods_project.add_pod_group(spec_name, path, local, was_absolute)
181
+
182
+ dynamic_sandbox.project = pods_project
183
+ pods_project
184
+ end
185
+
186
+ def copy_dynamic_target(static_sandbox, _dynamic_target, dynamic_sandbox)
187
+ command = "cp -a #{static_sandbox.root}/#{@spec.name} #{dynamic_sandbox.root}"
188
+ `#{command}`
189
+ end
190
+
191
+ def copy_dynamic_supporting_files(_static_sandbox, dynamic_target, _dynamic_sandbox)
192
+ support_dir = Pathname.new(dynamic_target.support_files_dir.to_s.chomp("/#{dynamic_target.name}"))
193
+ support_dir.mkdir
194
+ end
195
+
196
+ def update_file_accessors(dynamic_target, dynamic_sandbox)
197
+ pod_root = dynamic_sandbox.pod_dir(dynamic_target.root_spec.name)
198
+
199
+ path_list = Sandbox::PathList.new(pod_root)
200
+ file_accessors = dynamic_target.specs.map do |spec|
201
+ Sandbox::FileAccessor.new(path_list, spec.consumer(dynamic_target.platform))
202
+ end
203
+
204
+ dynamic_target.file_accessors = file_accessors
205
+ dynamic_target
206
+ end
207
+
208
+ def install_file_references(dynamic_sandbox, pod_targets, pods_project)
209
+ installer = Pod::Installer::FileReferencesInstaller.new(dynamic_sandbox, pod_targets, pods_project)
210
+ installer.install!
211
+ end
212
+
213
+ def install_library(dynamic_sandbox, dynamic_target)
214
+ return if dynamic_target.target_definitions.flat_map(&:dependencies).empty?
215
+ target_installer = Pod::Installer::PodTargetInstaller.new(dynamic_sandbox, dynamic_target)
216
+ target_installer.install!
217
+
218
+ # Installs System Frameworks
219
+ dynamic_target.file_accessors.each do |file_accessor|
220
+ file_accessor.spec_consumer.frameworks.each do |framework|
221
+ if dynamic_target.should_build?
222
+ dynamic_target.native_target.add_system_framework(framework)
223
+ end
224
+ end
225
+
226
+ file_accessor.spec_consumer.libraries.each do |library|
227
+ if dynamic_target.should_build?
228
+ dynamic_target.native_target.add_system_library(library)
229
+ end
230
+ end
231
+ end
232
+ end
233
+
234
+ def write_pod_project(dynamic_project, dynamic_sandbox)
235
+ UI.message "- Writing Xcode project file to #{UI.path dynamic_sandbox.project_path}" do
236
+ dynamic_project.pods.remove_from_project if dynamic_project.pods.empty?
237
+ dynamic_project.development_pods.remove_from_project if dynamic_project.development_pods.empty?
238
+ dynamic_project.sort(:groups_position => :below)
239
+ dynamic_project.recreate_user_schemes(false)
240
+
241
+ # Edit search paths so that we can find our dependency headers
242
+ dynamic_project.targets.first.build_configuration_list.build_configurations.each do |config|
243
+ config.build_settings['HEADER_SEARCH_PATHS'] = "$(inherited) #{Dir.pwd}/Pods/Static/Headers/**"
244
+ config.build_settings['USER_HEADER_SEARCH_PATHS'] = "$(inherited) #{Dir.pwd}/Pods/Static/Headers/**"
245
+ config.build_settings['OTHER_LDFLAGS'] = '$(inherited) -ObjC'
246
+ end
247
+ dynamic_project.save
248
+ end
249
+ end
96
250
  end
97
251
  end
98
252
  end
@@ -1,9 +1,10 @@
1
1
  module Pod
2
2
  class SpecBuilder
3
- def initialize(spec, source, embedded)
3
+ def initialize(spec, source, embedded, dynamic)
4
4
  @spec = spec
5
- @source = source.nil? ? '{}' : source
5
+ @source = source.nil? ? '{ :path => \'.\' }' : source
6
6
  @embedded = embedded
7
+ @dynamic = dynamic
7
8
  end
8
9
 
9
10
  def framework_path
@@ -16,13 +17,20 @@ module Pod
16
17
 
17
18
  def spec_platform(platform)
18
19
  fwk_base = platform.name.to_s + '/' + framework_path
19
- spec = <<SPEC
20
- s.#{platform.name}.platform = :#{platform.symbolic_name}, '#{platform.deployment_target}'
20
+ spec = if @dynamic
21
+ <<RB
22
+ s.#{platform.name}.deployment_target = '#{platform.deployment_target}'
23
+ s.#{platform.name}.vendored_framework = '#{fwk_base}'
24
+ RB
25
+ else
26
+ <<SPEC
27
+ s.#{platform.name}.deployment_target = '#{platform.deployment_target}'
21
28
  s.#{platform.name}.preserve_paths = '#{fwk_base}'
22
29
  s.#{platform.name}.public_header_files = '#{fwk_base}/Versions/A/Headers/*.h'
23
30
  s.#{platform.name}.resource = '#{fwk_base}/Versions/A/Resources/**/*'
24
31
  s.#{platform.name}.vendored_frameworks = '#{fwk_base}'
25
32
  SPEC
33
+ end
26
34
 
27
35
  %w(frameworks libraries requires_arc xcconfig).each do |attribute|
28
36
  attributes_hash = @spec.attributes_hash[platform.name.to_s]
@@ -33,13 +41,11 @@ SPEC
33
41
  value = "'#{value}'" if value.class == String
34
42
  spec += " s.#{platform.name}.#{attribute} = #{value}\n"
35
43
  end
36
-
37
44
  spec
38
45
  end
39
46
 
40
47
  def spec_metadata
41
48
  spec = spec_header
42
- spec += spec_single_platform_fix
43
49
  spec
44
50
  end
45
51
 
@@ -47,7 +53,7 @@ SPEC
47
53
  "end\n"
48
54
  end
49
55
 
50
- :private
56
+ private
51
57
 
52
58
  def spec_header
53
59
  spec = "Pod::Spec.new do |s|\n"
@@ -64,15 +70,5 @@ SPEC
64
70
 
65
71
  spec + " s.source = #{@source}\n\n"
66
72
  end
67
-
68
- def spec_single_platform_fix
69
- return '' if @spec.available_platforms.length > 1
70
-
71
- platform = @spec.available_platforms.first
72
-
73
- <<SPEC
74
- s.platform = :#{platform.symbolic_name}, '#{platform.deployment_target}'
75
- SPEC
76
- end
77
73
  end
78
74
  end
@@ -1,14 +1,15 @@
1
1
  module Symbols
2
2
  def symbols_from_library(library)
3
3
  syms = `nm -gU #{library}`.split("\n")
4
-
5
4
  result = classes_from_symbols(syms)
6
- result + constants_from_symbols(syms)
5
+ result += constants_from_symbols(syms)
6
+
7
+ result.reject { |e| e == 'llvm.cmdline' || e == 'llvm.embedded.module' }
7
8
  end
8
9
 
9
10
  module_function :symbols_from_library
10
11
 
11
- :private
12
+ private
12
13
 
13
14
  def classes_from_symbols(syms)
14
15
  classes = syms.select { |klass| klass[/OBJC_CLASS_\$_/] }
@@ -1,5 +1,5 @@
1
1
  module Pod
2
2
  module Packager
3
- VERSION = '1.3.0'
3
+ VERSION = '1.4.0'.freeze
4
4
  end
5
5
  end
@@ -1,12 +1,11 @@
1
1
  require 'tmpdir'
2
-
3
2
  module Pod
4
3
  class Command
5
4
  class Package < Command
6
5
  self.summary = 'Package a podspec into a static library.'
7
6
  self.arguments = [
8
7
  CLAide::Argument.new('NAME', true),
9
- CLAide::Argument.new('SOURCE', false),
8
+ CLAide::Argument.new('SOURCE', false)
10
9
  ]
11
10
 
12
11
  def self.options
@@ -15,9 +14,12 @@ module Pod
15
14
  ['--no-mangle', 'Do not mangle symbols of depedendant Pods.'],
16
15
  ['--embedded', 'Generate embedded frameworks.'],
17
16
  ['--library', 'Generate static libraries.'],
18
- ['--subspecs', 'Only include the given subspecs'],
17
+ ['--dynamic', 'Generate dynamic framework.'],
18
+ ['--exclude-deps', 'Exclude symbols from dependencies.'],
19
+ ['--configuration', 'Build the specified configuration (e.g. Debug). Defaults to Release'],
20
+ ['--subspecs', 'Only include the given subspecs'],
19
21
  ['--spec-sources=private,https://github.com/CocoaPods/Specs.git', 'The sources to pull dependant ' \
20
- 'pods from (defaults to https://github.com/CocoaPods/Specs.git)'],
22
+ 'pods from (defaults to https://github.com/CocoaPods/Specs.git)']
21
23
  ]
22
24
  end
23
25
 
@@ -25,7 +27,9 @@ module Pod
25
27
  @embedded = argv.flag?('embedded')
26
28
  @force = argv.flag?('force')
27
29
  @library = argv.flag?('library')
30
+ @dynamic = argv.flag?('dynamic')
28
31
  @mangle = argv.flag?('mangle', true)
32
+ @exclude_deps = argv.flag?('exclude-deps', false)
29
33
  @name = argv.shift_argument
30
34
  @source = argv.shift_argument
31
35
  @spec_sources = argv.option('spec-sources', 'https://github.com/CocoaPods/Specs.git').split(',')
@@ -33,6 +37,8 @@ module Pod
33
37
  subspecs = argv.option('subspecs')
34
38
  @subspecs = subspecs.split(',') unless subspecs.nil?
35
39
 
40
+ @config = argv.option('configuration', 'Release')
41
+
36
42
  @source_dir = Dir.pwd
37
43
  @spec = spec_with_path(@name)
38
44
  @spec = spec_with_name(@name) unless @spec
@@ -42,7 +48,8 @@ module Pod
42
48
  def validate!
43
49
  super
44
50
  help! 'A podspec name or path is required.' unless @spec
45
- help! 'podspec has binary-only depedencies, mangling not possible.' if binary_only? @spec
51
+ help! 'podspec has binary-only depedencies, mangling not possible.' if @mangle && binary_only?(@spec)
52
+ help! '--exclude-deps option can only be used for static libraries' if @exclude_deps && @dynamic
46
53
  end
47
54
 
48
55
  def run
@@ -54,21 +61,27 @@ module Pod
54
61
  target_dir, work_dir = create_working_directory
55
62
  return if target_dir.nil?
56
63
  build_package
64
+
57
65
  `mv "#{work_dir}" "#{target_dir}"`
58
66
  Dir.chdir(@source_dir)
59
67
  end
60
68
 
61
- :private
69
+ private
62
70
 
63
71
  def build_in_sandbox(platform)
72
+ config.installation_root = Pathname.new(Dir.pwd)
64
73
  config.sandbox_root = 'Pods'
65
- config.integrate_targets = false
66
- config.skip_repo_update = true
67
74
 
68
- sandbox = install_pod(platform.name)
75
+ static_sandbox = build_static_sandbox(@dynamic)
76
+ static_installer = install_pod(platform.name, static_sandbox)
77
+
78
+ if @dynamic
79
+ dynamic_sandbox = build_dynamic_sandbox(static_sandbox, static_installer)
80
+ install_dynamic_pod(dynamic_sandbox, static_sandbox, static_installer)
81
+ end
69
82
 
70
83
  begin
71
- perform_build(platform, sandbox)
84
+ perform_build(platform, static_sandbox, dynamic_sandbox)
72
85
 
73
86
  ensure # in case the build fails; see Builder#xcodebuild.
74
87
  Pathname.new(config.sandbox_root).rmtree
@@ -77,7 +90,7 @@ module Pod
77
90
  end
78
91
 
79
92
  def build_package
80
- builder = SpecBuilder.new(@spec, @source, @embedded)
93
+ builder = SpecBuilder.new(@spec, @source, @embedded, @dynamic)
81
94
  newspec = builder.spec_metadata
82
95
 
83
96
  @spec.available_platforms.each do |platform|
@@ -115,14 +128,26 @@ module Pod
115
128
  [target_dir, work_dir]
116
129
  end
117
130
 
118
- def perform_build(platform, sandbox)
131
+ def perform_build(platform, static_sandbox, dynamic_sandbox)
132
+ static_sandbox_root = config.sandbox_root.to_s
133
+
134
+ if @dynamic
135
+ static_sandbox_root = "#{static_sandbox_root}/#{static_sandbox.root.to_s.split('/').last}"
136
+ dynamic_sandbox_root = "#{config.sandbox_root}/#{dynamic_sandbox.root.to_s.split('/').last}"
137
+ end
138
+
119
139
  builder = Pod::Builder.new(
120
140
  @source_dir,
121
- config.sandbox_root,
122
- sandbox.public_headers.root,
141
+ static_sandbox_root,
142
+ dynamic_sandbox_root,
143
+ static_sandbox.public_headers.root,
123
144
  @spec,
124
145
  @embedded,
125
- @mangle)
146
+ @mangle,
147
+ @dynamic,
148
+ @config,
149
+ @exclude_deps
150
+ )
126
151
 
127
152
  builder.build(platform, @library)
128
153