Commit bf7ffd23 authored by Samuel Giddins's avatar Samuel Giddins

[TargetValidator] Raise when a swift pod depends upon a non-module target

parent e294adf1
...@@ -35,6 +35,7 @@ module Pod ...@@ -35,6 +35,7 @@ module Pod
verify_no_duplicate_framework_and_library_names verify_no_duplicate_framework_and_library_names
verify_no_static_framework_transitive_dependencies verify_no_static_framework_transitive_dependencies
verify_no_pods_used_with_multiple_swift_versions verify_no_pods_used_with_multiple_swift_versions
verify_swift_pods_have_module_dependencies
end end
private private
...@@ -108,6 +109,31 @@ module Pod ...@@ -108,6 +109,31 @@ module Pod
"that do not have the same Swift version:\n\n#{error_messages.join("\n")}" "that do not have the same Swift version:\n\n#{error_messages.join("\n")}"
end end
end end
def verify_swift_pods_have_module_dependencies
error_messages = []
pod_targets.each do |pod_target|
next unless pod_target.uses_swift?
non_module_dependencies = []
pod_target.dependent_targets.each do |dependent_target|
next if !dependent_target.should_build? || dependent_target.defines_module?
non_module_dependencies << dependent_target.name
end
next if non_module_dependencies.empty?
error_messages << "The swift pod `#{pod_target.name}` depends upon #{non_module_dependencies.to_sentence}, " \
'which do not define modules. ' \
'To opt into those targets generating module maps '\
'(which is necessary to import them from swift when building as static libraries), ' \
"you may add `'DEFINES_MODULE' => 'YES'` to those pods' `pod_target_xcconfig`."
end
return if error_messages.empty?
raise Informative, 'The following swift pods cannot yet be integrated '\
"as static libraries:\n\n#{error_messages.join("\n\n")}"
end
end end
end end
end end
......
...@@ -305,8 +305,8 @@ module Pod ...@@ -305,8 +305,8 @@ module Pod
# when the swift version is unset at the project level, but set in one target, swift_version is nil # when the swift version is unset at the project level, but set in one target, swift_version is nil
podfile.target_definitions['TestRunner'].stubs(:swift_version).returns(nil) podfile.target_definitions['TestRunner'].stubs(:swift_version).returns(nil)
orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => nil) orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => nil, :dependent_targets => [])
matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => nil) matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => nil, :dependent_targets => [])
@validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target]) @validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target])
lambda { @validator.validate! }.should.not.raise lambda { @validator.validate! }.should.not.raise
...@@ -352,8 +352,59 @@ module Pod ...@@ -352,8 +352,59 @@ module Pod
podfile.target_definitions['SampleProject'].stubs(:swift_version).returns('3.0') podfile.target_definitions['SampleProject'].stubs(:swift_version).returns('3.0')
podfile.target_definitions['TestRunner'].stubs(:swift_version).returns('2.3') podfile.target_definitions['TestRunner'].stubs(:swift_version).returns('2.3')
orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => '4.0') orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => '4.0', :dependent_targets => [])
matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => '3.2') matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => '3.2', :dependent_targets => [])
@validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target])
lambda { @validator.validate! }.should.not.raise
end
it 'raises when a swift target depends upon a target that does not define a module' do
fixture_path = ROOT + 'spec/fixtures'
config.repos_dir = fixture_path + 'spec-repos'
podfile = Podfile.new do
project 'SampleProject/SampleProject'
platform :ios, '10.0'
pod 'OrangeFramework', :path => (fixture_path + 'orange-framework').to_s
pod 'matryoshka', :path => (fixture_path + 'matryoshka').to_s
target 'SampleProject'
target 'TestRunner'
end
matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => false,
:target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']],
:should_build? => true, :defines_module? => false, :dependent_targets => [])
orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true,
:target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']],
:should_build? => true, :defines_module? => true, :dependent_targets => [matryoshka_pod_target], :spec_swift_version => '4.0')
@validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target])
e = lambda { @validator.validate! }.should.raise Informative
e.message.should.include <<-EOS.strip_heredoc.strip
[!] The following swift pods cannot yet be integrated as static libraries:
The swift pod `OrangeFramework` depends upon matryoshka, which do not define modules. To opt into those targets generating module maps (which is necessary to import them from swift when building as static libraries), you may add `'DEFINES_MODULE' => 'YES'` to those pods' `pod_target_xcconfig`.
EOS
end
it 'does not raise when a swift target depends upon a target thatis not built' do
fixture_path = ROOT + 'spec/fixtures'
config.repos_dir = fixture_path + 'spec-repos'
podfile = Podfile.new do
project 'SampleProject/SampleProject'
platform :ios, '10.0'
pod 'OrangeFramework', :path => (fixture_path + 'orange-framework').to_s
pod 'matryoshka', :path => (fixture_path + 'matryoshka').to_s
target 'SampleProject'
target 'TestRunner'
end
matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => false,
:target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']],
:should_build? => false, :defines_module? => false, :dependent_targets => [])
orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true,
:target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']],
:should_build? => true, :defines_module? => true, :dependent_targets => [matryoshka_pod_target], :spec_swift_version => '4.0')
@validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target]) @validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target])
lambda { @validator.validate! }.should.not.raise lambda { @validator.validate! }.should.not.raise
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment