cocoapods 1.9.1 → 1.10.2

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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +292 -5
  3. data/README.md +2 -1
  4. data/lib/cocoapods/command/lib/lint.rb +12 -3
  5. data/lib/cocoapods/command/repo/push.rb +1 -1
  6. data/lib/cocoapods/command/repo/update.rb +11 -0
  7. data/lib/cocoapods/command/spec/lint.rb +12 -3
  8. data/lib/cocoapods/command.rb +12 -2
  9. data/lib/cocoapods/config.rb +17 -0
  10. data/lib/cocoapods/downloader/cache.rb +2 -2
  11. data/lib/cocoapods/gem_version.rb +1 -1
  12. data/lib/cocoapods/generator/app_target_helper.rb +10 -2
  13. data/lib/cocoapods/generator/copy_dsyms_script.rb +56 -0
  14. data/lib/cocoapods/generator/copy_resources_script.rb +2 -14
  15. data/lib/cocoapods/generator/copy_xcframework_script.rb +245 -0
  16. data/lib/cocoapods/generator/embed_frameworks_script.rb +125 -212
  17. data/lib/cocoapods/generator/script_phase_constants.rb +99 -0
  18. data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +1 -1
  19. data/lib/cocoapods/installer/analyzer.rb +17 -8
  20. data/lib/cocoapods/installer/base_install_hooks_context.rb +135 -0
  21. data/lib/cocoapods/installer/installation_options.rb +5 -0
  22. data/lib/cocoapods/installer/pod_source_installer.rb +2 -1
  23. data/lib/cocoapods/installer/post_install_hooks_context.rb +1 -127
  24. data/lib/cocoapods/installer/post_integrate_hooks_context.rb +9 -0
  25. data/lib/cocoapods/installer/project_cache/project_metadata_cache.rb +4 -0
  26. data/lib/cocoapods/installer/sandbox_dir_cleaner.rb +2 -1
  27. data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +132 -111
  28. data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +13 -27
  29. data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +5 -1
  30. data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +2 -1
  31. data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_dependency_installer.rb +8 -6
  32. data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +187 -61
  33. data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +61 -30
  34. data/lib/cocoapods/installer/xcode/pods_project_generator/project_generator.rb +3 -2
  35. data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +5 -7
  36. data/lib/cocoapods/installer/xcode/pods_project_generator.rb +45 -6
  37. data/lib/cocoapods/installer/xcode/pods_project_generator_result.rb +19 -0
  38. data/lib/cocoapods/installer/xcode/target_validator.rb +1 -1
  39. data/lib/cocoapods/installer.rb +70 -3
  40. data/lib/cocoapods/sandbox/file_accessor.rb +10 -1
  41. data/lib/cocoapods/sources_manager.rb +2 -1
  42. data/lib/cocoapods/target/aggregate_target.rb +35 -0
  43. data/lib/cocoapods/target/build_settings.rb +94 -18
  44. data/lib/cocoapods/target/pod_target.rb +85 -11
  45. data/lib/cocoapods/target.rb +44 -2
  46. data/lib/cocoapods/user_interface/error_report.rb +1 -1
  47. data/lib/cocoapods/user_interface/inspector_reporter.rb +3 -10
  48. data/lib/cocoapods/validator.rb +38 -12
  49. data/lib/cocoapods/xcode/framework_paths.rb +1 -1
  50. data/lib/cocoapods/xcode/xcframework/xcframework_slice.rb +91 -4
  51. data/lib/cocoapods/xcode/xcframework.rb +17 -4
  52. data/lib/cocoapods.rb +3 -1
  53. metadata +31 -53
  54. data/lib/cocoapods/generator/prepare_artifacts_script.rb +0 -257
@@ -100,16 +100,7 @@ module Pod
100
100
  end
101
101
 
102
102
  INSTALL_RESOURCES_FUNCTION = <<EOS
103
- #!/bin/sh
104
- set -e
105
- set -u
106
- set -o pipefail
107
-
108
- function on_error {
109
- echo "$(realpath -mq "${0}"):$1: error: Unexpected failure"
110
- }
111
- trap 'on_error $LINENO' ERR
112
-
103
+ #{Pod::Generator::ScriptPhaseConstants::DEFAULT_SCRIPT_PHASE_HEADER}
113
104
  if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then
