cocoapods-packager 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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