cocoapods 0.20.2 → 0.21.0.rc1
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +26 -0
- data/lib/cocoapods.rb +8 -4
- data/lib/cocoapods/command/spec.rb +5 -14
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/copy_resources_script.rb +2 -2
- data/lib/cocoapods/generator/xcconfig.rb +16 -75
- data/lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb +47 -0
- data/lib/cocoapods/generator/xcconfig/private_pod_xcconfig.rb +45 -0
- data/lib/cocoapods/generator/xcconfig/public_pod_xcconfig.rb +40 -0
- data/lib/cocoapods/hooks/installer_representation.rb +3 -3
- data/lib/cocoapods/installer.rb +74 -39
- data/lib/cocoapods/installer/analyzer.rb +52 -41
- data/lib/cocoapods/installer/file_references_installer.rb +13 -12
- data/lib/cocoapods/installer/target_installer.rb +6 -241
- data/lib/cocoapods/installer/target_installer/aggregate_target_installer.rb +132 -0
- data/lib/cocoapods/installer/target_installer/pod_target_installer.rb +160 -0
- data/lib/cocoapods/installer/user_project_integrator.rb +11 -11
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +70 -50
- data/lib/cocoapods/sandbox.rb +0 -5
- data/lib/cocoapods/sandbox/file_accessor.rb +2 -16
- data/lib/cocoapods/target.rb +116 -0
- data/lib/cocoapods/target/aggregate_target.rb +121 -0
- data/lib/cocoapods/target/pod_target.rb +53 -0
- data/lib/cocoapods/validator.rb +1 -1
- metadata +160 -226
- data/lib/cocoapods/file_list.rb +0 -36
- data/lib/cocoapods/library.rb +0 -202
@@ -0,0 +1,132 @@
|
|
1
|
+
module Pod
|
2
|
+
class Installer
|
3
|
+
|
4
|
+
# Creates the targets which aggregate the Pods libraries in the Pods
|
5
|
+
# project and the relative support files.
|
6
|
+
#
|
7
|
+
class AggregateTargetInstaller < TargetInstaller
|
8
|
+
|
9
|
+
# Creates the target in the Pods project and the relative support files.
|
10
|
+
#
|
11
|
+
# @return [void]
|
12
|
+
#
|
13
|
+
def install!
|
14
|
+
UI.message "- Installing target `#{library.name}` #{library.platform}" do
|
15
|
+
add_target
|
16
|
+
create_suport_files_group
|
17
|
+
create_xcconfig_file
|
18
|
+
create_target_environment_header
|
19
|
+
create_bridge_support_file
|
20
|
+
create_copy_resources_script
|
21
|
+
create_acknowledgements
|
22
|
+
create_dummy_source
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
#-----------------------------------------------------------------------#
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
# Generates the contents of the xcconfig file and saves it to disk.
|
31
|
+
#
|
32
|
+
# @note The `ALWAYS_SEARCH_USER_PATHS` flag is enabled to support
|
33
|
+
# libraries like `EmbedReader`.
|
34
|
+
#
|
35
|
+
# @return [void]
|
36
|
+
#
|
37
|
+
def create_xcconfig_file
|
38
|
+
path = library.xcconfig_path
|
39
|
+
UI.message "- Generating xcconfig file at #{UI.path(path)}" do
|
40
|
+
gen = Generator::AggregateXCConfig.new(library)
|
41
|
+
gen.save_as(path)
|
42
|
+
library.xcconfig = gen.xcconfig
|
43
|
+
xcconfig_file_ref = add_file_to_support_group(path)
|
44
|
+
|
45
|
+
target.build_configurations.each do |c|
|
46
|
+
c.base_configuration_reference = xcconfig_file_ref
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Generates a header which allows to inspect at compile time the installed
|
52
|
+
# pods and the installed specifications of a pod.
|
53
|
+
#
|
54
|
+
def create_target_environment_header
|
55
|
+
path = library.target_environment_header_path
|
56
|
+
UI.message "- Generating target environment header at #{UI.path(path)}" do
|
57
|
+
generator = Generator::TargetEnvironmentHeader.new(library.pod_targets.map { |l| l.specs }.flatten)
|
58
|
+
generator.save_as(path)
|
59
|
+
add_file_to_support_group(path)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Generates the bridge support metadata if requested by the {Podfile}.
|
64
|
+
#
|
65
|
+
# @note The bridge support metadata is added to the resources of the
|
66
|
+
# library because it is needed for environments interpreted at
|
67
|
+
# runtime.
|
68
|
+
#
|
69
|
+
# @return [void]
|
70
|
+
#
|
71
|
+
def create_bridge_support_file
|
72
|
+
if target_definition.podfile.generate_bridge_support?
|
73
|
+
path = library.bridge_support_path
|
74
|
+
UI.message "- Generating BridgeSupport metadata at #{UI.path(path)}" do
|
75
|
+
headers = target.headers_build_phase.files.map { |bf| sandbox.root + bf.file_ref.path }
|
76
|
+
generator = Generator::BridgeSupport.new(headers)
|
77
|
+
generator.save_as(path)
|
78
|
+
add_file_to_support_group(path)
|
79
|
+
@bridge_support_file = path.relative_path_from(sandbox.root)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Creates a script that copies the resources to the bundle of the client
|
85
|
+
# target.
|
86
|
+
#
|
87
|
+
# @note The bridge support file needs to be created before the prefix
|
88
|
+
# header, otherwise it will not be added to the resources script.
|
89
|
+
#
|
90
|
+
# @return [void]
|
91
|
+
#
|
92
|
+
def create_copy_resources_script
|
93
|
+
path = library.copy_resources_script_path
|
94
|
+
UI.message "- Generating copy resources script at #{UI.path(path)}" do
|
95
|
+
file_accessors = library.pod_targets.map(&:file_accessors).flatten
|
96
|
+
resources = file_accessors.map { |accessor| accessor.resources.flatten.map {|res| project.relativize(res)} }.flatten
|
97
|
+
resources << bridge_support_file if bridge_support_file
|
98
|
+
generator = Generator::CopyResourcesScript.new(resources, library.platform)
|
99
|
+
generator.save_as(path)
|
100
|
+
add_file_to_support_group(path)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Generates the acknowledgement files (markdown and plist) for the target.
|
105
|
+
#
|
106
|
+
# @return [void]
|
107
|
+
#
|
108
|
+
def create_acknowledgements
|
109
|
+
basepath = library.acknowledgements_basepath
|
110
|
+
Generator::Acknowledgements.generators.each do |generator_class|
|
111
|
+
path = generator_class.path_from_basepath(basepath)
|
112
|
+
UI.message "- Generating acknowledgements at #{UI.path(path)}" do
|
113
|
+
file_accessors = library.pod_targets.map(&:file_accessors).flatten
|
114
|
+
generator = generator_class.new(file_accessors)
|
115
|
+
generator.save_as(path)
|
116
|
+
add_file_to_support_group(path)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# @return [Pathname] the path of the bridge support file relative to the
|
122
|
+
# sandbox.
|
123
|
+
#
|
124
|
+
# @return [Nil] if no bridge support file was generated.
|
125
|
+
#
|
126
|
+
attr_reader :bridge_support_file
|
127
|
+
|
128
|
+
#-----------------------------------------------------------------------#
|
129
|
+
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
module Pod
|
2
|
+
class Installer
|
3
|
+
|
4
|
+
# Creates the target for the Pods libraries in the Pods project and the
|
5
|
+
# relative support files.
|
6
|
+
#
|
7
|
+
class PodTargetInstaller < TargetInstaller
|
8
|
+
|
9
|
+
# Creates the target in the Pods project and the relative support files.
|
10
|
+
#
|
11
|
+
# @return [void]
|
12
|
+
#
|
13
|
+
def install!
|
14
|
+
UI.message "- Installing target `#{library.name}` #{library.platform}" do
|
15
|
+
add_target
|
16
|
+
add_files_to_build_phases
|
17
|
+
create_suport_files_group
|
18
|
+
create_xcconfig_file
|
19
|
+
create_prefix_header
|
20
|
+
create_dummy_source
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
#-----------------------------------------------------------------------#
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
# Adds the build files of the pods to the target and adds a reference to
|
29
|
+
# the frameworks of the Pods.
|
30
|
+
#
|
31
|
+
# @note The Frameworks are used only for presentation purposes as the
|
32
|
+
# xcconfig is the authoritative source about their information.
|
33
|
+
#
|
34
|
+
# @return [void]
|
35
|
+
#
|
36
|
+
def add_files_to_build_phases
|
37
|
+
UI.message "- Adding Build files" do
|
38
|
+
library.file_accessors.each do |file_accessor|
|
39
|
+
consumer = file_accessor.spec_consumer
|
40
|
+
flags = compiler_flags_for_consumer(consumer)
|
41
|
+
source_files = file_accessor.source_files
|
42
|
+
file_refs = source_files.map { |sf| project.file_reference(sf) }
|
43
|
+
target.add_file_references(file_refs, flags)
|
44
|
+
|
45
|
+
file_accessor.spec_consumer.frameworks.each do |framework|
|
46
|
+
project.add_system_framework(framework, target)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Generates the contents of the xcconfig file and saves it to disk.
|
53
|
+
#
|
54
|
+
# @note The `ALWAYS_SEARCH_USER_PATHS` flag is enabled to support
|
55
|
+
# libraries like `EmbedReader`.
|
56
|
+
#
|
57
|
+
# @return [void]
|
58
|
+
#
|
59
|
+
def create_xcconfig_file
|
60
|
+
path = library.xcconfig_path
|
61
|
+
UI.message "- Generating public xcconfig file at #{UI.path(path)}" do
|
62
|
+
gen = Generator::PublicPodXCConfig.new(library)
|
63
|
+
gen.save_as(path)
|
64
|
+
add_file_to_support_group(path)
|
65
|
+
end
|
66
|
+
|
67
|
+
path = library.xcconfig_private_path
|
68
|
+
UI.message "- Generating private xcconfig file at #{UI.path(path)}" do
|
69
|
+
gen = Generator::PrivatePodXCConfig.new(library)
|
70
|
+
gen.save_as(path)
|
71
|
+
xcconfig_file_ref = add_file_to_support_group(path)
|
72
|
+
|
73
|
+
target.build_configurations.each do |c|
|
74
|
+
c.base_configuration_reference = xcconfig_file_ref
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Creates a prefix header file which imports `UIKit` or `Cocoa` according
|
80
|
+
# to the platform of the target. This file also include any prefix header
|
81
|
+
# content reported by the specification of the pods.
|
82
|
+
#
|
83
|
+
# @return [void]
|
84
|
+
#
|
85
|
+
def create_prefix_header
|
86
|
+
path = library.prefix_header_path
|
87
|
+
UI.message "- Generating prefix header at #{UI.path(path)}" do
|
88
|
+
generator = Generator::PrefixHeader.new(library.file_accessors, library.platform)
|
89
|
+
generator.imports << library.target_environment_header_path.basename
|
90
|
+
generator.save_as(path)
|
91
|
+
add_file_to_support_group(path)
|
92
|
+
|
93
|
+
target.build_configurations.each do |c|
|
94
|
+
relative_path = path.relative_path_from(sandbox.root)
|
95
|
+
c.build_settings['GCC_PREFIX_HEADER'] = relative_path.to_s
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
ENABLE_OBJECT_USE_OBJC_FROM = {
|
101
|
+
:ios => Version.new('6'),
|
102
|
+
:osx => Version.new('10.8')
|
103
|
+
}
|
104
|
+
|
105
|
+
# Returns the compiler flags for the source files of the given specification.
|
106
|
+
#
|
107
|
+
# The following behavior is regarding the `OS_OBJECT_USE_OBJC` flag. When
|
108
|
+
# set to `0`, it will allow code to use `dispatch_release()` on >= iOS 6.0
|
109
|
+
# and OS X 10.8.
|
110
|
+
#
|
111
|
+
# * New libraries that do *not* require ARC don’t need to care about this
|
112
|
+
# issue at all.
|
113
|
+
#
|
114
|
+
# * New libraries that *do* require ARC _and_ have a deployment target of
|
115
|
+
# >= iOS 6.0 or OS X 10.8:
|
116
|
+
#
|
117
|
+
# These no longer use `dispatch_release()` and should *not* have the
|
118
|
+
# `OS_OBJECT_USE_OBJC` flag set to `0`.
|
119
|
+
#
|
120
|
+
# **Note:** this means that these libraries *have* to specify the
|
121
|
+
# deployment target in order to function well.
|
122
|
+
#
|
123
|
+
# * New libraries that *do* require ARC, but have a deployment target of
|
124
|
+
# < iOS 6.0 or OS X 10.8:
|
125
|
+
#
|
126
|
+
# These contain `dispatch_release()` calls and as such need the
|
127
|
+
# `OS_OBJECT_USE_OBJC` flag set to `1`.
|
128
|
+
#
|
129
|
+
# **Note:** libraries that do *not* specify a platform version are
|
130
|
+
# assumed to have a deployment target of < iOS 6.0 or OS X 10.8.
|
131
|
+
#
|
132
|
+
# For more information, see: http://opensource.apple.com/source/libdispatch/libdispatch-228.18/os/object.h
|
133
|
+
#
|
134
|
+
# @param [Specification::Consumer] consumer
|
135
|
+
# The consumer for the specification for which the compiler flags
|
136
|
+
# are needed.
|
137
|
+
#
|
138
|
+
# @return [String] The compiler flags.
|
139
|
+
#
|
140
|
+
def compiler_flags_for_consumer(consumer)
|
141
|
+
flags = consumer.compiler_flags.dup
|
142
|
+
if consumer.requires_arc
|
143
|
+
flags << '-fobjc-arc'
|
144
|
+
platform_name = consumer.platform_name
|
145
|
+
spec_deployment_target = consumer.spec.deployment_target(platform_name)
|
146
|
+
if spec_deployment_target.nil? || Version.new(spec_deployment_target) < ENABLE_OBJECT_USE_OBJC_FROM[platform_name]
|
147
|
+
flags << '-DOS_OBJECT_USE_OBJC=0'
|
148
|
+
end
|
149
|
+
end
|
150
|
+
if target_definition.inhibits_warnings_for_pod?(consumer.spec.root.name)
|
151
|
+
flags << '-w -Xanalyzer -analyzer-disable-checker'
|
152
|
+
end
|
153
|
+
flags * " "
|
154
|
+
end
|
155
|
+
|
156
|
+
#-----------------------------------------------------------------------#
|
157
|
+
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
@@ -35,9 +35,9 @@ module Pod
|
|
35
35
|
#
|
36
36
|
attr_reader :installation_root
|
37
37
|
|
38
|
-
# @return [
|
38
|
+
# @return [Array<Target>] the targets represented in the Podfile.
|
39
39
|
#
|
40
|
-
attr_reader :
|
40
|
+
attr_reader :targets
|
41
41
|
|
42
42
|
# @param [Podfile] podfile @see #podfile
|
43
43
|
# @param [Sandbox] sandbox @see #sandbox
|
@@ -46,11 +46,11 @@ module Pod
|
|
46
46
|
#
|
47
47
|
# @todo Too many initialization arguments
|
48
48
|
#
|
49
|
-
def initialize(podfile, sandbox, installation_root,
|
49
|
+
def initialize(podfile, sandbox, installation_root, targets)
|
50
50
|
@podfile = podfile
|
51
51
|
@sandbox = sandbox
|
52
52
|
@installation_root = installation_root
|
53
|
-
@
|
53
|
+
@targets = targets
|
54
54
|
end
|
55
55
|
|
56
56
|
# Integrates the user projects associated with the {TargetDefinitions}
|
@@ -110,8 +110,8 @@ module Pod
|
|
110
110
|
# @return [void]
|
111
111
|
#
|
112
112
|
def integrate_user_targets
|
113
|
-
|
114
|
-
TargetIntegrator.new(
|
113
|
+
targets_to_integrate.sort_by(&:name).each do |target|
|
114
|
+
TargetIntegrator.new(target).integrate!
|
115
115
|
end
|
116
116
|
end
|
117
117
|
|
@@ -128,7 +128,7 @@ module Pod
|
|
128
128
|
#
|
129
129
|
def warn_about_empty_podfile
|
130
130
|
if podfile.target_definitions.values.all?{ |td| td.empty? }
|
131
|
-
UI.warn "[!] The Podfile does not contain any
|
131
|
+
UI.warn "[!] The Podfile does not contain any dependencies."
|
132
132
|
end
|
133
133
|
end
|
134
134
|
|
@@ -163,14 +163,14 @@ module Pod
|
|
163
163
|
# @note Empty target definitions are ignored.
|
164
164
|
#
|
165
165
|
def user_project_paths
|
166
|
-
|
167
|
-
|
166
|
+
targets.map do |target|
|
167
|
+
target.user_project_path
|
168
168
|
end.compact.uniq
|
169
169
|
end
|
170
170
|
|
171
171
|
|
172
|
-
def
|
173
|
-
|
172
|
+
def targets_to_integrate
|
173
|
+
targets.reject { |target| target.target_definition.empty? }
|
174
174
|
end
|
175
175
|
|
176
176
|
#-----------------------------------------------------------------------#
|
@@ -9,14 +9,14 @@ module Pod
|
|
9
9
|
#
|
10
10
|
class TargetIntegrator
|
11
11
|
|
12
|
-
# @return [
|
12
|
+
# @return [Target] the target that should be integrated.
|
13
13
|
#
|
14
|
-
attr_reader :
|
14
|
+
attr_reader :target
|
15
15
|
|
16
|
-
# @param [
|
16
|
+
# @param [Target] target @see #target_definition
|
17
17
|
#
|
18
|
-
def initialize(
|
19
|
-
@
|
18
|
+
def initialize(target)
|
19
|
+
@target = target
|
20
20
|
end
|
21
21
|
|
22
22
|
# Integrates the user project targets. Only the targets that do **not**
|
@@ -26,7 +26,7 @@ module Pod
|
|
26
26
|
# @return [void]
|
27
27
|
#
|
28
28
|
def integrate!
|
29
|
-
return if
|
29
|
+
return if native_targets.empty?
|
30
30
|
UI.section(integration_message) do
|
31
31
|
add_xcconfig_base_configuration
|
32
32
|
add_pods_library
|
@@ -36,46 +36,50 @@ module Pod
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
# @return [Array<PBXNativeTarget>] the
|
40
|
-
# lib that need to be integrated.
|
39
|
+
# @return [Array<PBXNativeTarget>] the user targets for integration.
|
41
40
|
#
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
target = user_project.objects_by_uuid[uuid]
|
49
|
-
unless target
|
41
|
+
def native_targets
|
42
|
+
unless @native_targets
|
43
|
+
target_uuids = target.user_target_uuids
|
44
|
+
native_targets = target_uuids.map do |uuid|
|
45
|
+
native_target = user_project.objects_by_uuid[uuid]
|
46
|
+
unless native_target
|
50
47
|
raise Informative, "[Bug] Unable to find the target with " \
|
51
|
-
"the `#{uuid}` UUID for the `#{
|
48
|
+
"the `#{uuid}` UUID for the `#{target}` integration library"
|
52
49
|
end
|
53
|
-
|
50
|
+
native_target
|
54
51
|
end
|
55
|
-
non_integrated =
|
56
|
-
|
52
|
+
non_integrated = native_targets.reject do |native_target|
|
53
|
+
native_target.frameworks_build_phase.files.any? do |build_file|
|
57
54
|
file_ref = build_file.file_ref
|
58
55
|
file_ref &&
|
59
56
|
file_ref.isa == 'PBXFileReference' &&
|
60
|
-
file_ref.display_name ==
|
57
|
+
file_ref.display_name == target.product_name
|
61
58
|
end
|
62
59
|
end
|
63
|
-
@
|
60
|
+
@native_targets = non_integrated
|
64
61
|
end
|
65
|
-
@
|
62
|
+
@native_targets
|
66
63
|
end
|
67
64
|
|
68
65
|
# Read the project from the disk to ensure that it is up to date as
|
69
66
|
# other TargetIntegrators might have modified it.
|
70
67
|
#
|
71
68
|
def user_project
|
72
|
-
@user_project ||= Xcodeproj::Project.new(
|
69
|
+
@user_project ||= Xcodeproj::Project.new(target.user_project_path)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Read the pods project from the disk to ensure that it is up to date as
|
73
|
+
# other TargetIntegrators might have modified it.
|
74
|
+
#
|
75
|
+
def pods_project
|
76
|
+
@pods_project ||= Xcodeproj::Project.new(target.sandbox.project_path)
|
73
77
|
end
|
74
78
|
|
75
79
|
# @return [String] a string representation suitable for debugging.
|
76
80
|
#
|
77
81
|
def inspect
|
78
|
-
"#<#{self.class} for target `#{
|
82
|
+
"#<#{self.class} for target `#{target.label}'>"
|
79
83
|
end
|
80
84
|
|
81
85
|
#---------------------------------------------------------------------#
|
@@ -84,6 +88,12 @@ module Pod
|
|
84
88
|
|
85
89
|
private
|
86
90
|
|
91
|
+
# @return [Specification::Consumer] the consumer for the specifications.
|
92
|
+
#
|
93
|
+
def spec_consumers
|
94
|
+
@spec_consumers ||= target.pod_targets.map(&:file_accessors).flatten.map(&:spec_consumer)
|
95
|
+
end
|
96
|
+
|
87
97
|
# Adds the `xcconfig` configurations files generated for the current
|
88
98
|
# {TargetDefinition} to the build configurations of the targets that
|
89
99
|
# should be integrated.
|
@@ -98,25 +108,31 @@ module Pod
|
|
98
108
|
# @return [void]
|
99
109
|
#
|
100
110
|
def add_xcconfig_base_configuration
|
101
|
-
xcconfig = user_project.
|
102
|
-
|
103
|
-
|
104
|
-
target.
|
111
|
+
xcconfig = user_project.files.select { |f| f.path == target.xcconfig_relative_path }.first ||
|
112
|
+
user_project.new_file(target.xcconfig_relative_path)
|
113
|
+
native_targets.each do |native_target|
|
114
|
+
check_overridden_build_settings(target.xcconfig, native_target)
|
115
|
+
native_target.build_configurations.each do |config|
|
105
116
|
config.base_configuration_reference = xcconfig
|
106
117
|
end
|
107
118
|
end
|
108
119
|
end
|
109
120
|
|
110
|
-
# Adds
|
111
|
-
#
|
121
|
+
# Adds spec libraries to the frameworks build phase of the
|
122
|
+
# {TargetDefinition} integration libraries. Adds a file reference to
|
123
|
+
# the library of the {TargetDefinition} and adds it to the frameworks
|
124
|
+
# build phase of the targets.
|
112
125
|
#
|
113
126
|
# @return [void]
|
114
127
|
#
|
115
128
|
def add_pods_library
|
116
129
|
frameworks = user_project.frameworks_group
|
117
|
-
|
118
|
-
|
119
|
-
|
130
|
+
native_targets.each do |native_target|
|
131
|
+
library = frameworks.files.select { |f| f.path == target.product_name }.first ||
|
132
|
+
frameworks.new_static_library(target.name)
|
133
|
+
unless native_target.frameworks_build_phase.files_references.include?(library)
|
134
|
+
native_target.frameworks_build_phase.add_file_reference(library)
|
135
|
+
end
|
120
136
|
end
|
121
137
|
end
|
122
138
|
|
@@ -127,9 +143,11 @@ module Pod
|
|
127
143
|
# @return [void]
|
128
144
|
#
|
129
145
|
def add_copy_resources_script_phase
|
130
|
-
|
131
|
-
|
132
|
-
|
146
|
+
phase_name = "Copy Pods Resources"
|
147
|
+
native_targets.each do |native_target|
|
148
|
+
phase = native_target.shell_script_build_phases.select { |bp| bp.name == phase_name }.first ||
|
149
|
+
native_target.new_shell_script_build_phase(phase_name)
|
150
|
+
path = target.copy_resources_script_relative_path
|
133
151
|
phase.shell_script = %{"#{path}"\n}
|
134
152
|
end
|
135
153
|
end
|
@@ -144,10 +162,12 @@ module Pod
|
|
144
162
|
# @return [void]
|
145
163
|
#
|
146
164
|
def add_check_manifest_lock_script_phase
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
phase
|
165
|
+
phase_name = 'Check Pods Manifest.lock'
|
166
|
+
native_targets.each do |native_target|
|
167
|
+
next if native_target.shell_script_build_phases.any? { |phase| phase.name == phase_name }
|
168
|
+
phase = native_target.project.new(Xcodeproj::Project::Object::PBXShellScriptBuildPhase)
|
169
|
+
native_target.build_phases.unshift(phase)
|
170
|
+
phase.name = phase_name
|
151
171
|
phase.shell_script = <<-EOS.strip_heredoc
|
152
172
|
diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
|
153
173
|
if [[ $? != 0 ]] ; then
|
@@ -165,7 +185,7 @@ module Pod
|
|
165
185
|
# @return [void]
|
166
186
|
#
|
167
187
|
def save_user_project
|
168
|
-
user_project.save_as(
|
188
|
+
user_project.save_as(target.user_project_path)
|
169
189
|
end
|
170
190
|
|
171
191
|
#---------------------------------------------------------------------#
|
@@ -179,11 +199,11 @@ module Pod
|
|
179
199
|
#
|
180
200
|
# @return [void]
|
181
201
|
#
|
182
|
-
def check_overridden_build_settings(xcconfig,
|
202
|
+
def check_overridden_build_settings(xcconfig, native_target)
|
183
203
|
return unless xcconfig
|
184
204
|
|
185
205
|
configs_by_overridden_key = {}
|
186
|
-
|
206
|
+
native_target.build_configurations.each do |config|
|
187
207
|
xcconfig.attributes.keys.each do |key|
|
188
208
|
target_value = config.build_settings[key]
|
189
209
|
|
@@ -194,13 +214,13 @@ module Pod
|
|
194
214
|
end
|
195
215
|
|
196
216
|
configs_by_overridden_key.each do |key, config_names|
|
197
|
-
name = "#{
|
217
|
+
name = "#{native_target.name} [#{config_names.join(' - ')}]"
|
198
218
|
actions = [
|
199
219
|
"Use the `$(inherited)` flag, or",
|
200
220
|
"Remove the build settings from the target."
|
201
221
|
]
|
202
222
|
UI.warn("The target `#{name}` overrides the `#{key}` build " \
|
203
|
-
"setting defined in `#{
|
223
|
+
"setting defined in `#{target.xcconfig_relative_path}'.",
|
204
224
|
actions)
|
205
225
|
end
|
206
226
|
end
|
@@ -210,10 +230,10 @@ module Pod
|
|
210
230
|
# integration.
|
211
231
|
#
|
212
232
|
def integration_message
|
213
|
-
"Integrating
|
214
|
-
"
|
215
|
-
"
|
216
|
-
"of project #{UI.path
|
233
|
+
"Integrating Pod #{'target'.pluralize(target.pod_targets.size)} " \
|
234
|
+
"`#{target.pod_targets.map(&:name).to_sentence}` " \
|
235
|
+
"into aggregate target #{target.name} " \
|
236
|
+
"of project #{UI.path target.user_project_path}."
|
217
237
|
end
|
218
238
|
|
219
239
|
#---------------------------------------------------------------------#
|