114
105
  # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy
115
106
  # resources to, so exit 0 (signalling the script phase was successful).
@@ -123,10 +114,7 @@ RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt
123
114
 
124
115
  XCASSET_FILES=()
125
116
 
126
- # This protects against multiple targets copying the same framework dependency at the same time. The solution
127
- # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
128
- RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
129
-
117
+ #{Pod::Generator::ScriptPhaseConstants::RSYNC_PROTECT_TMP_FILES}
130
118
  case "${TARGETED_DEVICE_FAMILY:-}" in
131
119
  1,2)
132
120
  TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone"
@@ -0,0 +1,245 @@
1
+ require 'cocoapods/xcode'
2
+
3
+ module Pod
4
+ module Generator
5
+ class CopyXCFrameworksScript
6
+ # @return [Array<Pod::Xcode::XCFramework>] List of xcframeworks to copy
7
+ #
8
+ attr_reader :xcframeworks
9
+
10
+ # @return [Pathname] the root directory of the sandbox
11
+ #
12
+ attr_reader :sandbox_root
13
+
14
+ # @return [Platform] the platform of the target for which this script will run
15
+ #
16
+ attr_reader :platform
17
+
18
+ # Creates a script for copying XCFramework slcies into an intermediate build directory
19
+ #
20
+ # @param [Array<Pod::Xcode::XCFramework>] xcframeworks
21
+ # the list of xcframeworks to copy
22
+ #
23
+ # @param [Pathname] sandbox_root
24
+ # the root of the Sandbox into which this script will be installed
25
+ #
26
+ # @param [Platform] platform
27
+ # the platform of the target for which this script will be run
28
+ #
29
+ def initialize(xcframeworks, sandbox_root, platform)
30
+ @xcframeworks = xcframeworks
31
+ @sandbox_root = sandbox_root
32
+ @platform = platform
33
+ end
34
+
35
+ # Saves the resource script to the given pathname.
36
+ #
37
+ # @param [Pathname] pathname
38
+ # The path where the embed frameworks script should be saved.
39
+ #
40
+ # @return [void]
41
+ #
42
+ def save_as(pathname)
43
+ pathname.open('w') do |file|
44
+ file.puts(script)
45
+ end
46
+ File.chmod(0o755, pathname.to_s)
47
+ end
48
+
49
+ # @return [String] The contents of the embed frameworks script.
50
+ #
51
+ def generate
52
+ script
53
+ end
54
+
55
+ private
56
+
57
+ # @!group Private Helpers
58
+
59
+ # @return [String] The contents of the prepare artifacts script.
60
+ #
61
+ def script
62
+ script = <<-SH.strip_heredoc
63
+ #{Pod::Generator::ScriptPhaseConstants::DEFAULT_SCRIPT_PHASE_HEADER}
64
+
65
+ #{Pod::Generator::ScriptPhaseConstants::RSYNC_PROTECT_TMP_FILES}
66
+
67
+ copy_dir()
68
+ {
69
+ local source="$1"
70
+ local destination="$2"
71
+
72
+ # Use filter instead of exclude so missing patterns don't throw errors.
73
+ echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \\"- CVS/\\" --filter \\"- .svn/\\" --filter \\"- .git/\\" --filter \\"- .hg/\\" \\"${source}\\" \\"${destination}\\""
74
+ rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}" "${destination}"
75
+ }
76
+
77
+ SELECT_SLICE_RETVAL=""
78
+
79
+ select_slice() {
80
+ local paths=("$@")
81
+ # Locate the correct slice of the .xcframework for the current architectures
82
+ local target_path=""
83
+
84
+ # Split archs on space so we can find a slice that has all the needed archs
85
+ local target_archs=$(echo $ARCHS | tr " " "\\n")
86
+
87
+ local target_variant=""
88
+ if [[ "$PLATFORM_NAME" == *"simulator" ]]; then
89
+ target_variant="simulator"
90
+ fi
91
+ if [[ ! -z ${EFFECTIVE_PLATFORM_NAME+x} && "$EFFECTIVE_PLATFORM_NAME" == *"maccatalyst" ]]; then
92
+ target_variant="maccatalyst"
93
+ fi
94
+ for i in ${!paths[@]}; do
95
+ local matched_all_archs="1"
96
+ for target_arch in $target_archs
97
+ do
98
+ if ! [[ "${paths[$i]}" == *"$target_variant"* ]]; then
99
+ matched_all_archs="0"
100
+ break
101
+ fi
102
+
103
+ # Verifies that the path contains the variant string (simulator or maccatalyst) if the variant is set.
104
+ if [[ -z "$target_variant" && ("${paths[$i]}" == *"simulator"* || "${paths[$i]}" == *"maccatalyst"*) ]]; then
105
+ matched_all_archs="0"
106
+ break
107
+ fi
108
+
109
+ # This regex matches all possible variants of the arch in the folder name:
110
+ # Let's say the folder name is: ios-armv7_armv7s_arm64_arm64e/CoconutLib.framework
111
+ # We match the following: -armv7_, _armv7s_, _arm64_ and _arm64e/.
112
+ # If we have a specific variant: ios-i386_x86_64-simulator/CoconutLib.framework
113
+ # We match the following: -i386_ and _x86_64-
114
+ # When the .xcframework wraps a static library, the folder name does not include
115
+ # any .framework. In that case, the folder name can be: ios-arm64_armv7
116
+ # We also match _armv7$ to handle that case.
117
+ local target_arch_regex="[_\\-]${target_arch}([\\/_\\-]|$)"
118
+ if ! [[ "${paths[$i]}" =~ $target_arch_regex ]]; then
119
+ matched_all_archs="0"
120
+ break
121
+ fi
122
+ done
123
+
124
+ if [[ "$matched_all_archs" == "1" ]]; then
125
+ # Found a matching slice
126
+ echo "Selected xcframework slice ${paths[$i]}"
127
+ SELECT_SLICE_RETVAL=${paths[$i]}
128
+ break
129
+ fi
130
+ done
131
+ }
132
+
133
+ install_library() {
134
+ local source="$1"
135
+ local name="$2"
136
+ local destination="#{Target::BuildSettings::XCFRAMEWORKS_BUILD_DIR_VARIABLE}/${name}"
137
+
138
+ # Libraries can contain headers, module maps, and a binary, so we'll copy everything in the folder over
139
+
140
+ local source="$binary"
141
+ echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \\"- CVS/\\" --filter \\"- .svn/\\" --filter \\"- .git/\\" --filter \\"- .hg/\\" \\"${source}/*\\" \\"${destination}\\""
142
+ rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}/*" "${destination}"
143
+ }
144
+
145
+ # Copies a framework to derived data for use in later build phases
146
+ install_framework()
147
+ {
148
+ local source="$1"
149
+ local name="$2"
150
+ local destination="#{Pod::Target::BuildSettings::XCFRAMEWORKS_BUILD_DIR_VARIABLE}/${name}"
151
+
152
+ if [ ! -d "$destination" ]; then
153
+ mkdir -p "$destination"
154
+ fi
155
+
156
+ copy_dir "$source" "$destination"
157
+ echo "Copied $source to $destination"
158
+ }
159
+
160
+ install_xcframework_library() {
161
+ local basepath="$1"
162
+ local name="$2"
163
+ local paths=("$@")
164
+
165
+ # Locate the correct slice of the .xcframework for the current architectures
166
+ select_slice "${paths[@]}"
167
+ local target_path="$SELECT_SLICE_RETVAL"
168
+ if [[ -z "$target_path" ]]; then
169
+ echo "warning: [CP] Unable to find matching .xcframework slice in '${paths[@]}' for the current build architectures ($ARCHS)."
170
+ return
171
+ fi
172
+
173
+ install_framework "$basepath/$target_path" "$name"
174
+ }
175
+
176
+ install_xcframework() {
177
+ local basepath="$1"
178
+ local name="$2"
179
+ local package_type="$3"
180
+ local paths=("$@")
181
+
182
+ # Locate the correct slice of the .xcframework for the current architectures
183
+ select_slice "${paths[@]}"
184
+ local target_path="$SELECT_SLICE_RETVAL"
185
+ if [[ -z "$target_path" ]]; then
186
+ echo "warning: [CP] Unable to find matching .xcframework slice in '${paths[@]}' for the current build architectures ($ARCHS)."
187
+ return
188
+ fi
189
+ local source="$basepath/$target_path"
190
+
191
+ local destination="#{Pod::Target::BuildSettings::XCFRAMEWORKS_BUILD_DIR_VARIABLE}/${name}"
192
+
193
+ if [ ! -d "$destination" ]; then
194
+ mkdir -p "$destination"
195
+ fi
196
+
197
+ copy_dir "$source/" "$destination"
198
+
199
+ echo "Copied $source to $destination"
200
+ }
201
+
202
+ SH
203
+ xcframeworks.each do |xcframework|
204
+ slices = xcframework.slices.select { |f| f.platform.symbolic_name == platform.symbolic_name }
205
+ next if slices.empty?
206
+ args = install_xcframework_args(xcframework, slices)
207
+ script << "install_xcframework #{args}\n"
208
+ end
209
+
210
+ script << "\n" unless xcframeworks.empty?
211
+ script
212
+ end
213
+
214
+ def shell_escape(value)
215
+ "\"#{value}\""
216
+ end
217
+
218
+ def install_xcframework_args(xcframework, slices)
219
+ root = xcframework.path
220
+ args = [shell_escape("${PODS_ROOT}/#{root.relative_path_from(sandbox_root)}")]
221
+ args << shell_escape(xcframework.name)
222
+ is_framework = xcframework.build_type.framework?
223
+ args << shell_escape(is_framework ? 'framework' : 'library')
224
+ slices.each do |slice|
225
+ args << shell_escape(slice.path.dirname.relative_path_from(root))
226
+ end
227
+ args.join(' ')
228
+ end
229
+
230
+ class << self
231
+ # @param [Pathname] xcframework_path
232
+ # the base path of the .xcframework bundle
233
+ #
234
+ # @return [Array<Pathname>] all found .dSYM paths
235
+ #
236
+ def dsym_folder(xcframework_path)
237
+ basename = File.basename(xcframework_path, '.xcframework')
238
+ dsym_basename = basename + '.dSYMs'
239
+ path = xcframework_path.dirname + dsym_basename
240
+ Pathname.new(path) if File.directory?(path)
241
+ end
242
+ end
243
+ end
244
+ end
245
+ end
@@ -8,11 +8,20 @@ module Pod
8
8
  #
9
9
  attr_reader :frameworks_by_config
10
10
 
11
+ # @return [Hash{String => Array<XCFrameworkPaths>}] Multiple lists of frameworks per
12
+ # configuration.
13
+ #
14
+ attr_reader :xcframeworks_by_config
15
+
11
16
  # @param [Hash{String => Array<FrameworkPaths>] frameworks_by_config
12
17
  # @see #frameworks_by_config
13
18
  #
14
- def initialize(frameworks_by_config)
19
+ # @param [Hash{String => Array<XCFramework>] xcframeworks_by_config
20
+ # @see #xcframeworks_by_config
21
+ #
22
+ def initialize(frameworks_by_config, xcframeworks_by_config)
15
23
  @frameworks_by_config = frameworks_by_config
24
+ @xcframeworks_by_config = xcframeworks_by_config
16
25
  end
17
26
 
18
27
  # Saves the resource script to the given pathname.
@@ -43,219 +52,123 @@ module Pod
43
52
  #
44
53
  def script
45
54
  script = <<-SH.strip_heredoc
46
- #!/bin/sh
47
- set -e
48
- set -u
49
- set -o pipefail
50
-
51
- function on_error {
52
- echo "$(realpath -mq "${0}"):$1: error: Unexpected failure"
53
- }
54
- trap 'on_error $LINENO' ERR
55
-
56
- if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then
57
- # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy
58
- # frameworks to, so exit 0 (signalling the script phase was successful).
59
- exit 0
60
- fi
61
-
62
- echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
63
- mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
64
-
65
- COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}"
66
- SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
67
-
68
- # Used as a return value for each invocation of `strip_invalid_archs` function.
69
- STRIP_BINARY_RETVAL=0
70
-
71
- # This protects against multiple targets copying the same framework dependency at the same time. The solution
72
- # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
73
- RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
74
-
75
- # Copies and strips a vendored framework
76
- install_framework()
77
- {
78
- if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
79
- local source="${BUILT_PRODUCTS_DIR}/$1"
80
- elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
81
- local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
82
- elif [ -r "$1" ]; then
83
- local source="$1"
84
- fi
85
-
86
- local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
87
-
88
- if [ -L "${source}" ]; then
89
- echo "Symlinked..."
90
- source="$(readlink "${source}")"
91
- fi
92
-
93
- # Use filter instead of exclude so missing patterns don't throw errors.
94
- echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \\"- CVS/\\" --filter \\"- .svn/\\" --filter \\"- .git/\\" --filter \\"- .hg/\\" --filter \\"- Headers\\" --filter \\"- PrivateHeaders\\" --filter \\"- Modules\\" \\"${source}\\" \\"${destination}\\""
95
- rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
96
-
97
- local basename
98
- basename="$(basename -s .framework "$1")"
99
- binary="${destination}/${basename}.framework/${basename}"
100
-
101
- if ! [ -r "$binary" ]; then
102
- binary="${destination}/${basename}"
103
- elif [ -L "${binary}" ]; then
104
- echo "Destination binary is symlinked..."
105
- dirname="$(dirname "${binary}")"
106
- binary="${dirname}/$(readlink "${binary}")"
107
- fi
108
-
109
- # Strip invalid architectures so "fat" simulator / device frameworks work on device
110
- if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
111
- strip_invalid_archs "$binary"
112
- fi
113
-
114
- # Resign the code if required by the build settings to avoid unstable apps
115
- code_sign_if_enabled "${destination}/$(basename "$1")"
116
-
117
- # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
118
- if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
119
- local swift_runtime_libs
120
- swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\\\/\\(.+dylib\\).*/\\\\1/g | uniq -u)
121
- for lib in $swift_runtime_libs; do
122
- echo "rsync -auv \\"${SWIFT_STDLIB_PATH}/${lib}\\" \\"${destination}\\""
123
- rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
124
- code_sign_if_enabled "${destination}/${lib}"
125
- done
126
- fi
127
- }
128
-
129
- # Copies and strips a vendored dSYM
130
- install_dsym() {
131
- local source="$1"
132
- warn_missing_arch=${2:-true}
133
- if [ -r "$source" ]; then
134
- # Copy the dSYM into the targets temp dir.
135
- echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \\"- CVS/\\" --filter \\"- .svn/\\" --filter \\"- .git/\\" --filter \\"- .hg/\\" --filter \\"- Headers\\" --filter \\"- PrivateHeaders\\" --filter \\"- Modules\\" \\"${source}\\" \\"${DERIVED_FILES_DIR}\\""
136
- rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}"
137
-
138
- local basename
139
- basename="$(basename -s .dSYM "$source")"
140
- binary_name="$(ls "$source/Contents/Resources/DWARF")"
141
- binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}"
142
-
143
- # Strip invalid architectures so "fat" simulator / device frameworks work on device
144
- if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then
145
- strip_invalid_archs "$binary" "$warn_missing_arch"
146
- fi
147
-
148
- if [[ $STRIP_BINARY_RETVAL == 1 ]]; then
149
- # Move the stripped file into its final destination.
150
- echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \\"- CVS/\\" --filter \\"- .svn/\\" --filter \\"- .git/\\" --filter \\"- .hg/\\" --filter \\"- Headers\\" --filter \\"- PrivateHeaders\\" --filter \\"- Modules\\" \\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\\" \\"${DWARF_DSYM_FOLDER_PATH}\\""
151
- rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}"
152
- else
153
- # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.
154
- touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM"
155
- fi
156
- fi
157
- }
158
-
159
- # Copies the bcsymbolmap files of a vendored framework
160
- install_bcsymbolmap() {
161
- local bcsymbolmap_path="$1"
162
- local destination="${BUILT_PRODUCTS_DIR}"
163
- echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${bcsymbolmap_path}\" \"${destination}\""
164
- rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"
165
- }
166
-
167
- # Signs a framework with the provided identity
168
- code_sign_if_enabled() {
169
- if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
170
- # Use the current code_sign_identity
171
- echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
172
- local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'"
173
-
174
- if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
175
- code_sign_cmd="$code_sign_cmd &"
176
- fi
177
- echo "$code_sign_cmd"
178
- eval "$code_sign_cmd"
179
- fi
180
- }
181
-
182
- # Strip invalid architectures
183
- strip_invalid_archs() {
184
- binary="$1"
185
- warn_missing_arch=${2:-true}
186
- # Get architectures for current target binary
187
- binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)"
188
- # Intersect them with the architectures we are building for
189
- intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\\n' | sort | uniq -d)"
190
- # If there are no archs supported by this binary then warn the user
191
- if [[ -z "$intersected_archs" ]]; then
192
- if [[ "$warn_missing_arch" == "true" ]]; then
193
- echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)."
194
- fi
195
- STRIP_BINARY_RETVAL=0
196
- return
197
- fi
198
- stripped=""
199
- for arch in $binary_archs; do
200
- if ! [[ "${ARCHS}" == *"$arch"* ]]; then
201
- # Strip non-valid architectures in-place
202
- lipo -remove "$arch" -output "$binary" "$binary"
203
- stripped="$stripped $arch"
204
- fi
205
- done
206
- if [[ "$stripped" ]]; then
207
- echo "Stripped $binary of architectures:$stripped"
208
- fi
209
- STRIP_BINARY_RETVAL=1
210
- }
211
-
212
- install_artifact() {
213
- artifact="$1"
214
- base="$(basename "$artifact")"
215
- case $base in
216
- *.framework)
217
- install_framework "$artifact"
218
- ;;
219
- *.dSYM)
220
- # Suppress arch warnings since XCFrameworks will include many dSYM files
221
- install_dsym "$artifact" "false"
222
- ;;
223
- *.bcsymbolmap)
224
- install_bcsymbolmap "$artifact"
225
- ;;
226
- *)
227
- echo "error: Unrecognized artifact "$artifact""
228
- ;;
229
- esac
230
- }
231
-
232
- copy_artifacts() {
233
- file_list="$1"
234
- while read artifact; do
235
- install_artifact "$artifact"
236
- done <$file_list
237
- }
238
-
239
- ARTIFACT_LIST_FILE="${BUILT_PRODUCTS_DIR}/cocoapods-artifacts-${CONFIGURATION}.txt"
240
- if [ -r "${ARTIFACT_LIST_FILE}" ]; then
241
- copy_artifacts "${ARTIFACT_LIST_FILE}"
242
- fi
243
-
55
+ #{Pod::Generator::ScriptPhaseConstants::DEFAULT_SCRIPT_PHASE_HEADER}
56
+ if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then
57
+ # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy
58
+ # frameworks to, so exit 0 (signalling the script phase was successful).
59
+ exit 0
60
+ fi
61
+
62
+ echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
63
+ mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
64
+
65
+ COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}"
66
+ SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
67
+ BCSYMBOLMAP_DIR="BCSymbolMaps"
68
+
69
+
70
+ #{Pod::Generator::ScriptPhaseConstants::RSYNC_PROTECT_TMP_FILES}
71
+ # Copies and strips a vendored framework
72
+ install_framework()
73
+ {
74
+ if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
75
+ local source="${BUILT_PRODUCTS_DIR}/$1"
76
+ elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
77
+ local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
78
+ elif [ -r "$1" ]; then
79
+ local source="$1"
80
+ fi
81
+
82
+ local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
83
+
84
+ if [ -L "${source}" ]; then
85
+ echo "Symlinked..."
86
+ source="$(readlink "${source}")"
87
+ fi
88
+
89
+ if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then
90
+ # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied
91
+ find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do
92
+ echo "Installing $f"
93
+ install_bcsymbolmap "$f" "$destination"
94
+ rm "$f"
95
+ done
96
+ rmdir "${source}/${BCSYMBOLMAP_DIR}"
97
+ fi
98
+
99
+ # Use filter instead of exclude so missing patterns don't throw errors.
100
+ echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \\"- CVS/\\" --filter \\"- .svn/\\" --filter \\"- .git/\\" --filter \\"- .hg/\\" --filter \\"- Headers\\" --filter \\"- PrivateHeaders\\" --filter \\"- Modules\\" \\"${source}\\" \\"${destination}\\""
101
+ rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
102
+
103
+ local basename
104
+ basename="$(basename -s .framework "$1")"
105
+ binary="${destination}/${basename}.framework/${basename}"
106
+
107
+ if ! [ -r "$binary" ]; then
108
+ binary="${destination}/${basename}"
109
+ elif [ -L "${binary}" ]; then
110
+ echo "Destination binary is symlinked..."
111
+ dirname="$(dirname "${binary}")"
112
+ binary="${dirname}/$(readlink "${binary}")"
113
+ fi
114
+
115
+ # Strip invalid architectures so "fat" simulator / device frameworks work on device
116
+ if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
117
+ strip_invalid_archs "$binary"
118
+ fi
119
+
120
+ # Resign the code if required by the build settings to avoid unstable apps
121
+ code_sign_if_enabled "${destination}/$(basename "$1")"
122
+
123
+ # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
124
+ if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
125
+ local swift_runtime_libs
126
+ swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\\\/\\(.+dylib\\).*/\\\\1/g | uniq -u)
127
+ for lib in $swift_runtime_libs; do
128
+ echo "rsync -auv \\"${SWIFT_STDLIB_PATH}/${lib}\\" \\"${destination}\\""
129
+ rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
130
+ code_sign_if_enabled "${destination}/${lib}"
131
+ done
132
+ fi
133
+ }
134
+ #{Pod::Generator::ScriptPhaseConstants::INSTALL_DSYM_METHOD}
135
+ #{Pod::Generator::ScriptPhaseConstants::STRIP_INVALID_ARCHITECTURES_METHOD}
136
+ #{Pod::Generator::ScriptPhaseConstants::INSTALL_BCSYMBOLMAP_METHOD}
137
+ # Signs a framework with the provided identity
138
+ code_sign_if_enabled() {
139
+ if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
140
+ # Use the current code_sign_identity
141
+ echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
142
+ local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'"
143
+
144
+ if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
145
+ code_sign_cmd="$code_sign_cmd &"
146
+ fi
147
+ echo "$code_sign_cmd"
148
+ eval "$code_sign_cmd"
149
+ fi
150
+ }
244
151
  SH
