cocoapods 0.20.2 → 0.21.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4046f40b104b268eb0dcc90991f868953707d6c4
4
+ data.tar.gz: 006fd40b93468988e5cca4c9388e9e00a1b7ca02
5
+ SHA512:
6
+ metadata.gz: 6fa144dd19952870b080632f055abb1111dfcdf26e37ba5b16d2f602b77bd56766cb7cf5ed50e2613a299ffd778ddec3b52a3f221d416122e38897f68828c31d
7
+ data.tar.gz: 86cfacba4348f91b159e486984b00bdb04493db61ec5bccf50a1a1b8358666a0942c9a3bf0b7212836a2670300c35bc0ea06ef0e192163268a4a3b4431b36fef
@@ -2,6 +2,32 @@
2
2
 
3
3
  To install or update CocoaPods see this [guide](http://docs.cocoapods.org/guides/installing_cocoapods.html).
4
4
 
5
+
6
+ ## 0.21.0.rc1
7
+ [CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.20.2...0.21.0.rc1)
8
+ • [cocoapods-core](https://github.com/CocoaPods/Core/compare/0.20.2...0.21.0.rc1)
9
+ • [Xcodeproj](https://github.com/CocoaPods/Xcodeproj/compare/0.6.0...0.7.0)
10
+
11
+ ###### Enhancements
12
+
13
+ * Pods are now built in dedicated targets. This enhancement isolates the build
14
+ environment of each Pod from other ones eliminating pollution issues. It also
15
+ introduces an important architectural improvement which lays the foundation
16
+ for the upcoming CocoaPods features. Stay tuned! This feature has been
17
+ implemented by [Jeremy Slater](https://github.com/jasl8r).
18
+ [#841](https://github.com/CocoaPods/CocoaPods/issues/1080)
19
+
20
+ * Reduced external dependencies and deprecation of Rake::FileList.
21
+ [#1080](https://github.com/CocoaPods/CocoaPods/issues/1080)
22
+
23
+ ###### Bug fixes
24
+
25
+ * Fixed crash due to Podfile.lock containing multiple version requirements for
26
+ a Pod. [#1076](https://github.com/CocoaPods/CocoaPods/issues/1076)
27
+ * Fixed a build error due to the copy resources script using the same temporary
28
+ file for multiple targets.
29
+ [#1099](https://github.com/CocoaPods/CocoaPods/issues/1099)
30
+
5
31
  ## 0.20.2
6
32
  [CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.20.1...0.20.2)
7
33
 
@@ -7,7 +7,6 @@ module Pod
7
7
 
8
8
  require 'cocoapods/gem_version'
9
9
  require 'cocoapods-core'
10
- require 'cocoapods/file_list'
11
10
  require 'cocoapods/config'
12
11
  require 'cocoapods/downloader'
13
12
 
@@ -43,7 +42,9 @@ module Pod
43
42
  autoload :ExternalSources, 'cocoapods/external_sources'
44
43
  autoload :Installer, 'cocoapods/installer'
45
44
  autoload :SourcesManager, 'cocoapods/sources_manager'
46
- autoload :Library, 'cocoapods/library'
45
+ autoload :Target, 'cocoapods/target'
46
+ autoload :AggregateTarget, 'cocoapods/target/aggregate_target'
47
+ autoload :PodTarget, 'cocoapods/target/pod_target'
47
48
  autoload :Project, 'cocoapods/project'
48
49
  autoload :Resolver, 'cocoapods/resolver'
49
50
  autoload :Sandbox, 'cocoapods/sandbox'
@@ -52,14 +53,17 @@ module Pod
52
53
 
53
54
  module Generator
54
55
  autoload :Acknowledgements, 'cocoapods/generator/acknowledgements'
56
+ autoload :Markdown, 'cocoapods/generator/acknowledgements/markdown'
57
+ autoload :Plist, 'cocoapods/generator/acknowledgements/plist'
55
58
  autoload :BridgeSupport, 'cocoapods/generator/bridge_support'
56
59
  autoload :CopyResourcesScript, 'cocoapods/generator/copy_resources_script'
57
60
  autoload :DummySource, 'cocoapods/generator/dummy_source'
58
- autoload :Markdown, 'cocoapods/generator/acknowledgements/markdown'
59
- autoload :Plist, 'cocoapods/generator/acknowledgements/plist'
60
61
  autoload :PrefixHeader, 'cocoapods/generator/prefix_header'
61
62
  autoload :TargetEnvironmentHeader, 'cocoapods/generator/target_environment_header'
62
63
  autoload :XCConfig, 'cocoapods/generator/xcconfig'
64
+ autoload :AggregateXCConfig, 'cocoapods/generator/xcconfig/aggregate_xcconfig'
65
+ autoload :PublicPodXCConfig, 'cocoapods/generator/xcconfig/public_pod_xcconfig'
66
+ autoload :PrivatePodXCConfig, 'cocoapods/generator/xcconfig/private_pod_xcconfig'
63
67
  end
64
68
 
65
69
  module Hooks
@@ -32,15 +32,6 @@ module Pod
32
32
 
33
33
  def run
34
34
  if repo_id_match = (@url || @name_or_url).match(/github.com\/([^\/\.]*\/[^\/\.]*)\.*/)
35
- # This is to make sure Faraday doesn't warn the user about the `system_timer` gem missing.
36
- old_warn, $-w = $-w, nil
37
- begin
38
- require 'faraday'
39
- ensure
40
- $-w = old_warn
41
- end
42
- require 'octokit'
43
-
44
35
  repo_id = repo_id_match[1]
45
36
  data = github_data_for_template(repo_id)
46
37
  data[:name] = @name_or_url if @url
@@ -410,8 +401,8 @@ module Pod
410
401
  end
411
402
 
412
403
  def github_data_for_template(repo_id)
413
- repo = Octokit.repo(repo_id)
414
- user = Octokit.user(repo['owner']['login'])
404
+ repo = GitHub.repo(repo_id)
405
+ user = GitHub.user(repo['owner']['login'])
415
406
  data = {}
416
407
 
417
408
  data[:name] = repo['name']
@@ -425,7 +416,7 @@ module Pod
425
416
  end
426
417
 
427
418
  def suggested_ref_and_version(repo)
428
- tags = Octokit.tags(:username => repo['owner']['login'], :repo => repo['name']).map {|tag| tag["name"]}
419
+ tags = GitHub.tags(repo['html_url']).map {|tag| tag["name"]}
429
420
  versions_tags = {}
430
421
  tags.each do |tag|
431
422
  clean_tag = tag.gsub(/^v(er)? ?/,'')
@@ -434,9 +425,9 @@ module Pod
434
425
  version = versions_tags.keys.sort.last || '0.0.1'
435
426
  data = {:version => version}
436
427
  if version == '0.0.1'
437
- branches = Octokit.branches(:username => repo['owner']['login'], :repo => repo['name'])
428
+ branches = GitHub.branches(repo['html_url'])
438
429
  master_name = repo['master_branch'] || 'master'
439
- master = branches.select {|branch| branch['name'] == master_name }.first
430
+ master = branches.find {|branch| branch['name'] == master_name }
440
431
  data[:ref_type] = ':commit'
441
432
  data[:ref] = master['commit']['sha']
442
433
  else
@@ -1,6 +1,6 @@
1
1
  module Pod
2
2
  # The version of the cocoapods command line tool.
3
3
  #
4
- VERSION = '0.20.2' unless defined? Pod::VERSION
4
+ VERSION = '0.21.0.rc1' unless defined? Pod::VERSION
5
5
  end
6
6
 
@@ -80,8 +80,8 @@ module Pod
80
80
  INSTALL_RESOURCES_FUCTION = <<EOS
81
81
  #!/bin/sh
82
82
 
83
- RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy.txt
84
- touch "$RESOURCES_TO_COPY"
83
+ RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt
84
+ > "$RESOURCES_TO_COPY"
85
85
 
86
86
  install_resource()
87
87
  {
@@ -1,85 +1,28 @@
1
1
  module Pod
2
2
  module Generator
3
3
 
4
- # Generates an xcconfig file for each target of the Pods project. The
5
- # configuration file should be used by the user target as well.
4
+ # Generates Xcode configuration files. A configuration file is generated
5
+ # for each Pod and for each Pod target definition. The aggregates the
6
+ # configurations of the Pods and define target specific settings.
6
7
  #
7
8
  class XCConfig
8
9
 
9
- # @return [Sandbox] the sandbox where the Pods project is installed.
10
+ # @return [Target] the target represented by this xcconfig.
10
11
  #
12
+ attr_reader :target
11
13
  attr_reader :sandbox
12
14
 
13
- # @return [Array<Specification::Consumer>] the consumers for the
14
- # specifications of the library which needs the xcconfig.
15
+ # @param [Target] target @see target
15
16
  #
16
- attr_reader :spec_consumers
17
-
18
- # @return [String] the relative path of the Pods root respect the user
19
- # project that should be integrated by this library.
20
- #
21
- attr_reader :relative_pods_root
22
-
23
- # @param [Sandbox] sandbox @see sandbox
24
- # @param [Array<LocalPod>] pods @see pods
25
- # @param [String] relative_pods_root @see relative_pods_root
26
- #
27
- def initialize(sandbox, spec_consumers, relative_pods_root)
28
- @sandbox = sandbox
29
- @spec_consumers = spec_consumers
30
- @relative_pods_root = relative_pods_root
31
- end
32
-
33
- # @return [Bool] whether the Podfile specifies to add the `-fobjc-arc`
34
- # flag for compatibility.
35
- #
36
- attr_accessor :set_arc_compatibility_flag
37
-
38
- #-----------------------------------------------------------------------#
39
-
40
- # Generates the xcconfig for the library.
41
- #
42
- # @return [Xcodeproj::Config]
43
- #
44
- # @note The value `PODS_HEADERS_SEARCH_PATHS` is used to store the headers
45
- # so xcconfig can reference the variable.
46
- #
47
- def generate
48
- ld_flags = '-ObjC'
49
- if set_arc_compatibility_flag && spec_consumers.any? { |consumer| consumer.requires_arc }
50
- ld_flags << ' -fobjc-arc'
51
- end
52
-
53
- @xcconfig = Xcodeproj::Config.new({
54
- 'ALWAYS_SEARCH_USER_PATHS' => 'YES',
55
- 'OTHER_LDFLAGS' => ld_flags,
56
- 'HEADER_SEARCH_PATHS' => '${PODS_HEADERS_SEARCH_PATHS}',
57
- 'PODS_ROOT' => relative_pods_root,
58
- 'PODS_HEADERS_SEARCH_PATHS' => '${PODS_PUBLIC_HEADERS_SEARCH_PATHS}',
59
- 'PODS_BUILD_HEADERS_SEARCH_PATHS' => quote(sandbox.build_headers.search_paths),
60
- 'PODS_PUBLIC_HEADERS_SEARCH_PATHS' => quote(sandbox.public_headers.search_paths),
61
- 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) COCOAPODS=1'
62
- })
63
-
64
- spec_consumers.each do |consumer|
65
- add_spec_build_settings_to_xcconfig(consumer, @xcconfig)
66
- end
67
-
68
- @xcconfig
17
+ def initialize(target)
18
+ @target = target
19
+ @sandbox = target.sandbox
69
20
  end
70
21
 
71
22
  # @return [Xcodeproj::Config] The generated xcconfig.
72
23
  #
73
24
  attr_reader :xcconfig
74
25
 
75
- # @return [Hash] The settings of the xcconfig that the Pods project
76
- # needs to override.
77
- #
78
- def self.pods_project_settings
79
- { 'PODS_ROOT' => '${SRCROOT}',
80
- 'PODS_HEADERS_SEARCH_PATHS' => '${PODS_BUILD_HEADERS_SEARCH_PATHS}' }
81
- end
82
-
83
26
  # Generates and saves the xcconfig to the given path.
84
27
  #
85
28
  # @param [Pathname] path
@@ -88,7 +31,7 @@ module Pod
88
31
  # @return [void]
89
32
  #
90
33
  def save_as(path)
91
- path.open('w') { |file| file.write(generate) }
34
+ generate.save_as(path)
92
35
  end
93
36
 
94
37
  #-----------------------------------------------------------------------#
@@ -102,12 +45,12 @@ module Pod
102
45
  # Podfile.
103
46
  #
104
47
  def default_ld_flags
105
- flags = %w[ -ObjC ]
106
- requires_arc = pods.any? { |pod| pod.requires_arc? }
107
- if requires_arc && set_arc_compatibility_flag
108
- flags << '-fobjc-arc'
48
+ ld_flags = '-ObjC'
49
+ if target.target_definition.podfile.set_arc_compatibility_flag? and
50
+ target.spec_consumers.any? { |consumer| consumer.requires_arc? }
51
+ ld_flags << ' -fobjc-arc'
109
52
  end
110
- flags.join(" ")
53
+ ld_flags
111
54
  end
112
55
 
113
56
  # Converts an array of strings to a single string where the each string
@@ -132,8 +75,6 @@ module Pod
132
75
  # @param [Xcodeproj::Config] xcconfig
133
76
  # The xcconfig to edit.
134
77
  #
135
- # @return [void]
136
- #
137
78
  def add_spec_build_settings_to_xcconfig(consumer, xcconfig)
138
79
  xcconfig.merge!(consumer.xcconfig)
139
80
  xcconfig.libraries.merge(consumer.libraries)
@@ -153,7 +94,7 @@ module Pod
153
94
  ]
154
95
 
155
96
  # Adds the search paths of the developer frameworks to the specification
156
- # if needed. This is done because the `SenTestingKit` requires them and
97
+ # if needed. This is done because the `SenTestingKit` requires them and
157
98
  # adding them to each specification which requires it is repetitive and
158
99
  # error prone.
159
100
  #
@@ -0,0 +1,47 @@
1
+ module Pod
2
+ module Generator
3
+
4
+ # Generates the xcconfigs for the aggregate targets.
5
+ #
6
+ class AggregateXCConfig < XCConfig
7
+
8
+ # Generates the xcconfig.
9
+ #
10
+ # @note The xcconfig file for a Pods integration target includes the
11
+ # namespaced xcconfig files for each spec target dependency.
12
+ # Each namespaced configuration value is merged into the Pod
13
+ # xcconfig file.
14
+ #
15
+ # @return [Xcodeproj::Config]
16
+ #
17
+ def generate
18
+ config = {
19
+ 'ALWAYS_SEARCH_USER_PATHS' => 'YES',
20
+ 'OTHER_LDFLAGS' => default_ld_flags,
21
+ 'HEADER_SEARCH_PATHS' => quote(sandbox.public_headers.search_paths),
22
+ 'PODS_ROOT' => target.relative_pods_root,
23
+ 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) COCOAPODS=1',
24
+ }
25
+
26
+ target.pod_targets.each do |pod_target|
27
+ xcconfig = Xcodeproj::Config.new
28
+ pod_target.spec_consumers.each do |consumer|
29
+ add_spec_build_settings_to_xcconfig(consumer, xcconfig)
30
+ end
31
+
32
+ xcconfig.to_hash.each do |k, v|
33
+ prefixed_key = pod_target.xcconfig_prefix + k
34
+ config[k] = "#{config[k]} ${#{prefixed_key}}"
35
+ end
36
+ end
37
+
38
+ @xcconfig = Xcodeproj::Config.new(config)
39
+ @xcconfig.includes = target.pod_targets.map(&:name)
40
+ @xcconfig
41
+ end
42
+
43
+ #-----------------------------------------------------------------------#
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,45 @@
1
+ module Pod
2
+ module Generator
3
+
4
+ # Generates the private xcconfigs for the pod targets.
5
+ #
6
+ # The private xcconfig file for a Pod target merges the configuration
7
+ # values of the public namespaced xcconfig with the default private
8
+ # configuration values required by CocoaPods.
9
+ #
10
+ class PrivatePodXCConfig < XCConfig
11
+
12
+ # Generates the xcconfig.
13
+ #
14
+ # @return [Xcodeproj::Config]
15
+ #
16
+ def generate
17
+ config = {
18
+ 'ALWAYS_SEARCH_USER_PATHS' => 'YES',
19
+ 'OTHER_LDFLAGS' => default_ld_flags,
20
+ 'PODS_ROOT' => '${SRCROOT}',
21
+ 'HEADER_SEARCH_PATHS' => quote(target.build_headers.search_paths) + ' ' + quote(sandbox.public_headers.search_paths),
22
+ 'GCC_PREPROCESSOR_DEFINITIONS' => 'COCOAPODS=1',
23
+ # 'USE_HEADERMAP' => 'NO'
24
+ }
25
+
26
+ xcconfig = Xcodeproj::Config.new
27
+ target.spec_consumers.each do |consumer|
28
+ add_spec_build_settings_to_xcconfig(consumer, xcconfig)
29
+ end
30
+
31
+ xcconfig.to_hash.each do |k, v|
32
+ prefixed_key = target.xcconfig_prefix + k
33
+ config[k] = "#{config[k]} ${#{prefixed_key}}"
34
+ end
35
+
36
+ @xcconfig = Xcodeproj::Config.new(config)
37
+ @xcconfig.includes = [target.name]
38
+ @xcconfig
39
+ end
40
+
41
+ #-----------------------------------------------------------------------#
42
+
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,40 @@
1
+ module Pod
2
+ module Generator
3
+
4
+ # Generates the public xcconfigs for the pod targets.
5
+ #
6
+ # The public xcconfig file for a Pod is completely namespaced to prevent
7
+ # configuration value collision with the build settings of other Pods. This
8
+ # xcconfig includes the standard podspec defined values including
9
+ # libraries, frameworks, weak frameworks and xcconfig overrides.
10
+ #
11
+ class PublicPodXCConfig < XCConfig
12
+
13
+ # Generates and saves the xcconfig to the given path.
14
+ #
15
+ # @param [Pathname] path
16
+ # the path where the prefix header should be stored.
17
+ #
18
+ # @return [void]
19
+ #
20
+ def save_as(path)
21
+ generate.save_as(path, target.xcconfig_prefix)
22
+ end
23
+
24
+ # Generates the xcconfig for the target.
25
+ #
26
+ # @return [Xcodeproj::Config]
27
+ #
28
+ def generate
29
+ @xcconfig = Xcodeproj::Config.new
30
+ target.spec_consumers.each do |consumer|
31
+ add_spec_build_settings_to_xcconfig(consumer, @xcconfig)
32
+ end
33
+ @xcconfig
34
+ end
35
+
36
+ #-----------------------------------------------------------------------#
37
+
38
+ end
39
+ end
40
+ end
@@ -59,7 +59,7 @@ module Pod
59
59
  #
60
60
  def specs_by_lib
61
61
  result = {}
62
- installer.libraries.each do |lib|
62
+ installer.pod_targets.each do |lib|
63
63
  result[installer.library_rep(lib)] = lib.specs
64
64
  end
65
65
  result
@@ -70,8 +70,8 @@ module Pod
70
70
  #
71
71
  def pods_by_lib
72
72
  result = {}
73
- installer.libraries.each do |lib|
74
- pod_names = lib.specs.map { |spec| spec.root.name }.uniq
73
+ installer.aggregate_targets.map(&:pod_targets).flatten.each do |lib|
74
+ pod_names = [lib.root_spec.name]
75
75
  pod_reps = pods.select { |rep| pod_names.include?(rep.name) }
76
76
  result[lib.target_definition] = pod_reps
77
77
  end
@@ -28,11 +28,13 @@ module Pod
28
28
  #
29
29
  class Installer
30
30
 
31
- autoload :Analyzer, 'cocoapods/installer/analyzer'
32
- autoload :FileReferencesInstaller, 'cocoapods/installer/file_references_installer'
33
- autoload :PodSourceInstaller, 'cocoapods/installer/pod_source_installer'
34
- autoload :TargetInstaller, 'cocoapods/installer/target_installer'
35
- autoload :UserProjectIntegrator, 'cocoapods/installer/user_project_integrator'
31
+ autoload :Analyzer, 'cocoapods/installer/analyzer'
32
+ autoload :FileReferencesInstaller, 'cocoapods/installer/file_references_installer'
33
+ autoload :PodSourceInstaller, 'cocoapods/installer/pod_source_installer'
34
+ autoload :TargetInstaller, 'cocoapods/installer/target_installer'
35
+ autoload :AggregateTargetInstaller, 'cocoapods/installer/target_installer/aggregate_target_installer'
36
+ autoload :PodTargetInstaller, 'cocoapods/installer/target_installer/pod_target_installer'
37
+ autoload :UserProjectIntegrator, 'cocoapods/installer/user_project_integrator'
36
38
 
37
39
  include Config::Mixin
38
40
 
@@ -108,7 +110,8 @@ module Pod
108
110
  UI.section "Generating Pods project" do
109
111
  prepare_pods_project
110
112
  install_file_references
111
- install_targets
113
+ install_libraries
114
+ link_aggregate_target
112
115
  run_post_install_hooks
113
116
  write_pod_project
114
117
  write_lockfiles
@@ -134,10 +137,10 @@ module Pod
134
137
  #
135
138
  attr_reader :names_of_pods_to_install
136
139
 
137
- # @return [Array<Library>] The libraries generated by the installation
138
- # process.
140
+ # @return [Array<AggregateTarget>] The Podfile targets containing library
141
+ # dependencies.
139
142
  #
140
- attr_reader :libraries
143
+ attr_reader :aggregate_targets
141
144
 
142
145
  # @return [Array<Specification>] The specifications that where installed.
143
146
  #
@@ -158,14 +161,14 @@ module Pod
158
161
  def analyze
159
162
  if lockfile && lockfile.cocoapods_version > Version.new(VERSION)
160
163
  STDERR.puts '[!] The version of CocoaPods used to generate the lockfile is '\
161
- 'higher that the one of the current executable. Incompatibility' \
164
+ 'higher that the one of the current executable. Incompatibility ' \
162
165
  'issues might arise.'.yellow
163
166
  end
164
167
 
165
168
  analyzer = Analyzer.new(sandbox, podfile, lockfile)
166
169
  analyzer.update_mode = update_mode
167
170
  @analysis_result = analyzer.analyze
168
- @libraries = analyzer.result.libraries
171
+ @aggregate_targets = analyzer.result.targets
169
172
  end
170
173
 
171
174
  # Prepares the Pods folder in order to be compatible with the most recent
@@ -186,8 +189,10 @@ module Pod
186
189
  # @todo [#247] Clean the headers of only the pods to install.
187
190
  #
188
191
  def clean_sandbox
189
- sandbox.build_headers.implode!
190
192
  sandbox.public_headers.implode!
193
+ pod_targets.each do |pod_target|
194
+ pod_target.build_headers.implode!
195
+ end
191
196
 
192
197
  unless sandbox_state.deleted.empty?
193
198
  title_options = { :verbose_prefix => "-> ".red }
@@ -203,13 +208,15 @@ module Pod
203
208
  # created by the Pod source installer as well.
204
209
  #
205
210
  def create_file_accessors
206
- libraries.each do |library|
207
- library.specs.each do |spec|
208
- pod_root = sandbox.pod_dir(spec.root.name)
211
+ aggregate_targets.each do |target|
212
+ target.pod_targets.each do |pod_target|
213
+ pod_root = sandbox.pod_dir(pod_target.root_spec.name)
209
214
  path_list = Sandbox::PathList.new(pod_root)
210
- file_accessor = Sandbox::FileAccessor.new(path_list, spec.consumer(library.platform))
211
- library.file_accessors ||= []
212
- library.file_accessors << file_accessor
215
+ file_accessors = pod_target.specs.map do |spec|
216
+ Sandbox::FileAccessor.new(path_list, spec.consumer(pod_target.platform))
217
+ end
218
+ pod_target.file_accessors ||= []
219
+ pod_target.file_accessors.concat(file_accessors)
213
220
  end
214
221
  end
215
222
  end
@@ -242,12 +249,10 @@ module Pod
242
249
  #
243
250
  def install_source_of_pod(pod_name)
244
251
  specs_by_platform = {}
245
- libraries.each do |library|
246
- specs = library.specs.select { |spec| spec.root.name == pod_name }
247
-
248
- unless specs.empty?
249
- specs_by_platform[library.platform] ||= []
250
- specs_by_platform[library.platform].concat(specs)
252
+ pod_targets.each do |pod_target|
253
+ if pod_target.root_spec.name == pod_name
254
+ specs_by_platform[pod_target.platform] ||= []
255
+ specs_by_platform[pod_target.platform].concat(pod_target.specs)
251
256
  end
252
257
  end
253
258
 
@@ -284,7 +289,7 @@ module Pod
284
289
  @pods_project.add_podfile(config.podfile_path)
285
290
  end
286
291
  sandbox.project = @pods_project
287
- platforms = libraries.map(&:platform)
292
+ platforms = aggregate_targets.map(&:platform)
288
293
  osx_deployment_target = platforms.select { |p| p.name == :osx }.map(&:deployment_target).min
289
294
  ios_deployment_target = platforms.select { |p| p.name == :ios }.map(&:deployment_target).min
290
295
  @pods_project.build_configurations.each do |build_configuration|
@@ -296,30 +301,53 @@ module Pod
296
301
 
297
302
 
298
303
  # Installs the file references in the Pods project. This is done once per
299
- # Pod as the same file reference might be shared by multiple targets.
304
+ # Pod as the same file reference might be shared by multiple aggregate
305
+ # targets.
300
306
  #
301
307
  # @return [void]
302
308
  #
303
309
  def install_file_references
304
- installer = FileReferencesInstaller.new(sandbox, libraries, pods_project)
310
+ installer = FileReferencesInstaller.new(sandbox, pod_targets, pods_project)
305
311
  installer.install!
306
312
  end
307
313
 
308
- # Installs the targets of the Pods projects and generates their support
309
- # files.
314
+ # Installs the aggregate targets of the Pods projects and generates their
315
+ # support files.
310
316
  #
311
317
  # @return [void]
312
318
  #
313
- def install_targets
314
- UI.message"- Installing targets" do
315
- libraries.sort_by(&:name).each do |library|
316
- next if library.target_definition.empty?
317
- target_installer = TargetInstaller.new(sandbox, library)
319
+ def install_libraries
320
+ UI.message"- Installing libraries" do
321
+ pod_targets.sort_by(&:name).each do |pod_target|
322
+ next if pod_target.target_definition.empty?
323
+ target_installer = PodTargetInstaller.new(sandbox, pod_target)
324
+ target_installer.install!
325
+ end
326
+
327
+ aggregate_targets.sort_by(&:name).each do |target|
328
+ next if target.target_definition.empty?
329
+ target_installer = AggregateTargetInstaller.new(sandbox, target)
318
330
  target_installer.install!
319
331
  end
320
332
  end
321
333
  end
322
334
 
335
+ # Links the aggregate targets with all the dependent libraries.
336
+ #
337
+ # @note This is run in the integration step to ensure that targets
338
+ # have been created for all per spec libraries.
339
+ #
340
+ def link_aggregate_target
341
+ aggregate_targets.each do |aggregate_target|
342
+ native_target = pods_project.targets.select { |t| t.name == aggregate_target.name }.first
343
+ products = pods_project.products_group
344
+ aggregate_target.pod_targets.each do |pod_target|
345
+ product = products.files.select { |f| f.path == pod_target.product_name }.first
346
+ native_target.frameworks_build_phase.add_file_reference(product)
347
+ end
348
+ end
349
+ end
350
+
323
351
  # Writes the Pods project to the disk.
324
352
  #
325
353
  # @return [void]
@@ -364,9 +392,9 @@ module Pod
364
392
  # information in the lockfile.
365
393
  #
366
394
  def integrate_user_project
367
- UI.section "Integrating client #{'project'.pluralize(libraries.map(&:user_project_path).uniq.count) }" do
395
+ UI.section "Integrating client #{'project'.pluralize(aggregate_targets.map(&:user_project_path).uniq.count) }" do
368
396
  installation_root = config.installation_root
369
- integrator = UserProjectIntegrator.new(podfile, sandbox, installation_root, libraries)
397
+ integrator = UserProjectIntegrator.new(podfile, sandbox, installation_root, aggregate_targets)
370
398
  integrator.integrate!
371
399
  end
372
400
  end
@@ -512,7 +540,7 @@ module Pod
512
540
  # @return [PodRepresentation] The pod representation.
513
541
  #
514
542
  def pod_rep(pod)
515
- all_file_accessors = libraries.map(&:file_accessors).flatten.compact
543
+ all_file_accessors = pod_targets.map(&:file_accessors).flatten.compact
516
544
  file_accessors = all_file_accessors.select { |fa| fa.spec.root.name == pod }
517
545
  Hooks::PodRepresentation.new(pod, file_accessors)
518
546
  end
@@ -526,7 +554,7 @@ module Pod
526
554
  # @return [Array<LibraryRepresentation>]
527
555
  #
528
556
  def library_reps
529
- @library_reps ||= libraries.map { |lib| library_rep(lib) }
557
+ @library_reps ||= pod_targets.map { |lib| library_rep(lib) }
530
558
  end
531
559
 
532
560
  # @return [Array<PodRepresentation>]
@@ -543,7 +571,14 @@ module Pod
543
571
  # @return [Array<Library>] The library.
544
572
  #
545
573
  def libraries_using_spec(spec)
546
- libraries.select { |lib| lib.specs.include?(spec) }
574
+ pod_targets.select { |pod_target| pod_target.specs.include?(spec) }
575
+ end
576
+
577
+ # @return [Array<Library>] The libraries generated by the installation
578
+ # process.
579
+ #
580
+ def pod_targets
581
+ aggregate_targets.map(&:pod_targets).flatten
547
582
  end
548
583
 
549
584
  #-------------------------------------------------------------------------#