Commit 0ff5b203 authored by Fabio Pelosin's avatar Fabio Pelosin

[PrivatePodXcconfig] Handle xcconfig conditionals

Closes #1171
parent cf1643ea
...@@ -7,7 +7,7 @@ GIT ...@@ -7,7 +7,7 @@ GIT
GIT GIT
remote: https://github.com/CocoaPods/Core.git remote: https://github.com/CocoaPods/Core.git
revision: 743a53d70e138fff2759405b9dd5b78f6db47ca5 revision: e41d277a60b2ff96ff851750ee99135c2d7ecd13
branch: master branch: master
specs: specs:
cocoapods-core (0.22.1) cocoapods-core (0.22.1)
......
...@@ -10,13 +10,17 @@ module Pod ...@@ -10,13 +10,17 @@ module Pod
# @return [Target] the target represented by this xcconfig. # @return [Target] the target represented by this xcconfig.
# #
attr_reader :target attr_reader :target
attr_reader :sandbox
# @param [Target] target @see target # @param [Target] target @see target
# #
def initialize(target) def initialize(target)
@target = target @target = target
@sandbox = target.sandbox end
# @return [Sandbox] the sandbox of this target.
#
def sandbox
target.sandbox
end end
# @return [Xcodeproj::Config] The generated xcconfig. # @return [Xcodeproj::Config] The generated xcconfig.
......
...@@ -9,6 +9,19 @@ module Pod ...@@ -9,6 +9,19 @@ module Pod
# #
class PrivatePodXCConfig < XCConfig class PrivatePodXCConfig < XCConfig
# @return [Xcodeproj::Config] The public xcconfig which this one will
# use.
#
attr_reader :public_xcconfig
# @param [Target] target @see target
# @param [Xcodeproj::Config] public_xcconfig @see public_xcconfig
#
def initialize(target, public_xcconfig)
super(target)
@public_xcconfig = public_xcconfig
end
# Generates the xcconfig. # Generates the xcconfig.
# #
# @return [Xcodeproj::Config] # @return [Xcodeproj::Config]
...@@ -22,19 +35,57 @@ module Pod ...@@ -22,19 +35,57 @@ module Pod
# 'USE_HEADERMAP' => 'NO' # 'USE_HEADERMAP' => 'NO'
} }
xcconfig = Xcodeproj::Config.new xcconfig_hash = add_xcconfig_namespaced_keys(public_xcconfig.to_hash, config, target.xcconfig_prefix)
target.spec_consumers.each do |consumer| @xcconfig = Xcodeproj::Config.new(xcconfig_hash)
add_spec_build_settings_to_xcconfig(consumer, xcconfig) @xcconfig.includes = [target.name]
end @xcconfig
end
private
#-----------------------------------------------------------------------#
xcconfig.to_hash.each do |k, v| # !@group Private Helpers
prefixed_key = target.xcconfig_prefix + k
config[k] = "#{config[k]} ${#{prefixed_key}}" # Returns the hash representation of an xcconfig which inherit from the
# namespaced keys of a given one.
#
# @param [Hash] source_config
# The xcconfig whose keys need to be inherited.
#
# @param [Hash] destination_config
# The config which should inherit the source config keys.
#
# @return [Hash] The inheriting xcconfig.
#
def add_xcconfig_namespaced_keys(source_config, destination_config, prefix)
result = destination_config.dup
source_config.each do |key, value|
prefixed_key = prefix + conditional_less_key(key)
current_value = destination_config[key]
if current_value
result[key] = "#{current_value} ${#{prefixed_key}}"
else
result[key] = "${#{prefixed_key}}"
end
end end
result
end
@xcconfig = Xcodeproj::Config.new(config) # Strips the [*]-syntax from the given xcconfig key.
@xcconfig.includes = [target.name] #
@xcconfig # @param [String] key
# The key to strip.
#
# @return [String] The stripped key.
#
def conditional_less_key(key)
brackets_index = key.index('[')
if brackets_index
key[0...brackets_index]
else
key
end
end end
#-----------------------------------------------------------------------# #-----------------------------------------------------------------------#
......
...@@ -55,16 +55,16 @@ module Pod ...@@ -55,16 +55,16 @@ module Pod
# #
def create_xcconfig_file def create_xcconfig_file
path = library.xcconfig_path path = library.xcconfig_path
public_gen = Generator::PublicPodXCConfig.new(library)
UI.message "- Generating public xcconfig file at #{UI.path(path)}" do UI.message "- Generating public xcconfig file at #{UI.path(path)}" do
gen = Generator::PublicPodXCConfig.new(library) public_gen.save_as(path)
gen.save_as(path)
add_file_to_support_group(path) add_file_to_support_group(path)
end end
path = library.xcconfig_private_path path = library.xcconfig_private_path
private_gen = Generator::PrivatePodXCConfig.new(library, public_gen.xcconfig)
UI.message "- Generating private xcconfig file at #{UI.path(path)}" do UI.message "- Generating private xcconfig file at #{UI.path(path)}" do
gen = Generator::PrivatePodXCConfig.new(library) private_gen.save_as(path)
gen.save_as(path)
xcconfig_file_ref = add_file_to_support_group(path) xcconfig_file_ref = add_file_to_support_group(path)
target.build_configurations.each do |c| target.build_configurations.each do |c|
......
...@@ -2,80 +2,134 @@ require File.expand_path('../../../../spec_helper', __FILE__) ...@@ -2,80 +2,134 @@ require File.expand_path('../../../../spec_helper', __FILE__)
module Pod module Pod
describe Generator::PrivatePodXCConfig do describe Generator::PrivatePodXCConfig do
before do
@spec = fixture_spec('banana-lib/BananaLib.podspec')
@consumer = @spec.consumer(:ios)
target_definition = Podfile::TargetDefinition.new('Pods', nil)
@pod_target = PodTarget.new([@spec], target_definition, config.sandbox)
@pod_target.stubs(:platform).returns(:ios)
@generator = Generator::PrivatePodXCConfig.new(@pod_target)
end
it "returns the sandbox" do describe "in general" do
@generator.sandbox.class.should == Sandbox before do
@spec = fixture_spec('banana-lib/BananaLib.podspec')
@consumer = @spec.consumer(:ios)
target_definition = Podfile::TargetDefinition.new('Pods', nil)
@pod_target = PodTarget.new([@spec], target_definition, config.sandbox)
@pod_target.stubs(:platform).returns(:ios)
public_xcconfig = Xcodeproj::Config.new({"OTHER_LDFLAGS"=>"-framework SystemConfiguration"})
@generator = Generator::PrivatePodXCConfig.new(@pod_target, public_xcconfig)
end
it "returns the sandbox" do
@generator.sandbox.class.should == Sandbox
end
before do
@podfile = Podfile.new
@pod_target.target_definition.stubs(:podfile).returns(@podfile)
@xcconfig = @generator.generate
end
it "generates the xcconfig" do
@xcconfig.class.should == Xcodeproj::Config
end
it "configures the project to load all members that implement Objective-c classes or categories from the static library" do
@xcconfig.to_hash['OTHER_LDFLAGS'].should.include '-ObjC'
end
it 'does not add the -fobjc-arc to OTHER_LDFLAGS by default as Xcode 4.3.2 does not support it' do
@consumer.stubs(:requires_arc?).returns(true)
@xcconfig.to_hash['OTHER_LDFLAGS'].should.not.include("-fobjc-arc")
end
it 'adds the -fobjc-arc to OTHER_LDFLAGS if any pods require arc and the podfile explicitly requires it' do
@podfile.stubs(:set_arc_compatibility_flag?).returns(true)
@consumer.stubs(:requires_arc?).returns(true)
@xcconfig = @generator.generate
@xcconfig.to_hash['OTHER_LDFLAGS'].split(" ").should.include("-fobjc-arc")
end
it "sets the PODS_ROOT build variable" do
@xcconfig.to_hash['PODS_ROOT'].should.not == nil
end
it 'adds the library build headers and public headers search paths to the xcconfig, with quotes' do
private_headers = "\"#{@pod_target.build_headers.search_paths.join('" "')}\""
public_headers = "\"#{config.sandbox.public_headers.search_paths.join('" "')}\""
@xcconfig.to_hash['HEADER_SEARCH_PATHS'].should.include private_headers
@xcconfig.to_hash['HEADER_SEARCH_PATHS'].should.include public_headers
end
it 'adds the COCOAPODS macro definition' do
@xcconfig.to_hash['GCC_PREPROCESSOR_DEFINITIONS'].should.include 'COCOAPODS=1'
end
it 'adds the pod namespaced configuration items' do
@xcconfig.to_hash['OTHER_LDFLAGS'].should.include("${#{@pod_target.xcconfig_prefix}OTHER_LDFLAGS}")
end
it 'sets the relative path of the pods root for spec libraries to ${SRCROOT}' do
@xcconfig.to_hash['PODS_ROOT'].should == '${SRCROOT}'
end
it "saves the xcconfig" do
path = temporary_directory + 'sample.xcconfig'
@generator.save_as(path)
generated = Xcodeproj::Config.new(path)
generated.class.should == Xcodeproj::Config
end
end end
#-----------------------------------------------------------------------# #-------------------------------------------------------------------------#
before do describe "Private Helpers" do
@podfile = Podfile.new
@pod_target.target_definition.stubs(:podfile).returns(@podfile)
@xcconfig = @generator.generate
end
it "generates the xcconfig" do before do
@xcconfig.class.should == Xcodeproj::Config @sut = Generator::PrivatePodXCConfig.new(stub(), stub())
end end
it "configures the project to load all members that implement Objective-c classes or categories from the static library" do #----------------------------------------#
@xcconfig.to_hash['OTHER_LDFLAGS'].should.include '-ObjC'
end
it 'does not add the -fobjc-arc to OTHER_LDFLAGS by default as Xcode 4.3.2 does not support it' do describe "#add_xcconfig_namespaced_keys" do
@consumer.stubs(:requires_arc?).returns(true)
@xcconfig.to_hash['OTHER_LDFLAGS'].should.not.include("-fobjc-arc")
end
it 'adds the -fobjc-arc to OTHER_LDFLAGS if any pods require arc and the podfile explicitly requires it' do it "appends to the values of the keys of the destination the value of the keys of the source" do
@podfile.stubs(:set_arc_compatibility_flag?).returns(true) source_config = { 'HEADER_SEARCH_PATHS' => '${PODS_ROOT}/MyPod' }
@consumer.stubs(:requires_arc?).returns(true) destination_config = { 'HEADER_SEARCH_PATHS' => '${PODS_ROOT}/BuildHeaders' }
@xcconfig = @generator.generate result = @sut.send(:add_xcconfig_namespaced_keys, source_config, destination_config, 'PREFIX_')
@xcconfig.to_hash['OTHER_LDFLAGS'].split(" ").should.include("-fobjc-arc") result.should == { 'HEADER_SEARCH_PATHS' => '${PODS_ROOT}/BuildHeaders ${PREFIX_HEADER_SEARCH_PATHS}' }
end end
it "sets the PODS_ROOT build variable" do it "uses the key of the destination xcconfig if not present in the source" do
@xcconfig.to_hash['PODS_ROOT'].should.not == nil source_config = { }
end destination_config = { 'HEADER_SEARCH_PATHS' => '${PODS_ROOT}/BuildHeaders' }
result = @sut.send(:add_xcconfig_namespaced_keys, source_config, destination_config, 'PREFIX_')
result.should == { 'HEADER_SEARCH_PATHS' => '${PODS_ROOT}/BuildHeaders' }
end
it 'adds the library build headers and public headers search paths to the xcconfig, with quotes' do it "preserves any value of the source not present in the destination" do
private_headers = "\"#{@pod_target.build_headers.search_paths.join('" "')}\"" source_config = { 'EXCLUDED_SOURCE_FILE_NAMES' => 'ZBarReaderViewImpl_Simulator.m' }
public_headers = "\"#{config.sandbox.public_headers.search_paths.join('" "')}\"" destination_config = { }
@xcconfig.to_hash['HEADER_SEARCH_PATHS'].should.include private_headers result = @sut.send(:add_xcconfig_namespaced_keys, source_config, destination_config, 'PREFIX_')
@xcconfig.to_hash['HEADER_SEARCH_PATHS'].should.include public_headers result.should == { 'EXCLUDED_SOURCE_FILE_NAMES' => '${PREFIX_EXCLUDED_SOURCE_FILE_NAMES}' }
end end
it 'adds the COCOAPODS macro definition' do end
@xcconfig.to_hash['GCC_PREPROCESSOR_DEFINITIONS'].should.include 'COCOAPODS=1'
end
it 'adds the pod namespaced configuration items' do #----------------------------------------#
@xcconfig.to_hash['OTHER_LDFLAGS'].should.include("${#{@pod_target.xcconfig_prefix}OTHER_LDFLAGS}")
end
#-----------------------------------------------------------------------# describe "#conditional_less_key" do
it 'sets the relative path of the pods root for spec libraries to ${SRCROOT}' do it "returns the key without the xcconfig conditional syntax if present" do
@xcconfig.to_hash['PODS_ROOT'].should == '${SRCROOT}' result = @sut.send(:conditional_less_key, 'EXCLUDED_SOURCE_FILE_NAMES[sdk=iphoneos*][arch=*]')
end result.should == 'EXCLUDED_SOURCE_FILE_NAMES'
end
it "returns the key as it is if no conditional syntax is present" do
result = @sut.send(:conditional_less_key, 'EXCLUDED_SOURCE_FILE_NAMES')
result.should == 'EXCLUDED_SOURCE_FILE_NAMES'
end
#-----------------------------------------------------------------------# end
it "saves the xcconfig" do
path = temporary_directory + 'sample.xcconfig'
@generator.save_as(path)
generated = Xcodeproj::Config.new(path)
generated.class.should == Xcodeproj::Config
end end
#-------------------------------------------------------------------------#
end end
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