cocoapods 1.5.2 → 1.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +365 -1
- data/bin/pod +1 -1
- data/lib/cocoapods/command/cache/clean.rb +1 -1
- data/lib/cocoapods/command/init.rb +4 -2
- data/lib/cocoapods/command/install.rb +7 -0
- data/lib/cocoapods/command/lib/lint.rb +8 -1
- data/lib/cocoapods/command/outdated.rb +4 -9
- data/lib/cocoapods/command/repo/add.rb +1 -1
- data/lib/cocoapods/command/repo/list.rb +1 -1
- data/lib/cocoapods/command/repo/push.rb +17 -12
- data/lib/cocoapods/command/repo/remove.rb +1 -1
- data/lib/cocoapods/command/repo/update.rb +1 -1
- data/lib/cocoapods/command/setup.rb +1 -1
- data/lib/cocoapods/command/spec/create.rb +39 -39
- data/lib/cocoapods/command/spec/lint.rb +8 -1
- data/lib/cocoapods/command.rb +3 -1
- data/lib/cocoapods/config.rb +13 -2
- data/lib/cocoapods/downloader/cache.rb +1 -1
- data/lib/cocoapods/executable.rb +3 -3
- data/lib/cocoapods/external_sources/abstract_external_source.rb +23 -13
- data/lib/cocoapods/external_sources.rb +7 -4
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/acknowledgements/markdown.rb +6 -0
- data/lib/cocoapods/generator/acknowledgements/plist.rb +13 -2
- data/lib/cocoapods/generator/app_target_helper.rb +141 -17
- data/lib/cocoapods/generator/copy_resources_script.rb +14 -3
- data/lib/cocoapods/generator/dummy_source.rb +14 -5
- data/lib/cocoapods/generator/embed_frameworks_script.rb +37 -20
- data/lib/cocoapods/generator/header.rb +1 -1
- data/lib/cocoapods/generator/info_plist_file.rb +12 -4
- data/lib/cocoapods/generator/prefix_header.rb +2 -2
- data/lib/cocoapods/hooks_manager.rb +28 -17
- data/lib/cocoapods/installer/analyzer/analysis_result.rb +52 -22
- data/lib/cocoapods/installer/analyzer/locking_dependency_analyzer.rb +14 -6
- data/lib/cocoapods/installer/analyzer/pod_variant.rb +4 -5
- data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +3 -14
- data/lib/cocoapods/installer/analyzer/specs_state.rb +28 -4
- data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +27 -14
- data/lib/cocoapods/installer/analyzer/target_inspector.rb +17 -11
- data/lib/cocoapods/installer/analyzer.rb +391 -284
- data/lib/cocoapods/installer/installation_options.rb +2 -0
- data/lib/cocoapods/installer/pod_source_installer.rb +31 -43
- data/lib/cocoapods/installer/post_install_hooks_context.rb +72 -47
- data/lib/cocoapods/installer/pre_install_hooks_context.rb +22 -13
- data/lib/cocoapods/installer/source_provider_hooks_context.rb +3 -1
- data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +44 -11
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +69 -29
- data/lib/cocoapods/installer/user_project_integrator.rb +6 -4
- data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +25 -16
- data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +104 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +23 -50
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +296 -177
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +51 -33
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +93 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +62 -69
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer_helper.rb +72 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator.rb +130 -122
- data/lib/cocoapods/installer/xcode/target_validator.rb +15 -9
- data/lib/cocoapods/installer.rb +140 -63
- data/lib/cocoapods/project.rb +16 -14
- data/lib/cocoapods/resolver/resolver_specification.rb +41 -0
- data/lib/cocoapods/resolver.rb +79 -98
- data/lib/cocoapods/sandbox/file_accessor.rb +11 -6
- data/lib/cocoapods/sandbox/headers_store.rb +9 -8
- data/lib/cocoapods/sandbox/path_list.rb +5 -8
- data/lib/cocoapods/sandbox.rb +31 -43
- data/lib/cocoapods/sources_manager.rb +1 -1
- data/lib/cocoapods/target/aggregate_target.rb +143 -85
- data/lib/cocoapods/target/build_settings.rb +1124 -0
- data/lib/cocoapods/target/framework_paths.rb +36 -0
- data/lib/cocoapods/target/pod_target.rb +198 -295
- data/lib/cocoapods/target.rb +92 -37
- data/lib/cocoapods/user_interface.rb +5 -0
- data/lib/cocoapods/validator.rb +149 -44
- data/lib/cocoapods.rb +0 -1
- metadata +31 -23
- data/lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb +0 -260
- data/lib/cocoapods/generator/xcconfig/pod_xcconfig.rb +0 -87
- data/lib/cocoapods/generator/xcconfig/xcconfig_helper.rb +0 -558
- data/lib/cocoapods/generator/xcconfig.rb +0 -13
@@ -108,6 +108,8 @@ module Pod
|
|
108
108
|
option :lock_pod_sources, true
|
109
109
|
option :warn_for_multiple_pod_sources, true
|
110
110
|
option :share_schemes_for_development_pods, false
|
111
|
+
option :disable_input_output_paths, false
|
112
|
+
option :preserve_pod_file_structure, false
|
111
113
|
|
112
114
|
module Mixin
|
113
115
|
module ClassMethods
|
@@ -8,6 +8,8 @@ module Pod
|
|
8
8
|
# @note This class needs to consider all the activated specs of a Pod.
|
9
9
|
#
|
10
10
|
class PodSourceInstaller
|
11
|
+
UNENCRYPTED_PROTOCOLS = %w(http git).freeze
|
12
|
+
|
11
13
|
# @return [Sandbox] The installation target.
|
12
14
|
#
|
13
15
|
attr_reader :sandbox
|
@@ -24,9 +26,9 @@ module Pod
|
|
24
26
|
|
25
27
|
# Initialize a new instance
|
26
28
|
#
|
27
|
-
# @param [Sandbox] sandbox @see sandbox
|
28
|
-
# @param [Hash{Symbol=>Array}] specs_by_platform @see specs_by_platform
|
29
|
-
# @param [Boolean] can_cache @see can_cache
|
29
|
+
# @param [Sandbox] sandbox @see #sandbox
|
30
|
+
# @param [Hash{Symbol=>Array}] specs_by_platform @see #specs_by_platform
|
31
|
+
# @param [Boolean] can_cache @see #can_cache
|
30
32
|
#
|
31
33
|
def initialize(sandbox, specs_by_platform, can_cache: true)
|
32
34
|
@sandbox = sandbox
|
@@ -63,9 +65,6 @@ module Pod
|
|
63
65
|
|
64
66
|
# Cleans the installations if appropriate.
|
65
67
|
#
|
66
|
-
# @todo As the pre install hooks need to run before cleaning this
|
67
|
-
# method should be refactored.
|
68
|
-
#
|
69
68
|
# @return [void]
|
70
69
|
#
|
71
70
|
def clean!
|
@@ -74,45 +73,29 @@ module Pod
|
|
74
73
|
|
75
74
|
# Locks the source files if appropriate.
|
76
75
|
#
|
77
|
-
# @todo As the pre install hooks need to run before cleaning this
|
78
|
-
# method should be refactored.
|
79
|
-
#
|
80
76
|
# @return [void]
|
81
77
|
#
|
82
78
|
def lock_files!(file_accessors)
|
83
79
|
return if local?
|
84
|
-
|
85
|
-
FileUtils.chmod('u-w', source_file)
|
86
|
-
end
|
80
|
+
FileUtils.chmod('u-w', source_files(file_accessors))
|
87
81
|
end
|
88
82
|
|
89
83
|
# Unlocks the source files if appropriate.
|
90
84
|
#
|
91
|
-
# @todo As the pre install hooks need to run before cleaning this
|
92
|
-
# method should be refactored.
|
93
|
-
#
|
94
85
|
# @return [void]
|
95
86
|
#
|
96
87
|
def unlock_files!(file_accessors)
|
97
88
|
return if local?
|
98
|
-
|
99
|
-
FileUtils.chmod('u+w', source_file)
|
100
|
-
end
|
89
|
+
FileUtils.chmod('u+w', source_files(file_accessors))
|
101
90
|
end
|
102
91
|
|
103
|
-
# @return [Hash] @see Downloader#checkout_options
|
104
|
-
#
|
105
|
-
attr_reader :specific_source
|
106
|
-
|
107
92
|
#-----------------------------------------------------------------------#
|
108
93
|
|
109
94
|
private
|
110
95
|
|
111
96
|
# @!group Installation Steps
|
112
97
|
|
113
|
-
# Downloads the source of the Pod.
|
114
|
-
# needed to recreate the same exact installation if needed in
|
115
|
-
# `#specific_source`.
|
98
|
+
# Downloads the source of the Pod.
|
116
99
|
#
|
117
100
|
# @return [void]
|
118
101
|
#
|
@@ -120,23 +103,31 @@ module Pod
|
|
120
103
|
verify_source_is_secure(root_spec)
|
121
104
|
download_result = Downloader.download(download_request, root, :can_cache => can_cache?)
|
122
105
|
|
123
|
-
if (
|
106
|
+
if (specific_source = download_result.checkout_options) && specific_source != root_spec.source
|
124
107
|
sandbox.store_checkout_source(root_spec.name, specific_source)
|
125
108
|
end
|
126
109
|
end
|
127
110
|
|
128
|
-
# Verify the source of the spec is secure, which is used to
|
129
|
-
#
|
130
|
-
#
|
131
|
-
#
|
111
|
+
# Verify the source of the spec is secure, which is used to show a warning to the user if that isn't the case
|
112
|
+
# This method doesn't verify all protocols, but currently only prohibits unencrypted 'http://' and 'git://''
|
113
|
+
# connections.
|
114
|
+
#
|
115
|
+
# @return [void]
|
132
116
|
#
|
133
117
|
def verify_source_is_secure(root_spec)
|
134
|
-
return if root_spec.source.nil? || root_spec.source[:http].nil?
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
118
|
+
return if root_spec.source.nil? || (root_spec.source[:http].nil? && root_spec.source[:git].nil?)
|
119
|
+
source = if !root_spec.source[:http].nil?
|
120
|
+
URI(root_spec.source[:http].to_s)
|
121
|
+
elsif !root_spec.source[:git].nil?
|
122
|
+
git_source = root_spec.source[:git].to_s
|
123
|
+
return unless git_source =~ /^#{URI.regexp}$/
|
124
|
+
URI(git_source)
|
125
|
+
end
|
126
|
+
if UNENCRYPTED_PROTOCOLS.include?(source.scheme) && source.host != 'localhost'
|
127
|
+
UI.warn "'#{root_spec.name}' uses the unencrypted '#{source.scheme}' protocol to transfer the Pod. " \
|
128
|
+
'Please be sure you\'re in a safe network with only trusted hosts. ' \
|
129
|
+
'Otherwise, please reach out to the library author to notify them of this security issue.'
|
130
|
+
end
|
140
131
|
end
|
141
132
|
|
142
133
|
def download_request
|
@@ -199,13 +190,10 @@ module Pod
|
|
199
190
|
!local? && !predownloaded? && sandbox.specification(root_spec.name) != root_spec
|
200
191
|
end
|
201
192
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
blk[source_file]
|
207
|
-
end
|
208
|
-
end
|
193
|
+
# @return [Array<Pathname>] The paths of the source files
|
194
|
+
#
|
195
|
+
def source_files(file_accessors)
|
196
|
+
file_accessors.flat_map(&:source_files)
|
209
197
|
end
|
210
198
|
|
211
199
|
#-----------------------------------------------------------------------#
|
@@ -4,22 +4,36 @@ module Pod
|
|
4
4
|
# the context of the installer.
|
5
5
|
#
|
6
6
|
class PostInstallHooksContext
|
7
|
-
# @return [
|
7
|
+
# @return [Sandbox] The Sandbox for the project.
|
8
8
|
#
|
9
|
-
|
9
|
+
attr_reader :sandbox
|
10
10
|
|
11
|
-
# @return [
|
11
|
+
# @return [String] The path to the sandbox root (`Pods` directory).
|
12
12
|
#
|
13
|
-
|
13
|
+
attr_reader :sandbox_root
|
14
14
|
|
15
|
-
# @return [
|
15
|
+
# @return [Xcodeproj::Project] The Pods Xcode project.
|
16
16
|
#
|
17
|
-
|
17
|
+
attr_reader :pods_project
|
18
18
|
|
19
19
|
# @return [Array<UmbrellaTargetDescription>] The list of
|
20
20
|
# the CocoaPods umbrella targets generated by the installer.
|
21
21
|
#
|
22
|
-
|
22
|
+
attr_reader :umbrella_targets
|
23
|
+
|
24
|
+
# Initialize a new instance
|
25
|
+
#
|
26
|
+
# @param [Sandbox] sandbox see #sandbox
|
27
|
+
# @param [String] sandbox_root see #sandbox_root
|
28
|
+
# @param [Xcodeproj::Project] pods_project see #pods_project
|
29
|
+
# @param [Array<UmbrellaTargetDescription>] umbrella_targets see #umbrella_targets
|
30
|
+
#
|
31
|
+
def initialize(sandbox, sandbox_root, pods_project, umbrella_targets)
|
32
|
+
@sandbox = sandbox
|
33
|
+
@sandbox_root = sandbox_root
|
34
|
+
@pods_project = pods_project
|
35
|
+
@umbrella_targets = umbrella_targets
|
36
|
+
end
|
23
37
|
|
24
38
|
# @return [PostInstallHooksContext] Convenience class generator method
|
25
39
|
#
|
@@ -34,33 +48,66 @@ module Pod
|
|
34
48
|
# static context.
|
35
49
|
#
|
36
50
|
def self.generate(sandbox, aggregate_targets)
|
37
|
-
umbrella_targets_descriptions =
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
desc.cocoapods_target_label = umbrella.label
|
46
|
-
umbrella_targets_descriptions << desc
|
51
|
+
umbrella_targets_descriptions = aggregate_targets.map do |umbrella|
|
52
|
+
user_project = umbrella.user_project
|
53
|
+
user_targets = umbrella.user_targets
|
54
|
+
specs = umbrella.specs
|
55
|
+
platform_name = umbrella.platform.name
|
56
|
+
platform_deployment_target = umbrella.platform.deployment_target.to_s
|
57
|
+
cocoapods_target_label = umbrella.label
|
58
|
+
UmbrellaTargetDescription.new(user_project, user_targets, specs, platform_name, platform_deployment_target, cocoapods_target_label)
|
47
59
|
end
|
48
60
|
|
49
|
-
|
50
|
-
result.sandbox_root = sandbox.root.to_s
|
51
|
-
result.pods_project = sandbox.project
|
52
|
-
result.sandbox = sandbox
|
53
|
-
result.umbrella_targets = umbrella_targets_descriptions
|
54
|
-
result
|
61
|
+
new(sandbox, sandbox.root.to_s, sandbox.project, umbrella_targets_descriptions)
|
55
62
|
end
|
56
63
|
|
57
|
-
# Pure data class which describes
|
64
|
+
# Pure data class which describes an umbrella target.
|
58
65
|
#
|
59
66
|
class UmbrellaTargetDescription
|
60
67
|
# @return [Xcodeproj::Project] The user project into which this target
|
61
68
|
# is integrated.
|
62
69
|
#
|
63
|
-
|
70
|
+
attr_reader :user_project
|
71
|
+
|
72
|
+
# @return [Array<PBXNativeTarget>]
|
73
|
+
# The list of user targets integrated by this umbrella target.
|
74
|
+
#
|
75
|
+
attr_reader :user_targets
|
76
|
+
|
77
|
+
# @return [Array<Specification>] The list of the
|
78
|
+
# specifications of the target.
|
79
|
+
#
|
80
|
+
attr_reader :specs
|
81
|
+
|
82
|
+
# @return [Symbol] The platform (either `:ios`, `:watchos`, `:tvos`, or `:osx`).
|
83
|
+
#
|
84
|
+
attr_reader :platform_name
|
85
|
+
|
86
|
+
# @return [String] The deployment target.
|
87
|
+
#
|
88
|
+
attr_reader :platform_deployment_target
|
89
|
+
|
90
|
+
# @return [String] The label for the target.
|
91
|
+
#
|
92
|
+
attr_reader :cocoapods_target_label
|
93
|
+
|
94
|
+
# Initialize a new instance
|
95
|
+
#
|
96
|
+
# @param [Xcodeproj::Project] user_project see #user_project
|
97
|
+
# @param [Array<PBXNativeTarget>] user_targets see #user_targets
|
98
|
+
# @param [Array<Specification>] specs see #specs
|
99
|
+
# @param [Symbol] platform_name see #platform_name
|
100
|
+
# @param [String] platform_deployment_target see #platform_deployment_target
|
101
|
+
# @param [String] cocoapods_target_label see #cocoapods_target_label
|
102
|
+
#
|
103
|
+
def initialize(user_project, user_targets, specs, platform_name, platform_deployment_target, cocoapods_target_label)
|
104
|
+
@user_project = user_project
|
105
|
+
@user_targets = user_targets
|
106
|
+
@specs = specs
|
107
|
+
@platform_name = platform_name
|
108
|
+
@platform_deployment_target = platform_deployment_target
|
109
|
+
@cocoapods_target_label = cocoapods_target_label
|
110
|
+
end
|
64
111
|
|
65
112
|
# @return [String] The path of the user project
|
66
113
|
# integrated by this target.
|
@@ -69,11 +116,6 @@ module Pod
|
|
69
116
|
user_project.path if user_project
|
70
117
|
end
|
71
118
|
|
72
|
-
# @return [Array<PBXNativeTarget>]
|
73
|
-
# The list of user targets integrated by this umbrella target.
|
74
|
-
#
|
75
|
-
attr_accessor :user_targets
|
76
|
-
|
77
119
|
# @return [Array<String>] The list of the UUIDs of the
|
78
120
|
# user targets integrated by this umbrella
|
79
121
|
# target. They can be used to find the
|
@@ -84,23 +126,6 @@ module Pod
|
|
84
126
|
def user_target_uuids
|
85
127
|
user_targets.map(&:uuid)
|
86
128
|
end
|
87
|
-
|
88
|
-
# @return [Array<Specification>] The list of the
|
89
|
-
# specifications of the target.
|
90
|
-
#
|
91
|
-
attr_accessor :specs
|
92
|
-
|
93
|
-
# @return [Symbol] The platform (either `:ios`, `:watchos`, `:tvos`, or `:osx`).
|
94
|
-
#
|
95
|
-
attr_accessor :platform_name
|
96
|
-
|
97
|
-
# @return [String] The deployment target.
|
98
|
-
#
|
99
|
-
attr_accessor :platform_deployment_target
|
100
|
-
|
101
|
-
# @return [String] The label for the target.
|
102
|
-
#
|
103
|
-
attr_accessor :cocoapods_target_label
|
104
129
|
end
|
105
130
|
end
|
106
131
|
end
|
@@ -4,21 +4,35 @@ module Pod
|
|
4
4
|
# the context of the installer before analysis has been completed.
|
5
5
|
#
|
6
6
|
class PreInstallHooksContext
|
7
|
-
# @return [String] The path to the sandbox root (`Pods` directory).
|
8
|
-
#
|
9
|
-
attr_accessor :sandbox_root
|
10
|
-
|
11
7
|
# @return [Podfile] The Podfile for the project.
|
12
8
|
#
|
13
|
-
|
9
|
+
attr_reader :podfile
|
14
10
|
|
15
11
|
# @return [Sandbox] The Sandbox for the project.
|
16
12
|
#
|
17
|
-
|
13
|
+
attr_reader :sandbox
|
14
|
+
|
15
|
+
# @return [String] The path to the sandbox root (`Pods` directory).
|
16
|
+
#
|
17
|
+
attr_reader :sandbox_root
|
18
18
|
|
19
19
|
# @return [Lockfile] The Lockfile for the project.
|
20
20
|
#
|
21
|
-
|
21
|
+
attr_reader :lockfile
|
22
|
+
|
23
|
+
# Initialize a new instance
|
24
|
+
#
|
25
|
+
# @param [Sandbox] sandbox see #sandbox
|
26
|
+
# @param [String] sandbox_root see #sandbox_root
|
27
|
+
# @param [Podfile] podfile see #podfile
|
28
|
+
# @param [Lockfile] lockfile see #lockfile
|
29
|
+
#
|
30
|
+
def initialize(podfile, sandbox, sandbox_root, lockfile)
|
31
|
+
@podfile = podfile
|
32
|
+
@sandbox = sandbox
|
33
|
+
@sandbox_root = sandbox_root
|
34
|
+
@lockfile = lockfile
|
35
|
+
end
|
22
36
|
|
23
37
|
# @param [Sandbox] sandbox see {#sandbox}
|
24
38
|
#
|
@@ -30,12 +44,7 @@ module Pod
|
|
30
44
|
# static context.
|
31
45
|
#
|
32
46
|
def self.generate(sandbox, podfile, lockfile)
|
33
|
-
|
34
|
-
result.podfile = podfile
|
35
|
-
result.sandbox = sandbox
|
36
|
-
result.sandbox_root = sandbox.root.to_s
|
37
|
-
result.lockfile = lockfile
|
38
|
-
result
|
47
|
+
new(podfile, sandbox, sandbox.root.to_s, lockfile)
|
39
48
|
end
|
40
49
|
end
|
41
50
|
end
|
data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb
CHANGED
@@ -42,19 +42,14 @@ module Pod
|
|
42
42
|
# The build configuration.
|
43
43
|
#
|
44
44
|
def self.set_target_xcconfig(pod_bundle, target, config)
|
45
|
-
|
46
|
-
|
47
|
-
file_ref = group.files.find { |f| f.path == path }
|
48
|
-
existing = config.base_configuration_reference
|
45
|
+
file_ref = create_xcconfig_ref(pod_bundle, config)
|
46
|
+
path = file_ref.path
|
49
47
|
|
50
|
-
|
51
|
-
file_ref ||= group.new_file(path)
|
52
|
-
config.base_configuration_reference = file_ref
|
53
|
-
end
|
48
|
+
existing = config.base_configuration_reference
|
54
49
|
|
55
50
|
if existing && existing != file_ref
|
56
51
|
if existing.real_path.to_path.start_with?(pod_bundle.sandbox.root.to_path << '/')
|
57
|
-
|
52
|
+
config.base_configuration_reference = file_ref
|
58
53
|
elsif !xcconfig_includes_target_xcconfig?(config.base_configuration_reference, path)
|
59
54
|
unless existing_config_is_identical_to_pod_config?(existing.real_path, pod_bundle.xcconfig_path(config.name))
|
60
55
|
UI.warn 'CocoaPods did not set the base configuration of your ' \
|
@@ -66,7 +61,7 @@ module Pod
|
|
66
61
|
end
|
67
62
|
end
|
68
63
|
elsif config.base_configuration_reference.nil? || file_ref.nil?
|
69
|
-
|
64
|
+
config.base_configuration_reference = file_ref
|
70
65
|
end
|
71
66
|
end
|
72
67
|
|
@@ -97,7 +92,7 @@ module Pod
|
|
97
92
|
]
|
98
93
|
message = "The `#{target.name} [#{config.name}]` " \
|
99
94
|
"target overrides the `#{key}` build setting defined in " \
|
100
|
-
"`#{pod_bundle.xcconfig_relative_path(config.name)}'. " \
|
95
|
+
"`#{pod_bundle.pod_bundle.xcconfig_relative_path(config.name)}'. " \
|
101
96
|
'This can lead to problems with the CocoaPods installation'
|
102
97
|
UI.warn(message, actions)
|
103
98
|
end
|
@@ -139,6 +134,44 @@ module Pod
|
|
139
134
|
def self.existing_config_is_identical_to_pod_config?(existing_config_path, pod_config_path)
|
140
135
|
existing_config_path.file? && (!pod_config_path.file? || FileUtils.compare_file(existing_config_path, pod_config_path))
|
141
136
|
end
|
137
|
+
|
138
|
+
# Creates a file reference to the xcconfig generated by
|
139
|
+
# CocoaPods (if needed).
|
140
|
+
# If the Pods group not exists, create the group and set
|
141
|
+
# the location to the `Pods` directory.
|
142
|
+
# If the file reference exists, the location is different
|
143
|
+
# with the xcconfig's path and the symlink target paths
|
144
|
+
# are different, we will update the location.
|
145
|
+
#
|
146
|
+
# @param [Target::AggregateTarget] pod_bundle
|
147
|
+
# The Pods bundle.
|
148
|
+
#
|
149
|
+
# @param [Xcodeproj::XCBuildConfiguration] config
|
150
|
+
# The build configuration.
|
151
|
+
#
|
152
|
+
# @return [PBXFileReference] the xcconfig reference.
|
153
|
+
#
|
154
|
+
def self.create_xcconfig_ref(pod_bundle, config)
|
155
|
+
# Xcode root group's path is absolute, we must get the relative path of the sandbox to the user project
|
156
|
+
group_path = pod_bundle.relative_pods_root_path
|
157
|
+
group = config.project['Pods'] || config.project.new_group('Pods', group_path)
|
158
|
+
|
159
|
+
# support user custom paths of Pods group and xcconfigs files.
|
160
|
+
group_path = Pathname.new(group.real_path)
|
161
|
+
xcconfig_path = Pathname.new(pod_bundle.xcconfig_path(config.name))
|
162
|
+
path = xcconfig_path.relative_path_from(group_path)
|
163
|
+
|
164
|
+
filename = path.basename.to_s
|
165
|
+
file_ref = group.files.find { |f| f.display_name == filename }
|
166
|
+
if file_ref && file_ref.path != path
|
167
|
+
file_ref_path = Pathname.new(file_ref.real_path)
|
168
|
+
if !file_ref_path.exist? || !xcconfig_path.exist? || file_ref_path.realpath != xcconfig_path.realpath
|
169
|
+
file_ref.path = path.to_s
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
file_ref || group.new_file(path.to_s)
|
174
|
+
end
|
142
175
|
end
|
143
176
|
end
|
144
177
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_support/core_ext/string/inflections'
|
2
|
+
require 'cocoapods/target/framework_paths'
|
2
3
|
|
3
4
|
module Pod
|
4
5
|
class Installer
|
@@ -48,12 +49,18 @@ module Pod
|
|
48
49
|
#
|
49
50
|
attr_reader :target
|
50
51
|
|
52
|
+
# @return [InstallationOptions] the installation options from the Podfile.
|
53
|
+
#
|
54
|
+
attr_reader :installation_options
|
55
|
+
|
51
56
|
# Init a new TargetIntegrator
|
52
57
|
#
|
53
58
|
# @param [AggregateTarget] target @see #target
|
59
|
+
# @param [InstallationOptions] installation_options @see #installation_options
|
54
60
|
#
|
55
|
-
def initialize(target)
|
61
|
+
def initialize(target, installation_options)
|
56
62
|
@target = target
|
63
|
+
@installation_options = installation_options
|
57
64
|
end
|
58
65
|
|
59
66
|
class << self
|
@@ -162,7 +169,7 @@ module Pod
|
|
162
169
|
#
|
163
170
|
def create_or_update_user_script_phases(script_phases, native_target)
|
164
171
|
script_phase_names = script_phases.map { |k| k[:name] }
|
165
|
-
# Delete script phases no longer present in the target
|
172
|
+
# Delete script phases no longer present in the target.
|
166
173
|
native_target_script_phases = native_target.shell_script_build_phases.select { |bp| !bp.name.nil? && bp.name.start_with?(USER_BUILD_PHASE_PREFIX) }
|
167
174
|
native_target_script_phases.each do |script_phase|
|
168
175
|
script_phase_name_without_prefix = script_phase.name.sub(USER_BUILD_PHASE_PREFIX, '')
|
@@ -171,16 +178,16 @@ module Pod
|
|
171
178
|
end
|
172
179
|
end
|
173
180
|
# Create or update the ones that are expected to be.
|
174
|
-
script_phases.each do |
|
175
|
-
name_with_prefix = USER_BUILD_PHASE_PREFIX +
|
181
|
+
script_phases.each do |script_phase|
|
182
|
+
name_with_prefix = USER_BUILD_PHASE_PREFIX + script_phase[:name]
|
176
183
|
phase = TargetIntegrator.create_or_update_build_phase(native_target, name_with_prefix)
|
177
|
-
phase.shell_script =
|
178
|
-
phase.shell_path =
|
179
|
-
phase.input_paths =
|
180
|
-
phase.output_paths =
|
181
|
-
phase.show_env_vars_in_log =
|
184
|
+
phase.shell_script = script_phase[:script]
|
185
|
+
phase.shell_path = script_phase[:shell_path] if script_phase.key?(:shell_path)
|
186
|
+
phase.input_paths = script_phase[:input_files] if script_phase.key?(:input_files)
|
187
|
+
phase.output_paths = script_phase[:output_files] if script_phase.key?(:output_files)
|
188
|
+
phase.show_env_vars_in_log = script_phase[:show_env_vars_in_log] ? '1' : '0' if script_phase.key?(:show_env_vars_in_log)
|
182
189
|
|
183
|
-
execution_position =
|
190
|
+
execution_position = script_phase[:execution_position]
|
184
191
|
unless execution_position == :any
|
185
192
|
compile_build_phase_index = native_target.build_phases.index do |bp|
|
186
193
|
bp.is_a?(Xcodeproj::Project::Object::PBXSourcesBuildPhase)
|
@@ -254,6 +261,23 @@ module Pod
|
|
254
261
|
File.join(base_path, File.basename(basename, extname) + output_extension)
|
255
262
|
end.uniq
|
256
263
|
end
|
264
|
+
|
265
|
+
# Returns the framework output paths for the given input paths
|
266
|
+
#
|
267
|
+
# @param [Array<Target::FrameworkPaths>] framework_input_paths
|
268
|
+
# The framework input paths to map to output paths.
|
269
|
+
#
|
270
|
+
# @return [Array<String>] The framework output paths
|
271
|
+
#
|
272
|
+
def framework_output_paths(framework_input_paths)
|
273
|
+
framework_input_paths.flat_map do |framework_path|
|
274
|
+
framework_output_path = "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/#{File.basename(framework_path.source_path)}"
|
275
|
+
dsym_path = if (dsym_input_path = framework_path.dsym_path)
|
276
|
+
"${DWARF_DSYM_FOLDER_PATH}/#{File.basename(dsym_input_path)}"
|
277
|
+
end
|
278
|
+
[framework_output_path, dsym_path]
|
279
|
+
end.compact.uniq
|
280
|
+
end
|
257
281
|
end
|
258
282
|
|
259
283
|
# Integrates the user project targets. Only the targets that do **not**
|
@@ -321,18 +345,26 @@ module Pod
|
|
321
345
|
# @return [void]
|
322
346
|
#
|
323
347
|
def add_copy_resources_script_phase
|
324
|
-
|
325
|
-
|
326
|
-
resource_paths_by_config = target.resource_paths_by_config
|
327
|
-
if resource_paths_by_config.values.all?(&:empty?)
|
348
|
+
unless target.includes_resources?
|
349
|
+
native_targets.each do |native_target|
|
328
350
|
TargetIntegrator.remove_copy_resources_script_phase_from_target(native_target)
|
329
|
-
else
|
330
|
-
resource_paths_flattened = resource_paths_by_config.values.flatten.uniq
|
331
|
-
input_paths = [target.copy_resources_script_relative_path, *resource_paths_flattened]
|
332
|
-
output_paths = TargetIntegrator.resource_output_paths(resource_paths_flattened)
|
333
|
-
TargetIntegrator.validate_input_output_path_limit(input_paths, output_paths)
|
334
|
-
TargetIntegrator.create_or_update_copy_resources_script_phase_to_target(native_target, script_path, input_paths, output_paths)
|
335
351
|
end
|
352
|
+
return
|
353
|
+
end
|
354
|
+
script_path = target.copy_resources_script_relative_path
|
355
|
+
input_paths = []
|
356
|
+
output_paths = []
|
357
|
+
unless installation_options.disable_input_output_paths?
|
358
|
+
resource_paths_by_config = target.resource_paths_by_config
|
359
|
+
resource_paths_flattened = resource_paths_by_config.values.flatten.uniq
|
360
|
+
input_paths = [target.copy_resources_script_relative_path, *resource_paths_flattened]
|
361
|
+
output_paths = TargetIntegrator.resource_output_paths(resource_paths_flattened)
|
362
|
+
end
|
363
|
+
TargetIntegrator.validate_input_output_path_limit(input_paths, output_paths)
|
364
|
+
native_targets.each do |native_target|
|
365
|
+
# Static library targets cannot include resources. Skip this phase from being added instead.
|
366
|
+
next if native_target.symbol_type == :static_library
|
367
|
+
TargetIntegrator.create_or_update_copy_resources_script_phase_to_target(native_target, script_path, input_paths, output_paths)
|
336
368
|
end
|
337
369
|
end
|
338
370
|
|
@@ -356,17 +388,25 @@ module Pod
|
|
356
388
|
# @return [void]
|
357
389
|
#
|
358
390
|
def add_embed_frameworks_script_phase
|
359
|
-
|
360
|
-
|
361
|
-
framework_paths_by_config = target.framework_paths_by_config.values.flatten.uniq
|
362
|
-
if framework_paths_by_config.all?(&:empty?)
|
391
|
+
unless target.includes_frameworks?
|
392
|
+
native_targets_to_embed_in.each do |native_target|
|
363
393
|
TargetIntegrator.remove_embed_frameworks_script_phase_from_target(native_target)
|
364
|
-
else
|
365
|
-
input_paths = [target.embed_frameworks_script_relative_path, *framework_paths_by_config.map { |fw| [fw[:input_path], fw[:dsym_input_path]] }.flatten.compact]
|
366
|
-
output_paths = framework_paths_by_config.map { |fw| [fw[:output_path], fw[:dsym_output_path]] }.flatten.compact.uniq
|
367
|
-
TargetIntegrator.validate_input_output_path_limit(input_paths, output_paths)
|
368
|
-
TargetIntegrator.create_or_update_embed_frameworks_script_phase_to_target(native_target, script_path, input_paths, output_paths)
|
369
394
|
end
|
395
|
+
return
|
396
|
+
end
|
397
|
+
script_path = target.embed_frameworks_script_relative_path
|
398
|
+
input_paths = []
|
399
|
+
output_paths = []
|
400
|
+
unless installation_options.disable_input_output_paths?
|
401
|
+
framework_paths = target.framework_paths_by_config.values.flatten.uniq
|
402
|
+
framework_input_paths = framework_paths.flat_map { |path| [path.source_path, path.dsym_path] }.compact
|
403
|
+
input_paths = [target.embed_frameworks_script_relative_path, *framework_input_paths]
|
404
|
+
output_paths = TargetIntegrator.framework_output_paths(framework_paths)
|
405
|
+
TargetIntegrator.validate_input_output_path_limit(input_paths, output_paths)
|
406
|
+
end
|
407
|
+
|
408
|
+
native_targets_to_embed_in.each do |native_target|
|
409
|
+
TargetIntegrator.create_or_update_embed_frameworks_script_phase_to_target(native_target, script_path, input_paths, output_paths)
|
370
410
|
end
|
371
411
|
end
|
372
412
|
|
@@ -13,6 +13,10 @@ module Pod
|
|
13
13
|
class UserProjectIntegrator
|
14
14
|
autoload :TargetIntegrator, 'cocoapods/installer/user_project_integrator/target_integrator'
|
15
15
|
|
16
|
+
include InstallationOptions::Mixin
|
17
|
+
|
18
|
+
delegate_installation_options { podfile }
|
19
|
+
|
16
20
|
# @return [Podfile] the podfile that should be integrated with the user
|
17
21
|
# projects.
|
18
22
|
#
|
@@ -42,9 +46,7 @@ module Pod
|
|
42
46
|
# @param [Podfile] podfile @see #podfile
|
43
47
|
# @param [Sandbox] sandbox @see #sandbox
|
44
48
|
# @param [Pathname] installation_root @see #installation_root
|
45
|
-
# @param [Array<AggregateTarget>]
|
46
|
-
#
|
47
|
-
# @todo Too many initialization arguments
|
49
|
+
# @param [Array<AggregateTarget>] targets @see #targets
|
48
50
|
#
|
49
51
|
def initialize(podfile, sandbox, installation_root, targets)
|
50
52
|
@podfile = podfile
|
@@ -113,7 +115,7 @@ module Pod
|
|
113
115
|
#
|
114
116
|
def integrate_user_targets
|
115
117
|
target_integrators = targets_to_integrate.sort_by(&:name).map do |target|
|
116
|
-
TargetIntegrator.new(target)
|
118
|
+
TargetIntegrator.new(target, installation_options)
|
117
119
|
end
|
118
120
|
|
119
121
|
Config.instance.with_changes(:silent => true) do
|