cocoapods 1.4.0.beta.2 → 1.4.0.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +96 -1
- data/lib/cocoapods/command/outdated.rb +16 -2
- data/lib/cocoapods/external_sources/path_source.rb +1 -1
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/embed_frameworks_script.rb +36 -13
- data/lib/cocoapods/generator/xcconfig/pod_xcconfig.rb +3 -3
- data/lib/cocoapods/generator/xcconfig/xcconfig_helper.rb +23 -10
- data/lib/cocoapods/installer.rb +4 -5
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +26 -3
- data/lib/cocoapods/installer/xcode/pods_project_generator.rb +14 -7
- data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +20 -1
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +20 -10
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +7 -2
- data/lib/cocoapods/installer/xcode/target_validator.rb +1 -0
- data/lib/cocoapods/project.rb +14 -3
- data/lib/cocoapods/sandbox.rb +21 -11
- data/lib/cocoapods/sandbox/file_accessor.rb +36 -0
- data/lib/cocoapods/sources_manager.rb +3 -1
- data/lib/cocoapods/target/pod_target.rb +10 -2
- data/lib/cocoapods/validator.rb +51 -10
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3fb1486e8a7724cc9a1ef5a1121aec8cc3b88801
|
4
|
+
data.tar.gz: 4f61dc7de59a46d9407f427239761da95b4cd72f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b81780a945ded8208719682bea1db9de648a1b0373b3df6454ea1e57e2bc32e561e7bfd3c4170f343d058f949225cf995168db790dd5713e11d734335b2e587
|
7
|
+
data.tar.gz: 2f1f5de875bc175d019b6ec3f5312d72571708d1c380e19c6326db83071597673993a0f3bce777718eec66b5a3779b435a920ec5de8170f7e9ddeadafb7b898d
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,101 @@ 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.4.0.rc.1 (2017-12-16)
|
8
|
+
|
9
|
+
##### Enhancements
|
10
|
+
|
11
|
+
* Integrate `swift_version` DSL support into pod targets
|
12
|
+
[Dimitris Koutsogiorgas](https://github.com/dnkoutso)
|
13
|
+
[#7134](https://github.com/CocoaPods/CocoaPods/issues/7134)
|
14
|
+
|
15
|
+
* Add color indication to output of `pod outdated`
|
16
|
+
[iv-mexx](https://github.com/iv-mexx)
|
17
|
+
[#7204](https://github.com/CocoaPods/CocoaPods/pull/7204)
|
18
|
+
|
19
|
+
* Set syntax of podspecs from development pods to Ruby when appropriate
|
20
|
+
[Eric Amorde](https://github.com/amorde)
|
21
|
+
[#7278](https://github.com/CocoaPods/CocoaPods/pull/7278)
|
22
|
+
|
23
|
+
* Add support for editing the podspec, license, README, license, and docs of local development pods
|
24
|
+
[Eric Amorde](https://github.com/amorde)
|
25
|
+
[#7093](https://github.com/CocoaPods/CocoaPods/pull/7093)
|
26
|
+
|
27
|
+
* Show warning when SDK provider tries to push a version with an unencrypted HTTP source
|
28
|
+
[KrauseFx](https://github.com/KrauseFx)
|
29
|
+
[#7250](https://github.com/CocoaPods/CocoaPods/pull/7250)
|
30
|
+
|
31
|
+
##### Bug Fixes
|
32
|
+
|
33
|
+
* Deduplicate output path file names for resources and frameworks
|
34
|
+
[Eric Amorde](https://github.com/amorde)
|
35
|
+
[#7259](https://github.com/CocoaPods/CocoaPods/issues/7259)
|
36
|
+
|
37
|
+
* Allow installation of a pod with its own Swift version on multiple targets
|
38
|
+
[Dimitris Koutsogiorgas](https://github.com/dnkoutso)
|
39
|
+
[#7261](https://github.com/CocoaPods/CocoaPods/pull/7261)
|
40
|
+
|
41
|
+
* Quote framework names in OTHER_LDFLAGS
|
42
|
+
[Tyler Stromberg](https://github.com/AquaGeek)
|
43
|
+
[#7185](https://github.com/CocoaPods/CocoaPods/issues/7185)
|
44
|
+
|
45
|
+
* Fix static framework archive regression from #7187
|
46
|
+
[Paul Beusterien](https://github.com/paulb777)
|
47
|
+
[#7225](https://github.com/CocoaPods/CocoaPods/issues/7225)
|
48
|
+
|
49
|
+
* Install resource bundles and embed frameworks for every test target's configuration
|
50
|
+
[Nickolay Tarbayev](https://github.com/tarbayev)
|
51
|
+
[#7012](https://github.com/CocoaPods/CocoaPods/issues/7012)
|
52
|
+
|
53
|
+
* Set `SWIFT_VERSION` to test native targets during validation
|
54
|
+
[Dimitris Koutsogiorgas](https://github.com/dnkoutso)
|
55
|
+
[#7216](https://github.com/CocoaPods/CocoaPods/pull/7216)
|
56
|
+
|
57
|
+
* Add copied resources' paths to "Copy Pods Resources" output file list
|
58
|
+
[igor-makarov](https://github.com/igor-makarov)
|
59
|
+
[#6936](https://github.com/CocoaPods/CocoaPods/issues/6936)
|
60
|
+
|
61
|
+
* Do not link system frameworks of test specs to library targets
|
62
|
+
[Dimitris Koutsogiorgas](https://github.com/dnkoutso)
|
63
|
+
[#7205](https://github.com/CocoaPods/CocoaPods/pull/7205)
|
64
|
+
|
65
|
+
* Be more lenient when stripping frameworks and dSYMs for non fat binaries
|
66
|
+
[Dimitris Koutsogiorgas](https://github.com/dnkoutso)
|
67
|
+
[#7196](https://github.com/CocoaPods/CocoaPods/issues/7196)
|
68
|
+
[#5854](https://github.com/CocoaPods/CocoaPods/issues/5854)
|
69
|
+
|
70
|
+
* Do not display script phases warnings multiple times per platform
|
71
|
+
[Dimitris Koutsogiorgas](https://github.com/dnkoutso)
|
72
|
+
[#7193](https://github.com/CocoaPods/CocoaPods/pull/7193)
|
73
|
+
|
74
|
+
* Fix unnecessary whole project recompilation with static frameworks
|
75
|
+
[Vladimir Gorbenko](https://github.com/volodg)
|
76
|
+
[#7187](https://github.com/CocoaPods/CocoaPods/issues/7187)
|
77
|
+
|
78
|
+
* Prevent passing empty string to git when running `pod repo update --silent`
|
79
|
+
[Jon Sorrells](https://github.com/jonsorrells)
|
80
|
+
[#7176](https://github.com/CocoaPods/CocoaPods/issues/7176)
|
81
|
+
|
82
|
+
* Do not propagate test spec frameworks and libraries into pod target xcconfig
|
83
|
+
[Dimitris Koutsogiorgas](https://github.com/dnkoutso)
|
84
|
+
[#7172](https://github.com/CocoaPods/CocoaPods/issues/7172)
|
85
|
+
|
86
|
+
* Set language to Swift for test native targets if any dependencies use Swift
|
87
|
+
[Dimitris Koutsogiorgas](https://github.com/dnkoutso)
|
88
|
+
[#7170](https://github.com/CocoaPods/CocoaPods/issues/7170)
|
89
|
+
|
90
|
+
* Prevent multiple script phases from stripping vendored dSYM
|
91
|
+
[Dimitris Koutsogiorgas](https://github.com/dnkoutso)
|
92
|
+
[#7166](https://github.com/CocoaPods/CocoaPods/pull/7166)
|
93
|
+
|
94
|
+
* Static library headers should all be `Project` in Xcode header build phase
|
95
|
+
[Paul Beusterien](https://github.com/paulb777)
|
96
|
+
[#4496](https://github.com/CocoaPods/CocoaPods/issues/4496)
|
97
|
+
|
98
|
+
* Fix archiving apps with static frameworks
|
99
|
+
[Paul Beusterien](https://github.com/paulb777)
|
100
|
+
[#7158](https://github.com/CocoaPods/CocoaPods/issues/7158)
|
101
|
+
|
7
102
|
## 1.4.0.beta.2 (2017-10-24)
|
8
103
|
|
9
104
|
##### Enhancements
|
@@ -67,7 +162,7 @@ To install release candidates run `[sudo] gem install cocoapods --pre`
|
|
67
162
|
[Dimitris Koutsogiorgas](https://github.com/dnkoutso)
|
68
163
|
[#7104](https://github.com/CocoaPods/CocoaPods/pull/7104)
|
69
164
|
|
70
|
-
* Do not set a `CODE_SIGN_IDENTITY` for macOS app hosts or xctest bundles
|
165
|
+
* Do not set a `CODE_SIGN_IDENTITY` for macOS app hosts or xctest bundles
|
71
166
|
[Dimitris Koutsogiorgas](https://github.com/dnkoutso)
|
72
167
|
[#7103](https://github.com/CocoaPods/CocoaPods/pull/7103)
|
73
168
|
|
@@ -22,10 +22,24 @@ module Pod
|
|
22
22
|
if updates.empty?
|
23
23
|
UI.puts 'No pod updates are available.'.yellow
|
24
24
|
else
|
25
|
+
UI.section 'The color indicates what happens when you run `pod update`' do
|
26
|
+
UI.puts "#{'<green>'.green}\t\t - Will be updated to the newest version"
|
27
|
+
UI.puts "#{'<yellow>'.yellow}\t - Will be updated, but not to the newest version because of specified version in Podfile"
|
28
|
+
UI.puts "#{'<red>'.red}\t\t - Will not be updated because of specified version in Podfile"
|
29
|
+
UI.puts ''
|
30
|
+
end
|
25
31
|
UI.section 'The following pod updates are available:' do
|
26
32
|
updates.each do |(name, from_version, matching_version, to_version)|
|
27
|
-
|
28
|
-
|
33
|
+
color = :yellow
|
34
|
+
if matching_version == to_version
|
35
|
+
color = :green
|
36
|
+
elsif from_version == matching_version
|
37
|
+
color = :red
|
38
|
+
end
|
39
|
+
# For the specs, its necessary that to_s is called here even though it is redundant
|
40
|
+
# https://github.com/CocoaPods/CocoaPods/pull/7204#issuecomment-342512015
|
41
|
+
UI.puts "- #{name} #{from_version.to_s.send(color)} -> #{matching_version.to_s.send(color)} " \
|
42
|
+
"(latest version #{to_version.to_s})" # rubocop:disable Lint/StringConversionInInterpolation
|
29
43
|
end
|
30
44
|
end
|
31
45
|
end
|
@@ -16,7 +16,7 @@ module Pod
|
|
16
16
|
end
|
17
17
|
store_podspec(sandbox, podspec, podspec.extname == '.json')
|
18
18
|
is_absolute = absolute?(declared_path)
|
19
|
-
sandbox.store_local_path(name, podspec
|
19
|
+
sandbox.store_local_path(name, podspec, is_absolute)
|
20
20
|
sandbox.remove_checkout_source(name)
|
21
21
|
end
|
22
22
|
end
|
@@ -43,10 +43,14 @@ module Pod
|
|
43
43
|
|
44
44
|
SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
|
45
45
|
|
46
|
+
# Used as a return value for each invocation of `strip_invalid_archs` function.
|
47
|
+
STRIP_BINARY_RETVAL=0
|
48
|
+
|
46
49
|
# This protects against multiple targets copying the same framework dependency at the same time. The solution
|
47
50
|
# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
|
48
51
|
RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
|
49
52
|
|
53
|
+
# Copies and strips a vendored framework
|
50
54
|
install_framework()
|
51
55
|
{
|
52
56
|
if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
|
@@ -95,21 +99,31 @@ module Pod
|
|
95
99
|
fi
|
96
100
|
}
|
97
101
|
|
98
|
-
# Copies
|
102
|
+
# Copies and strips a vendored dSYM
|
99
103
|
install_dsym() {
|
100
104
|
local source="$1"
|
101
105
|
if [ -r "$source" ]; then
|
102
|
-
|
103
|
-
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS
|
104
|
-
|
106
|
+
# Copy the dSYM into a the targets temp dir.
|
107
|
+
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}\\""
|
108
|
+
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}"
|
105
109
|
|
106
|
-
|
107
|
-
|
108
|
-
|
110
|
+
local basename
|
111
|
+
basename="$(basename -s .framework.dSYM "$source")"
|
112
|
+
binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}"
|
109
113
|
|
110
|
-
|
111
|
-
|
112
|
-
|
114
|
+
# Strip invalid architectures so "fat" simulator / device frameworks work on device
|
115
|
+
if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then
|
116
|
+
strip_invalid_archs "$binary"
|
117
|
+
fi
|
118
|
+
|
119
|
+
if [[ $STRIP_BINARY_RETVAL == 1 ]]; then
|
120
|
+
# Move the stripped file into its final destination.
|
121
|
+
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \\"- CVS/\\" --filter \\"- .svn/\\" --filter \\"- .git/\\" --filter \\"- .hg/\\" --filter \\"- Headers\\" --filter \\"- PrivateHeaders\\" --filter \\"- Modules\\" \\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\\" \\"${DWARF_DSYM_FOLDER_PATH}\\""
|
122
|
+
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}"
|
123
|
+
else
|
124
|
+
# 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.
|
125
|
+
touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM"
|
126
|
+
fi
|
113
127
|
fi
|
114
128
|
}
|
115
129
|
|
@@ -131,10 +145,18 @@ module Pod
|
|
131
145
|
# Strip invalid architectures
|
132
146
|
strip_invalid_archs() {
|
133
147
|
binary="$1"
|
134
|
-
# Get architectures for current
|
135
|
-
|
148
|
+
# Get architectures for current target binary
|
149
|
+
binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)"
|
150
|
+
# Intersect them with the architectures we are building for
|
151
|
+
intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\\n' | sort | uniq -d)"
|
152
|
+
# If there are no archs supported by this binary then warn the user
|
153
|
+
if [[ -z "$intersected_archs" ]]; then
|
154
|
+
echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)."
|
155
|
+
STRIP_BINARY_RETVAL=0
|
156
|
+
return
|
157
|
+
fi
|
136
158
|
stripped=""
|
137
|
-
for arch in $
|
159
|
+
for arch in $binary_archs; do
|
138
160
|
if ! [[ "${ARCHS}" == *"$arch"* ]]; then
|
139
161
|
# Strip non-valid architectures in-place
|
140
162
|
lipo -remove "$arch" -output "$binary" "$binary" || exit 1
|
@@ -144,6 +166,7 @@ module Pod
|
|
144
166
|
if [[ "$stripped" ]]; then
|
145
167
|
echo "Stripped $binary of architectures:$stripped"
|
146
168
|
fi
|
169
|
+
STRIP_BINARY_RETVAL=1
|
147
170
|
}
|
148
171
|
|
149
172
|
SH
|
@@ -64,18 +64,18 @@ module Pod
|
|
64
64
|
|
65
65
|
@xcconfig = Xcodeproj::Config.new(config)
|
66
66
|
|
67
|
-
XCConfigHelper.add_settings_for_file_accessors_of_target(nil, target, @xcconfig)
|
67
|
+
XCConfigHelper.add_settings_for_file_accessors_of_target(nil, target, @xcconfig, true, @test_xcconfig)
|
68
68
|
target.file_accessors.each do |file_accessor|
|
69
69
|
@xcconfig.merge!(file_accessor.spec_consumer.pod_target_xcconfig) if @test_xcconfig == file_accessor.spec.test_specification?
|
70
70
|
end
|
71
71
|
XCConfigHelper.add_target_specific_settings(target, @xcconfig)
|
72
72
|
recursive_dependent_targets = target.recursive_dependent_targets
|
73
73
|
@xcconfig.merge! XCConfigHelper.search_paths_for_dependent_targets(target, recursive_dependent_targets, @test_xcconfig)
|
74
|
-
XCConfigHelper.generate_vendored_build_settings(target, recursive_dependent_targets, @xcconfig, false) if target.requires_frameworks?
|
74
|
+
XCConfigHelper.generate_vendored_build_settings(target, recursive_dependent_targets, @xcconfig, false, @test_xcconfig) if target.requires_frameworks?
|
75
75
|
if @test_xcconfig
|
76
76
|
test_dependent_targets = [target, *target.recursive_test_dependent_targets].uniq
|
77
77
|
@xcconfig.merge! XCConfigHelper.search_paths_for_dependent_targets(target, test_dependent_targets - recursive_dependent_targets, @test_xcconfig)
|
78
|
-
XCConfigHelper.generate_vendored_build_settings(nil, target.all_test_dependent_targets, @xcconfig)
|
78
|
+
XCConfigHelper.generate_vendored_build_settings(nil, target.all_test_dependent_targets, @xcconfig, true, @test_xcconfig)
|
79
79
|
XCConfigHelper.generate_other_ld_flags(nil, target.all_test_dependent_targets, @xcconfig)
|
80
80
|
XCConfigHelper.generate_ld_runpath_search_paths(target, false, true, @xcconfig)
|
81
81
|
end
|
@@ -75,19 +75,24 @@ module Pod
|
|
75
75
|
# @param [Boolean] include_ld_flags
|
76
76
|
# Indicates whether or not to generate ld flags in addition to compile flags
|
77
77
|
#
|
78
|
+
# @param [Boolean] test_xcconfig
|
79
|
+
# Whether the settings for dependent targets are being generated for a test xcconfig or not.
|
80
|
+
#
|
78
81
|
# @return [void]
|
79
82
|
#
|
80
|
-
def self.add_settings_for_file_accessors_of_target(target, pod_target, xcconfig, include_ld_flags = true)
|
81
|
-
pod_target.file_accessors
|
83
|
+
def self.add_settings_for_file_accessors_of_target(target, pod_target, xcconfig, include_ld_flags = true, test_xcconfig = false)
|
84
|
+
file_accessors = pod_target.file_accessors
|
85
|
+
file_accessors = file_accessors.reject { |f| f.spec.test_specification? } unless test_xcconfig
|
86
|
+
file_accessors.each do |file_accessor|
|
82
87
|
if target.nil? || !file_accessor.spec.test_specification?
|
83
88
|
XCConfigHelper.add_spec_build_settings_to_xcconfig(file_accessor.spec_consumer, xcconfig) if include_ld_flags
|
84
89
|
XCConfigHelper.add_static_dependency_build_settings(target, pod_target, xcconfig, file_accessor, include_ld_flags)
|
85
90
|
end
|
86
91
|
end
|
87
|
-
XCConfigHelper.add_dynamic_dependency_build_settings(target, pod_target, xcconfig, include_ld_flags)
|
92
|
+
XCConfigHelper.add_dynamic_dependency_build_settings(target, pod_target, xcconfig, include_ld_flags, test_xcconfig)
|
88
93
|
if pod_target.requires_frameworks?
|
89
94
|
pod_target.dependent_targets.each do |dependent_target|
|
90
|
-
XCConfigHelper.add_dynamic_dependency_build_settings(target, dependent_target, xcconfig, include_ld_flags)
|
95
|
+
XCConfigHelper.add_dynamic_dependency_build_settings(target, dependent_target, xcconfig, include_ld_flags, test_xcconfig)
|
91
96
|
end
|
92
97
|
end
|
93
98
|
end
|
@@ -153,10 +158,15 @@ module Pod
|
|
153
158
|
# @param [Boolean] include_ld_flags
|
154
159
|
# Indicates whether or not to generate ld flags in addition to compile flags
|
155
160
|
#
|
161
|
+
# @param [Boolean] test_xcconfig
|
162
|
+
# Whether the settings for dependent targets are being generated for a test xcconfig or not.
|
163
|
+
#
|
156
164
|
# @return [void]
|
157
165
|
#
|
158
|
-
def self.add_dynamic_dependency_build_settings(target, pod_target, xcconfig, include_ld_flags)
|
159
|
-
pod_target.file_accessors
|
166
|
+
def self.add_dynamic_dependency_build_settings(target, pod_target, xcconfig, include_ld_flags, test_xcconfig)
|
167
|
+
file_accessors = pod_target.file_accessors
|
168
|
+
file_accessors = file_accessors.reject { |f| f.spec.test_specification? } unless test_xcconfig
|
169
|
+
file_accessors.each do |file_accessor|
|
160
170
|
if target.nil? || !file_accessor.spec.test_specification?
|
161
171
|
file_accessor.vendored_dynamic_frameworks.each do |vendored_dynamic_framework|
|
162
172
|
XCConfigHelper.add_framework_build_settings(vendored_dynamic_framework, xcconfig, pod_target.sandbox.root, include_ld_flags)
|
@@ -209,7 +219,7 @@ module Pod
|
|
209
219
|
build_settings = {
|
210
220
|
'FRAMEWORK_SEARCH_PATHS' => quote([dirname]),
|
211
221
|
}
|
212
|
-
build_settings['OTHER_LDFLAGS'] = "-framework #{name}" if include_ld_flags
|
222
|
+
build_settings['OTHER_LDFLAGS'] = "-framework \"#{name}\"" if include_ld_flags
|
213
223
|
xcconfig.merge!(build_settings)
|
214
224
|
end
|
215
225
|
|
@@ -237,7 +247,7 @@ module Pod
|
|
237
247
|
build_settings = {
|
238
248
|
'LIBRARY_SEARCH_PATHS' => quote([dirname]),
|
239
249
|
}
|
240
|
-
build_settings['OTHER_LDFLAGS'] = "-l#{name}" if include_ld_flags
|
250
|
+
build_settings['OTHER_LDFLAGS'] = "-l\"#{name}\"" if include_ld_flags
|
241
251
|
xcconfig.merge!(build_settings)
|
242
252
|
end
|
243
253
|
|
@@ -376,16 +386,19 @@ module Pod
|
|
376
386
|
# @param [Boolean] include_ld_flags
|
377
387
|
# Indicates whether or not to generate ld flags in addition to compile flags
|
378
388
|
#
|
389
|
+
# @param [Boolean] test_xcconfig
|
390
|
+
# Indicates whether or not the generated ld flags are for a test xcconfig or not
|
391
|
+
#
|
379
392
|
# @note
|
380
393
|
# In case of generated pod targets, which require frameworks, the
|
381
394
|
# vendored frameworks and libraries are already linked statically
|
382
395
|
# into the framework binary and must not be linked again to the
|
383
396
|
# user target.
|
384
397
|
#
|
385
|
-
def self.generate_vendored_build_settings(target, dep_targets, xcconfig, include_ld_flags = true)
|
398
|
+
def self.generate_vendored_build_settings(target, dep_targets, xcconfig, include_ld_flags = true, test_xcconfig = false)
|
386
399
|
dep_targets.each do |dep_target|
|
387
400
|
unless dep_target.should_build? && dep_target.requires_frameworks? && !dep_target.static_framework?
|
388
|
-
XCConfigHelper.add_settings_for_file_accessors_of_target(target, dep_target, xcconfig, include_ld_flags)
|
401
|
+
XCConfigHelper.add_settings_for_file_accessors_of_target(target, dep_target, xcconfig, include_ld_flags, test_xcconfig)
|
389
402
|
end
|
390
403
|
end
|
391
404
|
end
|
data/lib/cocoapods/installer.rb
CHANGED
@@ -530,12 +530,11 @@ module Pod
|
|
530
530
|
#
|
531
531
|
def warn_for_installed_script_phases
|
532
532
|
pods_to_install = sandbox_state.added | sandbox_state.changed
|
533
|
-
pod_targets.each do |
|
534
|
-
|
535
|
-
|
536
|
-
script_phase_count = pod_target.script_phases.count
|
533
|
+
pod_targets.group_by(&:pod_name).each do |name, pod_targets|
|
534
|
+
if pods_to_install.include?(name)
|
535
|
+
script_phase_count = pod_targets.inject(0) { |sum, target| sum + target.script_phases.count }
|
537
536
|
unless script_phase_count.zero?
|
538
|
-
UI.warn "#{
|
537
|
+
UI.warn "#{name} has added #{script_phase_count} #{'script phase'.pluralize(script_phase_count)}. " \
|
539
538
|
'Please inspect before executing a build. See `https://guides.cocoapods.org/syntax/podspec.html#script_phases` for more information.'
|
540
539
|
end
|
541
540
|
end
|
@@ -190,6 +190,23 @@ module Pod
|
|
190
190
|
end
|
191
191
|
end
|
192
192
|
end
|
193
|
+
|
194
|
+
# Returns an extension in the target that corresponds to the
|
195
|
+
# resource's input extension.
|
196
|
+
#
|
197
|
+
# @return [String] The output extension.
|
198
|
+
#
|
199
|
+
def output_extension_for_resource(input_extension)
|
200
|
+
case input_extension
|
201
|
+
when '.storyboard' then '.storyboardc'
|
202
|
+
when '.xib' then '.nib'
|
203
|
+
when '.framework' then '.framework'
|
204
|
+
when '.xcdatamodel' then '.mom'
|
205
|
+
when '.xcdatamodeld' then '.momd'
|
206
|
+
when '.xcmappingmodel' then '.cdm'
|
207
|
+
else input_extension
|
208
|
+
end
|
209
|
+
end
|
193
210
|
end
|
194
211
|
|
195
212
|
# Integrates the user project targets. Only the targets that do **not**
|
@@ -263,8 +280,14 @@ module Pod
|
|
263
280
|
input_paths = []
|
264
281
|
output_paths = []
|
265
282
|
unless resource_paths_by_config.values.all?(&:empty?)
|
266
|
-
|
267
|
-
|
283
|
+
resource_paths_flattened = resource_paths_by_config.values.flatten.uniq
|
284
|
+
input_paths = [target.copy_resources_script_relative_path, *resource_paths_flattened]
|
285
|
+
# convert input paths to output paths according to extensions
|
286
|
+
output_paths = resource_paths_flattened.map do |input_path|
|
287
|
+
base_path = '${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}'
|
288
|
+
output_extension = TargetIntegrator.output_extension_for_resource(File.extname(input_path))
|
289
|
+
File.join(base_path, File.basename(input_path, File.extname(input_path)) + output_extension)
|
290
|
+
end.uniq
|
268
291
|
end
|
269
292
|
TargetIntegrator.add_copy_resources_script_phase_to_target(native_target, script_path, input_paths, output_paths)
|
270
293
|
end
|
@@ -297,7 +320,7 @@ module Pod
|
|
297
320
|
output_paths = []
|
298
321
|
unless framework_paths_by_config.all?(&:empty?)
|
299
322
|
input_paths = [target.embed_frameworks_script_relative_path, *framework_paths_by_config.map { |fw| [fw[:input_path], fw[:dsym_input_path]] }.flatten.compact]
|
300
|
-
output_paths = framework_paths_by_config.map { |fw| [fw[:output_path], fw[:dsym_output_path]] }.flatten.compact
|
323
|
+
output_paths = framework_paths_by_config.map { |fw| [fw[:output_path], fw[:dsym_output_path]] }.flatten.compact.uniq
|
301
324
|
end
|
302
325
|
TargetIntegrator.add_embed_frameworks_script_phase_to_target(native_target, script_path, input_paths, output_paths)
|
303
326
|
end
|
@@ -192,13 +192,14 @@ module Pod
|
|
192
192
|
|
193
193
|
def add_system_framework_dependencies
|
194
194
|
# @TODO: Add Specs
|
195
|
-
pod_targets.sort_by(&:name).each do |pod_target|
|
196
|
-
pod_target.file_accessors.
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
195
|
+
pod_targets.select(&:should_build?).sort_by(&:name).each do |pod_target|
|
196
|
+
test_file_accessors, file_accessors = pod_target.file_accessors.partition { |fa| fa.spec.test_specification? }
|
197
|
+
file_accessors.each do |file_accessor|
|
198
|
+
add_system_frameworks_to_native_target(file_accessor, pod_target.native_target)
|
199
|
+
end
|
200
|
+
test_file_accessors.each do |test_file_accessor|
|
201
|
+
native_target = pod_target.native_target_for_spec(test_file_accessor.spec)
|
202
|
+
add_system_frameworks_to_native_target(test_file_accessor, native_target)
|
202
203
|
end
|
203
204
|
end
|
204
205
|
end
|
@@ -315,6 +316,12 @@ module Pod
|
|
315
316
|
end
|
316
317
|
end
|
317
318
|
|
319
|
+
def add_system_frameworks_to_native_target(file_accessor, native_target)
|
320
|
+
file_accessor.spec_consumer.frameworks.each do |framework|
|
321
|
+
native_target.add_system_framework(framework)
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
318
325
|
def add_resource_bundles_to_native_target(dependent_target, native_target)
|
319
326
|
resource_bundle_targets = dependent_target.resource_bundle_targets + dependent_target.test_resource_bundle_targets
|
320
327
|
resource_bundle_targets.each do |resource_bundle_target|
|
@@ -40,6 +40,7 @@ module Pod
|
|
40
40
|
add_frameworks_bundles
|
41
41
|
add_vendored_libraries
|
42
42
|
add_resources
|
43
|
+
add_developer_files unless sandbox.development_pods.empty?
|
43
44
|
link_headers
|
44
45
|
end
|
45
46
|
|
@@ -109,6 +110,24 @@ module Pod
|
|
109
110
|
end
|
110
111
|
end
|
111
112
|
|
113
|
+
def add_developer_files
|
114
|
+
UI.message '- Adding development pod helper files to Pods project' do
|
115
|
+
file_accessors.each do |file_accessor|
|
116
|
+
pod_name = file_accessor.spec.name
|
117
|
+
next unless sandbox.local?(pod_name)
|
118
|
+
root_name = Specification.root_name(pod_name)
|
119
|
+
paths = file_accessor.developer_files
|
120
|
+
paths.each do |path|
|
121
|
+
group = pods_project.group_for_spec(root_name, :developer)
|
122
|
+
ref = pods_project.add_file_reference(path, group, false)
|
123
|
+
if path.extname == '.podspec'
|
124
|
+
pods_project.mark_ruby_file_ref(ref)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
112
131
|
# Creates the link to the headers of the Pod in the sandbox.
|
113
132
|
#
|
114
133
|
# @return [void]
|
@@ -184,7 +203,7 @@ module Pod
|
|
184
203
|
paths = allowable_project_paths(paths)
|
185
204
|
base_path = local ? common_path(paths) : nil
|
186
205
|
paths.each do |path|
|
187
|
-
group = pods_project.group_for_spec(
|
206
|
+
group = pods_project.group_for_spec(pod_name, group_key)
|
188
207
|
pods_project.add_file_reference(path, group, local && reflect_file_system_structure_for_development, base_path)
|
189
208
|
end
|
190
209
|
end
|
@@ -242,7 +242,7 @@ module Pod
|
|
242
242
|
product_type = target.product_type_for_test_type(test_type)
|
243
243
|
name = target.test_target_label(test_type)
|
244
244
|
platform_name = target.platform.name
|
245
|
-
language = target.uses_swift? ? :swift : :objc
|
245
|
+
language = target.all_test_dependent_targets.any?(&:uses_swift?) ? :swift : :objc
|
246
246
|
native_test_target = project.new_target(product_type, name, platform_name, deployment_target, nil, language)
|
247
247
|
native_test_target.product_reference.name = name
|
248
248
|
|
@@ -402,7 +402,9 @@ module Pod
|
|
402
402
|
def create_test_target_copy_resources_script(test_type)
|
403
403
|
path = target.copy_resources_script_path_for_test_type(test_type)
|
404
404
|
pod_targets = target.all_test_dependent_targets
|
405
|
-
resource_paths_by_config = {
|
405
|
+
resource_paths_by_config = target.user_build_configurations.keys.each_with_object({}) do |config, resources_by_config|
|
406
|
+
resources_by_config[config] = pod_targets.flat_map(&:resource_paths)
|
407
|
+
end
|
406
408
|
generator = Generator::CopyResourcesScript.new(resource_paths_by_config, target.platform)
|
407
409
|
update_changed_file(generator, path)
|
408
410
|
add_file_to_support_group(path)
|
@@ -418,7 +420,9 @@ module Pod
|
|
418
420
|
def create_test_target_embed_frameworks_script(test_type)
|
419
421
|
path = target.embed_frameworks_script_path_for_test_type(test_type)
|
420
422
|
pod_targets = target.all_test_dependent_targets
|
421
|
-
framework_paths_by_config = {
|
423
|
+
framework_paths_by_config = target.user_build_configurations.keys.each_with_object({}) do |config, paths_by_config|
|
424
|
+
paths_by_config[config] = pod_targets.flat_map(&:framework_paths)
|
425
|
+
end
|
422
426
|
generator = Generator::EmbedFrameworksScript.new(framework_paths_by_config)
|
423
427
|
update_changed_file(generator, path)
|
424
428
|
add_file_to_support_group(path)
|
@@ -431,7 +435,7 @@ module Pod
|
|
431
435
|
#
|
432
436
|
def test_target_swift_debug_hack(test_target_bc)
|
433
437
|
return unless test_target_bc.debug?
|
434
|
-
return unless
|
438
|
+
return unless target.all_test_dependent_targets.any?(&:uses_swift?)
|
435
439
|
ldflags = test_target_bc.build_settings['OTHER_LDFLAGS'] ||= '$(inherited)'
|
436
440
|
ldflags << ' -lswiftSwiftOnoneSupport'
|
437
441
|
end
|
@@ -456,7 +460,7 @@ module Pod
|
|
456
460
|
eos
|
457
461
|
end
|
458
462
|
|
459
|
-
# Creates a build phase to put the static framework
|
463
|
+
# Creates a build phase to put the static framework in the appropriate framework location
|
460
464
|
# Since Xcode does not provide template support for static library frameworks, we've built a static library
|
461
465
|
# of the form lib{LibraryName}.a. We need to move that to the framework location -
|
462
466
|
# {LibraryName}.framework/{LibraryName}.
|
@@ -464,13 +468,17 @@ module Pod
|
|
464
468
|
# @return [void]
|
465
469
|
#
|
466
470
|
def create_build_phase_to_move_static_framework_archive
|
467
|
-
build_phase = native_target.new_shell_script_build_phase('Setup Static Framework
|
471
|
+
build_phase = native_target.new_shell_script_build_phase('Setup Static Framework')
|
468
472
|
build_phase.shell_script = <<-eos.strip_heredoc
|
469
473
|
mkdir -p "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Modules"
|
470
|
-
|
471
|
-
|
474
|
+
# The fat library archive is at a file symbolic link when archiving, so use -L option
|
475
|
+
rsync -tL "${BUILT_PRODUCTS_DIR}/lib${PRODUCT_NAME}.a" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/${PRODUCT_NAME}"
|
476
|
+
rsync -t "${MODULEMAP_FILE}" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Modules/module.modulemap"
|
472
477
|
# If there's a .swiftmodule, copy it into the framework's Modules folder
|
473
|
-
|
478
|
+
rsync -tr "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}".swiftmodule "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Modules/" 2>/dev/null || :
|
479
|
+
# If archiving, Headers copy is needed
|
480
|
+
rsync -tr "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.framework/Headers" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/" 2>/dev/null || :
|
481
|
+
rsync -tr "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.framework/PrivateHeaders" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/" 2>/dev/null || :
|
474
482
|
eos
|
475
483
|
end
|
476
484
|
|
@@ -628,7 +636,9 @@ module Pod
|
|
628
636
|
|
629
637
|
def add_header(build_file, public_headers, private_headers, native_target)
|
630
638
|
file_ref = build_file.file_ref
|
631
|
-
acl = if
|
639
|
+
acl = if !target.requires_frameworks? # Headers are already rooted at ${PODS_ROOT}/Headers/P*/[pod]/...
|
640
|
+
'Project'
|
641
|
+
elsif public_headers.include?(file_ref.real_path)
|
632
642
|
'Public'
|
633
643
|
elsif private_headers.include?(file_ref.real_path)
|
634
644
|
'Private'
|
@@ -56,8 +56,13 @@ module Pod
|
|
56
56
|
input_paths = []
|
57
57
|
output_paths = []
|
58
58
|
unless resource_paths.empty?
|
59
|
-
|
60
|
-
|
59
|
+
resource_paths_flattened = resource_paths.flatten.uniq
|
60
|
+
input_paths = [script_path, *resource_paths_flattened]
|
61
|
+
output_paths = resource_paths_flattened.map do |input_path|
|
62
|
+
base_path = '${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}'
|
63
|
+
output_extension = UserProjectIntegrator::TargetIntegrator.output_extension_for_resource(File.extname(input_path))
|
64
|
+
File.join(base_path, File.basename(input_path, File.extname(input_path)) + output_extension)
|
65
|
+
end
|
61
66
|
end
|
62
67
|
UserProjectIntegrator::TargetIntegrator.add_copy_resources_script_phase_to_target(native_target, script_path, input_paths, output_paths)
|
63
68
|
end
|
@@ -91,6 +91,7 @@ module Pod
|
|
91
91
|
end
|
92
92
|
swift_pod_targets = pod_targets.select(&:uses_swift?)
|
93
93
|
error_messages = swift_pod_targets.map do |pod_target|
|
94
|
+
next unless pod_target.spec_swift_version.nil?
|
94
95
|
swift_target_definitions = pod_target.target_definitions.reject { |target| target.swift_version.blank? }
|
95
96
|
next if swift_target_definitions.empty? || swift_target_definitions.uniq(&:swift_version).count == 1
|
96
97
|
target_errors = swift_target_definitions.map(&error_message_for_target).join(', ')
|
data/lib/cocoapods/project.rb
CHANGED
@@ -113,6 +113,7 @@ module Pod
|
|
113
113
|
SPEC_SUBGROUPS = {
|
114
114
|
:resources => 'Resources',
|
115
115
|
:frameworks => 'Frameworks',
|
116
|
+
:developer => 'Pod',
|
116
117
|
}
|
117
118
|
|
118
119
|
# Returns the group for the specification with the give name creating it if
|
@@ -220,12 +221,22 @@ module Pod
|
|
220
221
|
#
|
221
222
|
def add_podfile(podfile_path)
|
222
223
|
new_file(podfile_path, :project).tap do |podfile_ref|
|
223
|
-
podfile_ref
|
224
|
-
podfile_ref.explicit_file_type = 'text.script.ruby'
|
225
|
-
podfile_ref.last_known_file_type = 'text'
|
224
|
+
mark_ruby_file_ref(podfile_ref)
|
226
225
|
end
|
227
226
|
end
|
228
227
|
|
228
|
+
# Sets the syntax of the provided file reference to be Ruby, in the case that
|
229
|
+
# the file does not already have a ".rb" file extension (ex. the Podfile)
|
230
|
+
#
|
231
|
+
# @param [PBXFileReference] file_ref
|
232
|
+
# The file reference to change
|
233
|
+
#
|
234
|
+
def mark_ruby_file_ref(file_ref)
|
235
|
+
file_ref.xc_language_specification_identifier = 'xcode.lang.ruby'
|
236
|
+
file_ref.explicit_file_type = 'text.script.ruby'
|
237
|
+
file_ref.last_known_file_type = 'text'
|
238
|
+
end
|
239
|
+
|
229
240
|
# Adds a new build configuration to the project and populates it with
|
230
241
|
# default settings according to the provided type.
|
231
242
|
#
|
data/lib/cocoapods/sandbox.rb
CHANGED
@@ -152,7 +152,7 @@ module Pod
|
|
152
152
|
def pod_dir(name)
|
153
153
|
root_name = Specification.root_name(name)
|
154
154
|
if local?(root_name)
|
155
|
-
Pathname.new(development_pods[root_name])
|
155
|
+
Pathname.new(development_pods[root_name].dirname)
|
156
156
|
else
|
157
157
|
sources_root + root_name
|
158
158
|
end
|
@@ -211,7 +211,7 @@ module Pod
|
|
211
211
|
def specification(name)
|
212
212
|
if file = specification_path(name)
|
213
213
|
original_path = development_pods[name]
|
214
|
-
|
214
|
+
Specification.from_file(original_path || file)
|
215
215
|
end
|
216
216
|
end
|
217
217
|
|
@@ -239,8 +239,8 @@ module Pod
|
|
239
239
|
|
240
240
|
# Stores a specification in the `Local Podspecs` folder.
|
241
241
|
#
|
242
|
-
# @param [
|
243
|
-
# the
|
242
|
+
# @param [String] name
|
243
|
+
# the name of the pod
|
244
244
|
#
|
245
245
|
# @param [String, Pathname] podspec
|
246
246
|
# The contents of the specification (String) or the path to a
|
@@ -248,8 +248,6 @@ module Pod
|
|
248
248
|
#
|
249
249
|
# @return [void]
|
250
250
|
#
|
251
|
-
# @todo Store all the specifications (including those not originating
|
252
|
-
# from external sources) so users can check them.
|
253
251
|
#
|
254
252
|
def store_podspec(name, podspec, _external_source = false, json = false)
|
255
253
|
file_name = json ? "#{name}.podspec.json" : "#{name}.podspec"
|
@@ -351,8 +349,8 @@ module Pod
|
|
351
349
|
# @param [String] name
|
352
350
|
# The name of the Pod.
|
353
351
|
#
|
354
|
-
# @param [
|
355
|
-
# The
|
352
|
+
# @param [Pathname, String] path
|
353
|
+
# The path to the local Podspec
|
356
354
|
#
|
357
355
|
# @param [Bool] was_absolute
|
358
356
|
# True if the specified local path was absolute.
|
@@ -361,11 +359,12 @@ module Pod
|
|
361
359
|
#
|
362
360
|
def store_local_path(name, path, was_absolute = false)
|
363
361
|
root_name = Specification.root_name(name)
|
364
|
-
|
362
|
+
path = Pathname.new(path) unless path.is_a?(Pathname)
|
363
|
+
development_pods[root_name] = path
|
365
364
|
@pods_with_absolute_path << root_name if was_absolute
|
366
365
|
end
|
367
366
|
|
368
|
-
# @return [Hash{String=>
|
367
|
+
# @return [Hash{String=>Pathname}] The path of the Pods' podspecs with a local source
|
369
368
|
# grouped by their root name.
|
370
369
|
#
|
371
370
|
# @todo Rename (e.g. `pods_with_local_path`)
|
@@ -380,8 +379,19 @@ module Pod
|
|
380
379
|
# @return [Bool] Whether the Pod is locally sourced.
|
381
380
|
#
|
382
381
|
def local?(name)
|
382
|
+
!local_podspec(name).nil?
|
383
|
+
end
|
384
|
+
|
385
|
+
# @param [String] name
|
386
|
+
# The name of a locally specified Pod
|
387
|
+
#
|
388
|
+
# @return [Pathname] Path to the local Podspec of the Pod
|
389
|
+
#
|
390
|
+
def local_podspec(name)
|
383
391
|
root_name = Specification.root_name(name)
|
384
|
-
|
392
|
+
if path = development_pods[root_name]
|
393
|
+
Pathname.new(path)
|
394
|
+
end
|
385
395
|
end
|
386
396
|
|
387
397
|
#-------------------------------------------------------------------------#
|
@@ -17,6 +17,8 @@ module Pod
|
|
17
17
|
:license => 'licen{c,s}e{*,.*}'.freeze,
|
18
18
|
:source_files => "*{#{SOURCE_FILE_EXTENSIONS.join(',')}}".freeze,
|
19
19
|
:public_header_files => "*{#{HEADER_EXTENSIONS.join(',')}}".freeze,
|
20
|
+
:podspecs => '*.{podspec,podspec.json}'.freeze,
|
21
|
+
:docs => 'doc{s}{*,.*}/**/*'.freeze,
|
20
22
|
}.freeze
|
21
23
|
|
22
24
|
# @return [Sandbox::PathList] the directory where the source of the Pod
|
@@ -291,6 +293,34 @@ module Pod
|
|
291
293
|
end
|
292
294
|
end
|
293
295
|
|
296
|
+
# @return [Array<Pathname>] The paths of auto-detected podspecs
|
297
|
+
#
|
298
|
+
def specs
|
299
|
+
path_list.glob([GLOB_PATTERNS[:podspecs]])
|
300
|
+
end
|
301
|
+
|
302
|
+
# @return [Array<Pathname>] The paths of auto-detected docs
|
303
|
+
#
|
304
|
+
def docs
|
305
|
+
path_list.glob([GLOB_PATTERNS[:docs]])
|
306
|
+
end
|
307
|
+
|
308
|
+
# @return [Array<Pathname>] Paths to include for local pods to assist in development
|
309
|
+
#
|
310
|
+
def developer_files
|
311
|
+
podspecs = specs
|
312
|
+
result = [module_map, prefix_header]
|
313
|
+
if podspecs.size <= 1
|
314
|
+
result += [license, readme, podspecs, docs]
|
315
|
+
else
|
316
|
+
result << podspec_file
|
317
|
+
if file = spec_consumer.license[:file]
|
318
|
+
result << root + file
|
319
|
+
end
|
320
|
+
end
|
321
|
+
result.compact.flatten.sort
|
322
|
+
end
|
323
|
+
|
294
324
|
#-----------------------------------------------------------------------#
|
295
325
|
|
296
326
|
private
|
@@ -311,6 +341,12 @@ module Pod
|
|
311
341
|
paths_for_attribute(:private_header_files)
|
312
342
|
end
|
313
343
|
|
344
|
+
# @return [Pathname] The path of the podspec matching @spec
|
345
|
+
#
|
346
|
+
def podspec_file
|
347
|
+
specs.lazy.select { |p| File.basename(p.to_s, '.*') == spec.name }.first
|
348
|
+
end
|
349
|
+
|
314
350
|
#-----------------------------------------------------------------------#
|
315
351
|
|
316
352
|
private
|
@@ -104,7 +104,9 @@ module Pod
|
|
104
104
|
|
105
105
|
def update_git_repo(show_output = false)
|
106
106
|
Config.instance.with_changes(:verbose => show_output) do
|
107
|
-
|
107
|
+
args = %W(-C #{repo} fetch origin)
|
108
|
+
args.push('--progress') if show_output
|
109
|
+
git!(args)
|
108
110
|
current_branch = git!(%W(-C #{repo} rev-parse --abbrev-ref HEAD)).strip
|
109
111
|
git!(%W(-C #{repo} reset --hard origin/#{current_branch}))
|
110
112
|
end
|
@@ -95,10 +95,18 @@ module Pod
|
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
-
# @return [String] the Swift version for the target.
|
98
|
+
# @return [String] the Swift version for the target. If the pod author has provided a swift version
|
99
|
+
# then that is the one returned, otherwise the Swift version is determined by the user
|
100
|
+
# targets that include this pod target.
|
99
101
|
#
|
100
102
|
def swift_version
|
101
|
-
target_definitions.map(&:swift_version).compact.uniq.first
|
103
|
+
spec_swift_version || target_definitions.map(&:swift_version).compact.uniq.first
|
104
|
+
end
|
105
|
+
|
106
|
+
# @return [String] the Swift version within the root spec. Might be `nil` if none is set.
|
107
|
+
#
|
108
|
+
def spec_swift_version
|
109
|
+
root_spec.swift_version
|
102
110
|
end
|
103
111
|
|
104
112
|
# @note The deployment target for the pod target is the maximum of all
|
data/lib/cocoapods/validator.rb
CHANGED
@@ -257,8 +257,8 @@ module Pod
|
|
257
257
|
#
|
258
258
|
def swift_version
|
259
259
|
return @swift_version unless @swift_version.nil?
|
260
|
-
if version = dot_swift_version
|
261
|
-
@swift_version = version
|
260
|
+
if (version = spec.swift_version) || (version = dot_swift_version)
|
261
|
+
@swift_version = version.to_s
|
262
262
|
else
|
263
263
|
DEFAULT_SWIFT_VERSION
|
264
264
|
end
|
@@ -307,6 +307,7 @@ module Pod
|
|
307
307
|
validate_screenshots(spec)
|
308
308
|
validate_social_media_url(spec)
|
309
309
|
validate_documentation_url(spec)
|
310
|
+
validate_source_url(spec)
|
310
311
|
|
311
312
|
valid = spec.available_platforms.send(fail_fast ? :all? : :each) do |platform|
|
312
313
|
UI.message "\n\n#{spec} - Analyzing on #{platform} platform.".green.reversed
|
@@ -393,21 +394,50 @@ module Pod
|
|
393
394
|
validate_url(spec.documentation_url) if spec.documentation_url
|
394
395
|
end
|
395
396
|
|
397
|
+
# Performs validations related to the `source` -> `http` attribute (if exists)
|
398
|
+
#
|
399
|
+
def validate_source_url(spec)
|
400
|
+
return if spec.source.nil? || spec.source[:http].nil?
|
401
|
+
url = spec.source[:http]
|
402
|
+
return if url.downcase.start_with?('https://')
|
403
|
+
warning('http', "The URL (`#{url}`) doesn't use the encrypted HTTPs protocol. " \
|
404
|
+
'It is crucial for Pods to be transferred over a secure protocol to protect your users from man-in-the-middle attacks. '\
|
405
|
+
'This will be an error in future releases. Please update the URL to use https.')
|
406
|
+
end
|
407
|
+
|
396
408
|
# Performs validation for which version of Swift is used during validation.
|
397
409
|
#
|
410
|
+
# An error will be displayed if the user has provided a `swift_version` attribute within the podspec but is also
|
411
|
+
# using either `--swift-version` parameter or a `.swift-version with a different Swift version.
|
412
|
+
#
|
398
413
|
# The user will be warned that the default version of Swift was used if the following things are true:
|
399
414
|
# - The project uses Swift at all
|
400
415
|
# - The user did not supply a Swift version via a parameter
|
416
|
+
# - There is no `swift_version` attribute set within the specification
|
401
417
|
# - There is no `.swift-version` file present either.
|
402
418
|
#
|
403
419
|
def validate_swift_version
|
404
|
-
|
405
|
-
|
420
|
+
return unless uses_swift?
|
421
|
+
spec_swift_version = spec.swift_version
|
422
|
+
unless spec_swift_version.nil?
|
423
|
+
message = nil
|
424
|
+
if !dot_swift_version.nil? && dot_swift_version != spec_swift_version.to_s
|
425
|
+
message = "Specification `#{spec.name}` specifies an inconsistent `swift_version` (`#{spec_swift_version}`) compared to the one present in your `.swift-version` file (`#{dot_swift_version}`). " \
|
426
|
+
'Please remove the `.swift-version` file which is now deprecated and only use the `swift_version` attribute within your podspec.'
|
427
|
+
elsif !@swift_version.nil? && @swift_version != spec_swift_version.to_s
|
428
|
+
message = "Specification `#{spec.name}` specifies an inconsistent `swift_version` (`#{spec_swift_version}`) compared to the one passed during lint (`#{@swift_version}`)."
|
429
|
+
end
|
430
|
+
unless message.nil?
|
431
|
+
error('swift', message)
|
432
|
+
return
|
433
|
+
end
|
434
|
+
end
|
435
|
+
if @swift_version.nil? && spec_swift_version.nil? && dot_swift_version.nil?
|
436
|
+
warning('swift',
|
406
437
|
'The validator used ' \
|
407
438
|
"Swift #{DEFAULT_SWIFT_VERSION} by default because no Swift version was specified. " \
|
408
|
-
'
|
409
|
-
'
|
410
|
-
'your Pod. For example to use Swift 4.0, run: `echo "4.0" > .swift-version`.')
|
439
|
+
'To specify a Swift version during validation, add the `swift_version` attribute in your podspec. ' \
|
440
|
+
'Note that usage of the `--swift-version` parameter or a `.swift-version` file is now deprecated.')
|
411
441
|
end
|
412
442
|
end
|
413
443
|
|
@@ -471,12 +501,24 @@ module Pod
|
|
471
501
|
perform_post_install_actions).each { |m| @installer.send(m) }
|
472
502
|
|
473
503
|
deployment_target = spec.subspec_by_name(subspec_name).deployment_target(consumer.platform_name)
|
474
|
-
@installer.aggregate_targets
|
504
|
+
configure_pod_targets(@installer.aggregate_targets, deployment_target)
|
505
|
+
@installer.pods_project.save
|
506
|
+
end
|
507
|
+
|
508
|
+
def configure_pod_targets(targets, deployment_target)
|
509
|
+
targets.each do |target|
|
475
510
|
target.pod_targets.each do |pod_target|
|
476
511
|
next unless (native_target = pod_target.native_target)
|
477
512
|
native_target.build_configuration_list.build_configurations.each do |build_configuration|
|
478
513
|
(build_configuration.build_settings['OTHER_CFLAGS'] ||= '$(inherited)') << ' -Wincomplete-umbrella'
|
479
|
-
build_configuration.build_settings['SWIFT_VERSION'] = swift_version if pod_target.uses_swift?
|
514
|
+
build_configuration.build_settings['SWIFT_VERSION'] = (pod_target.swift_version || swift_version) if pod_target.uses_swift?
|
515
|
+
end
|
516
|
+
if pod_target.uses_swift?
|
517
|
+
pod_target.test_native_targets.each do |test_native_target|
|
518
|
+
test_native_target.build_configuration_list.build_configurations.each do |build_configuration|
|
519
|
+
build_configuration.build_settings['SWIFT_VERSION'] = swift_version
|
520
|
+
end
|
521
|
+
end
|
480
522
|
end
|
481
523
|
end
|
482
524
|
if target.pod_targets.any?(&:uses_swift?) && consumer.platform_name == :ios &&
|
@@ -485,7 +527,6 @@ module Pod
|
|
485
527
|
error('swift', 'Swift support uses dynamic frameworks and is therefore only supported on iOS > 8.') unless uses_xctest
|
486
528
|
end
|
487
529
|
end
|
488
|
-
@installer.pods_project.save
|
489
530
|
end
|
490
531
|
|
491
532
|
def validate_vendored_dynamic_frameworks
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocoapods
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.0.
|
4
|
+
version: 1.4.0.rc.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eloy Duran
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2017-
|
14
|
+
date: 2017-12-16 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: cocoapods-core
|
@@ -19,14 +19,14 @@ dependencies:
|
|
19
19
|
requirements:
|
20
20
|
- - '='
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 1.4.0.
|
22
|
+
version: 1.4.0.rc.1
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - '='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 1.4.0.
|
29
|
+
version: 1.4.0.rc.1
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: claide
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -193,21 +193,21 @@ dependencies:
|
|
193
193
|
requirements:
|
194
194
|
- - "~>"
|
195
195
|
- !ruby/object:Gem::Version
|
196
|
-
version: 0.6.
|
196
|
+
version: 0.6.4
|
197
197
|
type: :runtime
|
198
198
|
prerelease: false
|
199
199
|
version_requirements: !ruby/object:Gem::Requirement
|
200
200
|
requirements:
|
201
201
|
- - "~>"
|
202
202
|
- !ruby/object:Gem::Version
|
203
|
-
version: 0.6.
|
203
|
+
version: 0.6.4
|
204
204
|
- !ruby/object:Gem::Dependency
|
205
205
|
name: xcodeproj
|
206
206
|
requirement: !ruby/object:Gem::Requirement
|
207
207
|
requirements:
|
208
208
|
- - ">="
|
209
209
|
- !ruby/object:Gem::Version
|
210
|
-
version: 1.5.
|
210
|
+
version: 1.5.4
|
211
211
|
- - "<"
|
212
212
|
- !ruby/object:Gem::Version
|
213
213
|
version: '2.0'
|
@@ -217,7 +217,7 @@ dependencies:
|
|
217
217
|
requirements:
|
218
218
|
- - ">="
|
219
219
|
- !ruby/object:Gem::Version
|
220
|
-
version: 1.5.
|
220
|
+
version: 1.5.4
|
221
221
|
- - "<"
|
222
222
|
- !ruby/object:Gem::Version
|
223
223
|
version: '2.0'
|