245
- frameworks_by_config.each do |config, frameworks_with_dsyms|
246
- next if frameworks_with_dsyms.empty?
247
- script << %(if [[ "$CONFIGURATION" == "#{config}" ]]; then\n)
248
- frameworks_with_dsyms.each do |framework_with_dsym|
249
- script << %( install_framework "#{framework_with_dsym.source_path}"\n)
250
- # Vendored frameworks might have a dSYM file next to them so ensure its copied. Frameworks built from
251
- # sources will have their dSYM generated and copied by Xcode.
252
- script << %( install_dsym "#{framework_with_dsym.dsym_path}"\n) unless framework_with_dsym.dsym_path.nil?
253
- unless framework_with_dsym.bcsymbolmap_paths.nil?
254
- framework_with_dsym.bcsymbolmap_paths.each do |bcsymbolmap_path|
255
- script << %( install_bcsymbolmap "#{bcsymbolmap_path}"\n)
256
- end
257
- end
152
+ contents_by_config = Hash.new do |hash, key|
153
+ hash[key] = ''
154
+ end
155
+ frameworks_by_config.each do |config, frameworks|
156
+ frameworks.each do |framework|
157
+ contents_by_config[config] << %( install_framework "#{framework.source_path}"\n)
258
158
  end
159
+ end
160
+ xcframeworks_by_config.each do |config, xcframeworks|
161
+ xcframeworks.select { |xcf| xcf.build_type.dynamic_framework? }.each do |xcframework|
162
+ name = xcframework.name
163
+ contents_by_config[config] << %( install_framework "#{Target::BuildSettings::XCFRAMEWORKS_BUILD_DIR_VARIABLE}/#{name}/#{name}.framework"\n)
164
+ end
165
+ end
166
+ script << "\n" unless contents_by_config.empty?
167
+ contents_by_config.keys.sort.each do |config|
168
+ contents = contents_by_config[config]
169
+ next if contents.empty?
170
+ script << %(if [[ "$CONFIGURATION" == "#{config}" ]]; then\n)
171
+ script << contents
259
172
  script << "fi\n"
260
173
  end
261
174
  script << <<-SH.strip_heredoc