cocoapods 1.3.0.beta.2 → 1.3.0.beta.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b333fa1137f2e1a7944d505a3980c5e70fbead9c
4
- data.tar.gz: debc12d5f99d1c374220dfb216e144accac4242d
3
+ metadata.gz: 010a300e0d6351f5abbc7c2e9afe809565464c6f
4
+ data.tar.gz: 00b50e9d429fd07a81110a69dfe446fc41aedd98
5
5
  SHA512:
6
- metadata.gz: 86fa795c0a553e257907a02a2b377ad19938f1eb279f75c57105bb7984d72ab823e97481f05c4cf44c0353c392be8ba383422872b254f57b63ae03f53058d537
7
- data.tar.gz: d1d3136f5bec874fa203d453008a8b358e53caf14be96b93c7f66f7ff9cb4a0ed497ba1ccef4fc790870768251ed9cd2c880dc51b04e5e452b1761c5be805406
6
+ metadata.gz: 595776d077642917cc5ccd59586b899cef84ede1a8e1a03f84ad6965e09ea2427053f6ab33ee70baacaf41e40876f794f2284a40b2e63c086bee87803db2ccc6
7
+ data.tar.gz: 5b09a2b7b4a9ea17f2b12fa5eba83308257e28c9701b2c9786e23d7341214e8e323074f817fdbabd800e1ebef38757f43099c06097280bb0bd7a858be750f847
@@ -4,6 +4,49 @@ To install or update CocoaPods see this [guide](http://docs.cocoapods.org/guides
4
4
 
5
5
  To install release candidates run `[sudo] gem install cocoapods --pre`
6
6
 
7
+ ## 1.3.0.beta.3 (2017-07-19)
8
+
9
+ ##### Enhancements
10
+
11
+ * Protect rsync tmp files from being deleted if two targets sync at the same time
12
+ [Justin Martin](https://github.com/justinseanmartin)
13
+ [#6873](https://github.com/CocoaPods/CocoaPods/pull/6873)
14
+
15
+ * Include test schemes within library schemes
16
+ [Dimitris Koutsogiorgas](https://github.com/dnkoutso)
17
+ [#6765](https://github.com/CocoaPods/CocoaPods/issues/6765)
18
+
19
+ * Truncate extra groups in Development Pods when they are parents of all files
20
+ [Eric Amorde](https://github.com/amorde)
21
+ [#6814](https://github.com/CocoaPods/CocoaPods/pull/6814)
22
+
23
+ * Do not re-write generated files that have not changed
24
+ [Dimitris Koutsogiorgas](https://github.com/dnkoutso)
25
+ [dingjingpisces2015](https://github.com/dingjingpisces2015)
26
+ [#6825](https://github.com/CocoaPods/CocoaPods/pull/6825)
27
+
28
+ ##### Bug Fixes
29
+
30
+ * Set the test xcconfig file to resource bundles used only by tests
31
+ [Dimitris Koutsogiorgas](https://github.com/dnkoutso)
32
+ [#6886](https://github.com/CocoaPods/CocoaPods/pull/6886)
33
+
34
+ * Integrate test targets to embed frameworks and resources
35
+ [Dimitris Koutsogiorgas](https://github.com/dnkoutso)
36
+ [#6828](https://github.com/CocoaPods/CocoaPods/pull/6828)
37
+
38
+ * Ensure resource bundle and test dependencies are set for test native targets
39
+ [Dimitris Koutsogiorgas](https://github.com/dnkoutso)
40
+ [#6829](https://github.com/CocoaPods/CocoaPods/pull/6829)
41
+
42
+ * Provide a better error message when references are missing for non-source files
43
+ [David Airapetyan](https://github.com/davidair)
44
+ [#4887](https://github.com/CocoaPods/CocoaPods/issues/4887)
45
+
46
+ * Select unique module_name(s) across host target's and embedded targets' pod targets
47
+ [Anand Biligiri](https://github.com/abiligiri)
48
+ [#6711](https://github.com/CocoaPods/CocoaPods/issues/6711)
49
+
7
50
  ## 1.3.0.beta.2 (2017-06-22)
8
51
 
9
52
  ##### Enhancements
@@ -1,5 +1,5 @@
1
1
  module Pod
2
2
  # The version of the CocoaPods command line tool.
3
3
  #
4
- VERSION = '1.3.0.beta.2'.freeze unless defined? Pod::VERSION
4
+ VERSION = '1.3.0.beta.3'.freeze unless defined? Pod::VERSION
5
5
  end
@@ -104,6 +104,10 @@ RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt
104
104
 
105
105
  XCASSET_FILES=()
106
106
 
107
+ # This protects against multiple targets copying the same framework dependency at the same time. The solution
108
+ # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
109
+ RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
110
+
107
111
  case "${TARGETED_DEVICE_FAMILY}" in
108
112
  1,2)
109
113
  TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone"
@@ -150,8 +154,8 @@ EOM
150
154
  *.framework)
151
155
  echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
152
156
  mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
153
- echo "rsync --delete -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
154
- rsync --delete -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
157
+ echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
158
+ rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
155
159
  ;;
156
160
  *.xcdatamodel)
157
161
  echo "xcrun momc \\"$RESOURCE_PATH\\" \\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\\"" || true
@@ -180,10 +184,10 @@ EOS
180
184
  RSYNC_CALL = <<EOS
181
185
 
182
186
  mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
183
- rsync --delete -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
187
+ rsync --delete -avr --copy-links --no-relative "${RSYNC_PROTECT_TMP_FILES[@]}" --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
184
188
  if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then
185
189
  mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
186
- rsync --delete -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
190
+ rsync --delete -avr --copy-links --no-relative "${RSYNC_PROTECT_TMP_FILES[@]}" --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
187
191
  fi
188
192
  rm -f "$RESOURCES_TO_COPY"
189
193
  EOS
@@ -43,6 +43,10 @@ module Pod
43
43
 
44
44
  SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
45
45
 
46
+ # This protects against multiple targets copying the same framework dependency at the same time. The solution
47
+ # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
48
+ RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
49
+
46
50
  install_framework()
47
51
  {
48
52
  if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
@@ -60,9 +64,9 @@ module Pod
60
64
  source="$(readlink "${source}")"
61
65
  fi
62
66
 
63
- # use filter instead of exclude so missing patterns dont' throw errors
64
- echo "rsync --delete -av --filter \\"- CVS/\\" --filter \\"- .svn/\\" --filter \\"- .git/\\" --filter \\"- .hg/\\" --filter \\"- Headers\\" --filter \\"- PrivateHeaders\\" --filter \\"- Modules\\" \\"${source}\\" \\"${destination}\\""
65
- rsync --delete -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
67
+ # Use filter instead of exclude so missing patterns don't throw errors.
68
+ echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \\"- CVS/\\" --filter \\"- .svn/\\" --filter \\"- .git/\\" --filter \\"- .hg/\\" --filter \\"- Headers\\" --filter \\"- PrivateHeaders\\" --filter \\"- Modules\\" \\"${source}\\" \\"${destination}\\""
69
+ rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
66
70
 
67
71
  local basename
68
72
  basename="$(basename -s .framework "$1")"
@@ -95,8 +99,8 @@ module Pod
95
99
  install_dsym() {
96
100
  local source="$1"
97
101
  if [ -r "$source" ]; then
98
- echo "rsync --delete -av --filter \\"- CVS/\\" --filter \\"- .svn/\\" --filter \\"- .git/\\" --filter \\"- .hg/\\" --filter \\"- Headers\\" --filter \\"- PrivateHeaders\\" --filter \\"- Modules\\" \\"${source}\\" \\"${DWARF_DSYM_FOLDER_PATH}\\""
99
- rsync --delete -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DWARF_DSYM_FOLDER_PATH}"
102
+ echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \\"- CVS/\\" --filter \\"- .svn/\\" --filter \\"- .git/\\" --filter \\"- .hg/\\" --filter \\"- Headers\\" --filter \\"- PrivateHeaders\\" --filter \\"- Modules\\" \\"${source}\\" \\"${DWARF_DSYM_FOLDER_PATH}\\""
103
+ rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DWARF_DSYM_FOLDER_PATH}"
100
104
  fi
101
105
  }
102
106
 
@@ -70,10 +70,10 @@ module Pod
70
70
  end
71
71
  XCConfigHelper.add_target_specific_settings(target, @xcconfig)
72
72
  recursive_dependent_targets = target.recursive_dependent_targets
73
- @xcconfig.merge! XCConfigHelper.settings_for_dependent_targets(target, recursive_dependent_targets)
73
+ @xcconfig.merge! XCConfigHelper.settings_for_dependent_targets(target, recursive_dependent_targets, @test_xcconfig)
74
74
  if @test_xcconfig
75
75
  test_dependent_targets = [target, *target.test_dependent_targets]
76
- @xcconfig.merge! XCConfigHelper.settings_for_dependent_targets(target, test_dependent_targets - recursive_dependent_targets)
76
+ @xcconfig.merge! XCConfigHelper.settings_for_dependent_targets(target, test_dependent_targets - recursive_dependent_targets, @test_xcconfig)
77
77
  XCConfigHelper.generate_vendored_build_settings(nil, test_dependent_targets, @xcconfig)
78
78
  XCConfigHelper.generate_other_ld_flags(nil, test_dependent_targets, @xcconfig)
79
79
  XCConfigHelper.generate_ld_runpath_search_paths(target, false, true, @xcconfig)
@@ -265,9 +265,12 @@ module Pod
265
265
  # @param [Array<PodTarget>] dependent_targets
266
266
  # The pod targets the given target depends on.
267
267
  #
268
+ # @param [Boolean] test_xcconfig
269
+ # Whether the settings for dependent targets are being generated for a test xcconfig or not.
270
+ #
268
271
  # @return [Hash<String, String>] the settings
269
272
  #
270
- def self.settings_for_dependent_targets(target, dependent_targets)
273
+ def self.settings_for_dependent_targets(target, dependent_targets, test_xcconfig = false)
271
274
  dependent_targets = dependent_targets.select(&:should_build?)
272
275
 
273
276
  # Alias build dirs to avoid recursive definitions for pod targets and depending
@@ -277,8 +280,8 @@ module Pod
277
280
  CONFIGURATION_BUILD_DIR_VARIABLE[1..-1] => "#{BUILD_DIR_VARIABLE}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)",
278
281
  }
279
282
 
280
- # Scope pod targets
281
- if target.respond_to?(:configuration_build_dir)
283
+ # Scope pod targets as long as they are not test targets.
284
+ if !test_xcconfig && target.respond_to?(:configuration_build_dir)
282
285
  build_settings['CONFIGURATION_BUILD_DIR'] = target.configuration_build_dir(CONFIGURATION_BUILD_DIR_VARIABLE)
283
286
  end
284
287
 
@@ -279,10 +279,18 @@ module Pod
279
279
  #
280
280
  def clean_sandbox
281
281
  sandbox.public_headers.implode!
282
+ target_support_dirs = sandbox.target_support_files_root.children.select(&:directory?)
282
283
  pod_targets.each do |pod_target|
283
284
  pod_target.build_headers.implode!
285
+ target_support_dirs.delete(pod_target.support_files_dir)
284
286
  end
285
287
 
288
+ aggregate_targets.each do |aggregate_target|
289
+ target_support_dirs.delete(aggregate_target.support_files_dir)
290
+ end
291
+
292
+ target_support_dirs.each { |dir| FileUtils.rm_rf(dir) }
293
+
286
294
  unless sandbox_state.deleted.empty?
287
295
  title_options = { :verbose_prefix => '-> '.red }
288
296
  sandbox_state.deleted.each do |pod_name|
@@ -0,0 +1,85 @@
1
+ module Pod
2
+ class Installer
3
+ # This class is responsible for integrating a pod target. This includes integrating
4
+ # the test targets included by each pod target.
5
+ #
6
+ class PodTargetIntegrator
7
+ # @return [PodTarget] the target that should be integrated.
8
+ #
9
+ attr_reader :target
10
+
11
+ # Init a new PodTargetIntegrator.
12
+ #
13
+ # @param [PodTarget] target @see #target
14
+ #
15
+ def initialize(target)
16
+ @target = target
17
+ end
18
+
19
+ # Integrates the pod target.
20
+ #
21
+ # @return [void]
22
+ #
23
+ def integrate!
24
+ UI.section(integration_message) do
25
+ target.test_native_targets.each do |native_target|
26
+ add_embed_frameworks_script_phase(native_target)
27
+ add_copy_resources_script_phase(native_target)
28
+ end
29
+ end
30
+ end
31
+
32
+ # @return [String] a string representation suitable for debugging.
33
+ #
34
+ def inspect
35
+ "#<#{self.class} for target `#{target.label}'>"
36
+ end
37
+
38
+ private
39
+
40
+ # @!group Integration steps
41
+ #---------------------------------------------------------------------#
42
+
43
+ # Find or create a 'Copy Pods Resources' build phase
44
+ #
45
+ # @return [void]
46
+ #
47
+ def add_copy_resources_script_phase(native_target)
48
+ test_type = target.test_type_for_product_type(native_target.symbol_type)
49
+ script_path = "${PODS_ROOT}/#{target.copy_resources_script_path_for_test_type(test_type).relative_path_from(target.sandbox.root)}"
50
+ resource_paths = [target, *target.test_dependent_targets].flat_map(&:resource_paths)
51
+ input_paths = []
52
+ output_paths = []
53
+ unless resource_paths.empty?
54
+ input_paths = [script_path, *resource_paths.flatten.uniq]
55
+ output_paths = ['${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}']
56
+ end
57
+ Pod::Installer::UserProjectIntegrator::TargetIntegrator.add_copy_resources_script_phase_to_target(native_target, script_path, input_paths, output_paths)
58
+ end
59
+
60
+ # Find or create a 'Embed Pods Frameworks' Copy Files Build Phase
61
+ #
62
+ # @return [void]
63
+ #
64
+ def add_embed_frameworks_script_phase(native_target)
65
+ test_type = target.test_type_for_product_type(native_target.symbol_type)
66
+ script_path = "${PODS_ROOT}/#{target.embed_frameworks_script_path_for_test_type(test_type).relative_path_from(target.sandbox.root)}"
67
+ framework_paths = [target, *target.test_dependent_targets].flat_map(&:framework_paths)
68
+ input_paths = []
69
+ output_paths = []
70
+ unless framework_paths.empty?
71
+ input_paths = [script_path, *framework_paths.map { |fw| [fw[:input_path], fw[:dsym_input_path]] }.flatten.compact]
72
+ output_paths = framework_paths.map { |fw| [fw[:output_path], fw[:dsym_output_path]] }.flatten.compact
73
+ end
74
+ Pod::Installer::UserProjectIntegrator::TargetIntegrator.add_embed_frameworks_script_phase_to_target(native_target, script_path, input_paths, output_paths)
75
+ end
76
+
77
+ # @return [String] the message that should be displayed for the target
78
+ # integration.
79
+ #
80
+ def integration_message
81
+ "Integrating target `#{target.name}`"
82
+ end
83
+ end
84
+ end
85
+ end
@@ -9,7 +9,7 @@ module Pod
9
9
  class TargetIntegrator
10
10
  autoload :XCConfigIntegrator, 'cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator'
11
11
 
12
- # @return [String] the PACKAGE emoji to use as prefix for every build phase aded to the user project
12
+ # @return [String] the PACKAGE emoji to use as prefix for every build phase added to the user project
13
13
  #
14
14
  BUILD_PHASE_PREFIX = '[CP] '.freeze
15
15
 
@@ -47,6 +47,104 @@ module Pod
47
47
  @target = target
48
48
  end
49
49
 
50
+ class << self
51
+ # Adds a shell script build phase responsible to copy (embed) the frameworks
52
+ # generated by the TargetDefinition to the bundle of the product of the
53
+ # targets.
54
+ #
55
+ # @param [PBXNativeTarget] native_target
56
+ # The native target to add the script phase into.
57
+ #
58
+ # @param [String] script_path
59
+ # The script path to execute as part of this script phase.
60
+ #
61
+ # @param [Array<String>] input_paths
62
+ # The input paths (if any) to include for this script phase.
63
+ #
64
+ # @param [Array<String>] output_paths
65
+ # The output paths (if any) to include for this script phase.
66
+ #
67
+ # @return [void]
68
+ #
69
+ def add_embed_frameworks_script_phase_to_target(native_target, script_path, input_paths = [], output_paths = [])
70
+ phase = TargetIntegrator.create_or_update_build_phase(native_target, EMBED_FRAMEWORK_PHASE_NAME)
71
+ phase.shell_script = %("#{script_path}"\n)
72
+ unless input_paths.empty?
73
+ phase.input_paths = input_paths
74
+ end
75
+ unless output_paths.empty?
76
+ phase.output_paths = output_paths
77
+ end
78
+ end
79
+
80
+ # Delete a 'Embed Pods Frameworks' Copy Files Build Phase if present
81
+ #
82
+ # @param [PBXNativeTarget] native_target
83
+ # The native target to remove the script phase from.
84
+ #
85
+ def remove_embed_frameworks_script_phase_from_target(native_target)
86
+ embed_build_phase = native_target.shell_script_build_phases.find { |bp| bp.name && bp.name.end_with?(EMBED_FRAMEWORK_PHASE_NAME) }
87
+ return unless embed_build_phase.present?
88
+ native_target.build_phases.delete(embed_build_phase)
89
+ end
90
+
91
+ # Adds a shell script build phase responsible to copy the resources
92
+ # generated by the TargetDefinition to the bundle of the product of the
93
+ # targets.
94
+ #
95
+ # @param [PBXNativeTarget] native_target
96
+ # The native target to add the script phase into.
97
+ #
98
+ # @param [String] script_path
99
+ # The script path to execute as part of this script phase.
100
+ #
101
+ # @param [Array<String>] input_paths
102
+ # The input paths (if any) to include for this script phase.
103
+ #
104
+ # @param [Array<String>] output_paths
105
+ # The output paths (if any) to include for this script phase.
106
+ #
107
+ # @return [void]
108
+ #
109
+ def add_copy_resources_script_phase_to_target(native_target, script_path, input_paths = [], output_paths = [])
110
+ phase_name = COPY_PODS_RESOURCES_PHASE_NAME
111
+ phase = TargetIntegrator.create_or_update_build_phase(native_target, phase_name)
112
+ phase.shell_script = %("#{script_path}"\n)
113
+ unless input_paths.empty?
114
+ phase.input_paths = input_paths
115
+ end
116
+ unless output_paths.empty?
117
+ phase.output_paths = output_paths
118
+ end
119
+ end
120
+
121
+ # Creates or update a shell script build phase for the given target.
122
+ #
123
+ # @param [PBXNativeTarget] native_target
124
+ # The native target to add the script phase into.
125
+ #
126
+ # @param [String] phase_name
127
+ # The name of the phase to use.
128
+ #
129
+ # @param [Class] phase_class
130
+ # The class of the phase to use.
131
+ #
132
+ # @return [void]
133
+ #
134
+ def create_or_update_build_phase(native_target, phase_name, phase_class = Xcodeproj::Project::Object::PBXShellScriptBuildPhase)
135
+ prefixed_phase_name = BUILD_PHASE_PREFIX + phase_name
136
+ build_phases = native_target.build_phases.grep(phase_class)
137
+ build_phases.find { |phase| phase.name && phase.name.end_with?(phase_name) }.tap { |p| p.name = prefixed_phase_name if p } ||
138
+ native_target.project.new(phase_class).tap do |phase|
139
+ UI.message("Adding Build Phase '#{prefixed_phase_name}' to project.") do
140
+ phase.name = prefixed_phase_name
141
+ phase.show_env_vars_in_log = '0'
142
+ native_target.build_phases << phase
143
+ end
144
+ end
145
+ end
146
+ end
147
+
50
148
  # Integrates the user project targets. Only the targets that do **not**
51
149
  # already have the Pods library in their frameworks build phase are
52
150
  # processed.
@@ -106,13 +204,21 @@ module Pod
106
204
  end
107
205
  end
108
206
 
109
- # Find or create a 'Embed Pods Frameworks' Copy Files Build Phase
207
+ # Find or create a 'Copy Pods Resources' build phase
110
208
  #
111
209
  # @return [void]
112
210
  #
113
- def add_embed_frameworks_script_phase
114
- native_targets_to_embed_in.each do |native_target|
115
- add_embed_frameworks_script_phase_to_target(native_target)
211
+ def add_copy_resources_script_phase
212
+ native_targets.each do |native_target|
213
+ script_path = target.copy_resources_script_relative_path
214
+ resource_paths_by_config = target.resource_paths_by_config
215
+ input_paths = []
216
+ output_paths = []
217
+ unless resource_paths_by_config.values.all?(&:empty?)
218
+ input_paths = [target.copy_resources_script_relative_path, *resource_paths_by_config.values.flatten.uniq]
219
+ output_paths = ['${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}']
220
+ end
221
+ TargetIntegrator.add_copy_resources_script_phase_to_target(native_target, script_path, input_paths, output_paths)
116
222
  end
117
223
  end
118
224
 
@@ -126,49 +232,26 @@ module Pod
126
232
  return unless target.requires_host_target?
127
233
  native_targets.each do |native_target|
128
234
  if AggregateTarget::EMBED_FRAMEWORKS_IN_HOST_TARGET_TYPES.include? native_target.symbol_type
129
- remove_embed_frameworks_script_phase(native_target)
235
+ TargetIntegrator.remove_embed_frameworks_script_phase_from_target(native_target)
130
236
  end
131
237
  end
132
238
  end
133
239
 
134
- def add_embed_frameworks_script_phase_to_target(native_target)
135
- phase = create_or_update_build_phase(native_target, EMBED_FRAMEWORK_PHASE_NAME)
136
- script_path = target.embed_frameworks_script_relative_path
137
- phase.shell_script = %("#{script_path}"\n)
138
- framework_paths_by_config = target.framework_paths_by_config.values.flatten.uniq
139
- unless framework_paths_by_config.all?(&:empty?)
140
- phase.input_paths = [target.embed_frameworks_script_relative_path, *framework_paths_by_config.map { |fw| [fw[:input_path], fw[:dsym_input_path]] }.flatten.compact]
141
- phase.output_paths = framework_paths_by_config.map { |fw| [fw[:output_path], fw[:dsym_output_path]] }.flatten.compact
142
- end
143
- end
144
-
145
- # Delete a 'Embed Pods Frameworks' Copy Files Build Phase if present
146
- #
147
- # @param [PBXNativeTarget] native_target
148
- #
149
- def remove_embed_frameworks_script_phase(native_target)
150
- embed_build_phase = native_target.shell_script_build_phases.find { |bp| bp.name && bp.name.end_with?(EMBED_FRAMEWORK_PHASE_NAME) }
151
- return unless embed_build_phase.present?
152
- native_target.build_phases.delete(embed_build_phase)
153
- end
154
-
155
- # Adds a shell script build phase responsible to copy the resources
156
- # generated by the TargetDefinition to the bundle of the product of the
157
- # targets.
240
+ # Find or create a 'Embed Pods Frameworks' Copy Files Build Phase
158
241
  #
159
242
  # @return [void]
160
243
  #
161
- def add_copy_resources_script_phase
162
- phase_name = COPY_PODS_RESOURCES_PHASE_NAME
163
- native_targets.each do |native_target|
164
- phase = create_or_update_build_phase(native_target, phase_name)
165
- script_path = target.copy_resources_script_relative_path
166
- phase.shell_script = %("#{script_path}"\n)
167
- resource_paths_by_config = target.resource_paths_by_config
168
- unless resource_paths_by_config.values.all?(&:empty?)
169
- phase.input_paths = [target.copy_resources_script_relative_path, *resource_paths_by_config.values.flatten.uniq]
170
- phase.output_paths = ['${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}']
244
+ def add_embed_frameworks_script_phase
245
+ native_targets_to_embed_in.each do |native_target|
246
+ script_path = target.embed_frameworks_script_relative_path
247
+ framework_paths_by_config = target.framework_paths_by_config.values.flatten.uniq
248
+ input_paths = []
249
+ output_paths = []
250
+ unless framework_paths_by_config.all?(&:empty?)
251
+ input_paths = [target.embed_frameworks_script_relative_path, *framework_paths_by_config.map { |fw| [fw[:input_path], fw[:dsym_input_path]] }.flatten.compact]
252
+ output_paths = framework_paths_by_config.map { |fw| [fw[:output_path], fw[:dsym_output_path]] }.flatten.compact
171
253
  end
254
+ TargetIntegrator.add_embed_frameworks_script_phase_to_target(native_target, script_path, input_paths, output_paths)
172
255
  end
173
256
  end
174
257
 
@@ -184,7 +267,7 @@ module Pod
184
267
  def add_check_manifest_lock_script_phase
185
268
  phase_name = CHECK_MANIFEST_PHASE_NAME
186
269
  native_targets.each do |native_target|
187
- phase = create_or_update_build_phase(native_target, phase_name)
270
+ phase = TargetIntegrator.create_or_update_build_phase(native_target, phase_name)
188
271
  native_target.build_phases.unshift(phase).uniq! unless native_target.build_phases.first == phase
189
272
  phase.shell_script = <<-SH.strip_heredoc
190
273
  diff "${PODS_PODFILE_DIR_PATH}/Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
@@ -246,19 +329,6 @@ module Pod
246
329
  "Integrating target `#{target.name}` " \
247
330
  "(#{UI.path target.user_project_path} project)"
248
331
  end
249
-
250
- def create_or_update_build_phase(target, phase_name, phase_class = Xcodeproj::Project::Object::PBXShellScriptBuildPhase)
251
- prefixed_phase_name = BUILD_PHASE_PREFIX + phase_name
252
- build_phases = target.build_phases.grep(phase_class)
253
- build_phases.find { |phase| phase.name && phase.name.end_with?(phase_name) }.tap { |p| p.name = prefixed_phase_name if p } ||
254
- target.project.new(phase_class).tap do |phase|
255
- UI.message("Adding Build Phase '#{prefixed_phase_name}' to project.") do
256
- phase.name = prefixed_phase_name
257
- phase.show_env_vars_in_log = '0'
258
- target.build_phases << phase
259
- end
260
- end
261
- end
262
332
  end
263
333
  end
264
334
  end