Commit 5121dff5 authored by Tomas Linhart's avatar Tomas Linhart Committed by Samuel E. Giddins

Add modules support for static libraries

parent c5657e4f
...@@ -64,6 +64,9 @@ To install release candidates run `[sudo] gem install cocoapods --pre` ...@@ -64,6 +64,9 @@ To install release candidates run `[sudo] gem install cocoapods --pre`
##### Enhancements ##### Enhancements
* Add modules support for static libraries.
[Tomas Linhart](https://github.com/TomasLinhart)
* The resolver will now take supported platform deployment targets into account * The resolver will now take supported platform deployment targets into account
when resolving dependencies. when resolving dependencies.
[Samuel Giddins](https://github.com/segiddins) [Samuel Giddins](https://github.com/segiddins)
......
...@@ -42,8 +42,9 @@ module Pod ...@@ -42,8 +42,9 @@ module Pod
# @return [String] # @return [String]
# #
def generate def generate
module_declaration_qualifier = target.requires_frameworks? ? "framework " : ""
result = <<-eos.strip_heredoc result = <<-eos.strip_heredoc
framework module #{target.product_module_name} { #{module_declaration_qualifier}module #{target.product_module_name} {
umbrella header "#{target.umbrella_header_path.basename}" umbrella header "#{target.umbrella_header_path.basename}"
export * export *
......
...@@ -22,13 +22,15 @@ module Pod ...@@ -22,13 +22,15 @@ module Pod
create_xcconfig_file create_xcconfig_file
if target.requires_frameworks? if target.requires_frameworks?
create_info_plist_file create_info_plist_file
end
create_module_map do |generator| create_module_map do |generator|
generator.private_headers += target.file_accessors.flat_map(&:private_headers).map(&:basename) generator.private_headers += target.file_accessors.flat_map(&:private_headers).map(&:basename)
end end
create_umbrella_header do |generator| create_umbrella_header do |generator|
generator.imports += target.file_accessors.flat_map(&:public_headers).map(&:basename) generator.imports += target.file_accessors.flat_map(&:public_headers).map(&:basename)
end end
end link_module_map
link_umbrella_header
create_prefix_header create_prefix_header
create_dummy_source create_dummy_source
end end
...@@ -183,6 +185,26 @@ module Pod ...@@ -183,6 +185,26 @@ module Pod
end end
end end
# Links a module map to Public headers.
#
# @return [void]
#
def link_module_map
module_map_path_name = Pathname.new(target.module_map_path)
sandbox.public_headers.add_file(target.name, module_map_path_name, "module.modulemap", target.platform)
end
# Links a an umbrella header to Public headers.
#
# @return [void]
#
def link_umbrella_header
return if custom_module_map
umbrella_header_path_name = Pathname.new(target.umbrella_header_path)
sandbox.public_headers.add_files(target.name, [umbrella_header_path_name], target.platform)
end
# Creates a prefix header file which imports `UIKit` or `Cocoa` according # Creates a prefix header file which imports `UIKit` or `Cocoa` according
# to the platform of the target. This file also include any prefix header # to the platform of the target. This file also include any prefix header
# content reported by the specification of the pods. # content reported by the specification of the pods.
...@@ -280,6 +302,14 @@ module Pod ...@@ -280,6 +302,14 @@ module Pod
FileUtils.cp(custom_module_map, path) FileUtils.cp(custom_module_map, path)
add_file_to_support_group(path) add_file_to_support_group(path)
unless target.requires_frameworks?
File.open(path) do |source_file|
contents = source_file.read
contents.gsub!(/^\s*framework\s+module/, 'module')
File.open(path, "w") { |f| f.write(contents) }
end
end
native_target.build_configurations.each do |c| native_target.build_configurations.each do |c|
relative_path = path.relative_path_from(sandbox.root) relative_path = path.relative_path_from(sandbox.root)
c.build_settings['MODULEMAP_FILE'] = relative_path.to_s c.build_settings['MODULEMAP_FILE'] = relative_path.to_s
......
...@@ -71,19 +71,41 @@ module Pod ...@@ -71,19 +71,41 @@ module Pod
# @return [Array<Pathname>] # @return [Array<Pathname>]
# #
def add_files(namespace, relative_header_paths, platform) def add_files(namespace, relative_header_paths, platform)
relative_header_paths.map do |relative_header_path|
add_file(namespace, relative_header_path, relative_header_path.basename, platform)
end
end
# Adds a header to the directory under different name.
#
# @param [Pathname] namespace
# the path where the header file should be stored relative to the
# headers directory.
#
# @param [Pathname] relative_header_path
# the path of the header file relative to the Pods project
# (`PODS_ROOT` variable of the xcconfigs).
#
# @param [String] final_name
# the name under which the file should be available in the
# headers directory.
#
# @note This method adds the file to the search paths.
#
# @return [Pathname]
#
def add_file(namespace, relative_header_path, final_name, platform)
add_search_path(namespace, platform) add_search_path(namespace, platform)
namespaced_path = root + namespace namespaced_path = root + namespace
namespaced_path.mkpath unless File.exist?(namespaced_path) namespaced_path.mkpath unless File.exist?(namespaced_path)
relative_header_paths.map do |relative_header_path|
absolute_source = (sandbox.root + relative_header_path) absolute_source = (sandbox.root + relative_header_path)
source = absolute_source.relative_path_from(namespaced_path) source = absolute_source.relative_path_from(namespaced_path)
Dir.chdir(namespaced_path) do Dir.chdir(namespaced_path) do
FileUtils.ln_sf(source, relative_header_path.basename) FileUtils.ln_sf(source, final_name)
end end
namespaced_path + relative_header_path.basename namespaced_path + relative_header_path.basename
end end
end
# Adds an header search path to the sandbox. # Adds an header search path to the sandbox.
# #
......
...@@ -9,8 +9,9 @@ module Pod ...@@ -9,8 +9,9 @@ module Pod
@gen = Generator::ModuleMap.new(@pod_target) @gen = Generator::ModuleMap.new(@pod_target)
end end
it 'writes the module map to the disk' do it 'writes the framework module map to the disk' do
path = temporary_directory + 'BananaLib.modulemap' path = temporary_directory + 'BananaLib.modulemap'
@pod_target.stubs(:requires_frameworks? => true)
@gen.save_as(path) @gen.save_as(path)
path.read.should == <<-EOS.strip_heredoc path.read.should == <<-EOS.strip_heredoc
framework module BananaLib { framework module BananaLib {
...@@ -22,8 +23,23 @@ module Pod ...@@ -22,8 +23,23 @@ module Pod
EOS EOS
end end
it 'writes the library module map to the disk' do
path = temporary_directory + 'BananaLib.modulemap'
@pod_target.stubs(:requires_frameworks? => false)
@gen.save_as(path)
path.read.should == <<-EOS.strip_heredoc
module BananaLib {
umbrella header "BananaLib-umbrella.h"
export *
module * { export * }
}
EOS
end
it 'correctly adds private headers' do it 'correctly adds private headers' do
@gen.stubs(:private_headers).returns(['Private.h']) @gen.stubs(:private_headers).returns(['Private.h'])
@pod_target.stubs(:requires_frameworks? => true)
@gen.generate.should == <<-EOS.strip_heredoc @gen.generate.should == <<-EOS.strip_heredoc
framework module BananaLib { framework module BananaLib {
umbrella header "BananaLib-umbrella.h" umbrella header "BananaLib-umbrella.h"
......
...@@ -103,6 +103,7 @@ module Pod ...@@ -103,6 +103,7 @@ module Pod
'Pods-BananaLib-Private.xcconfig', 'Pods-BananaLib-Private.xcconfig',
'Pods-BananaLib-dummy.m', 'Pods-BananaLib-dummy.m',
'Pods-BananaLib-prefix.pch', 'Pods-BananaLib-prefix.pch',
'Pods-BananaLib.modulemap',
'Pods-BananaLib.xcconfig', 'Pods-BananaLib.xcconfig',
] ]
end end
...@@ -145,6 +146,7 @@ module Pod ...@@ -145,6 +146,7 @@ module Pod
'BananaLib-Private.xcconfig', 'BananaLib-Private.xcconfig',
'BananaLib-dummy.m', 'BananaLib-dummy.m',
'BananaLib-prefix.pch', 'BananaLib-prefix.pch',
'BananaLib.modulemap',
'BananaLib.xcconfig', 'BananaLib.xcconfig',
] ]
end end
......
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