Class: Pod::Target::BuildSettings
- Inherits:
-
Object
- Object
- Pod::Target::BuildSettings
- Defined in:
- lib/cocoapods/target/build_settings.rb
Overview
Direct Known Subclasses
Defined Under Namespace
Classes: AggregateTargetSettings, PodTargetSettings
Constants collapse
- PLURAL_SETTINGS =
Returns The build settings that should be treated as arrays, rather than strings.
%w( ALTERNATE_PERMISSIONS_FILES ARCHS BUILD_VARIANTS EXCLUDED_SOURCE_FILE_NAMES FRAMEWORK_SEARCH_PATHS GCC_PREPROCESSOR_DEFINITIONS GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS HEADER_SEARCH_PATHS INCLUDED_SOURCE_FILE_NAMES INFOPLIST_PREPROCESSOR_DEFINITIONS LD_RUNPATH_SEARCH_PATHS LIBRARY_SEARCH_PATHS LOCALIZED_STRING_MACRO_NAMES OTHER_CFLAGS OTHER_CPLUSPLUSFLAGS OTHER_LDFLAGS OTHER_SWIFT_FLAGS REZ_SEARCH_PATHS SECTORDER_FLAGS SWIFT_ACTIVE_COMPILATION_CONDITIONS SWIFT_INCLUDE_PATHS SYSTEM_FRAMEWORK_SEARCH_PATHS SYSTEM_HEADER_SEARCH_PATHS USER_HEADER_SEARCH_PATHS WARNING_CFLAGS WARNING_LDFLAGS ).to_set.freeze
- CONFIGURATION_BUILD_DIR_VARIABLE =
Returns The variable for the configuration build directory used when building pod targets.
'${PODS_CONFIGURATION_BUILD_DIR}'
- XCFRAMEWORKS_BUILD_DIR_VARIABLE =
Returns The variable for the configuration intermediate frameworks directory used for building pod targets that contain vendored xcframeworks.
'${PODS_XCFRAMEWORKS_BUILD_DIR}'
Public API collapse
-
.build_settings_names ⇒ Set<String>
readonly
be present in the #xcconfig.
-
#target ⇒ Target
readonly
The target this build settings object is generating build settings for.
DSL collapse
-
.define_build_settings_method(method_name, build_setting: false, memoized: false, sorted: false, uniqued: false, compacted: false, frozen: true, from_search_paths_aggregate_targets: false, from_pod_targets_to_link: false, &implementation) ⇒ Object
private
Creates a method that calculates a part of the build settings for the #target.
-
.xcframework_intermediate_dir(xcframework) ⇒ String
The path to the directory containing the xcframework slice.
Public API collapse
-
#initialize(target) ⇒ BuildSettings
constructor
Initialize a new instance.
- #initialize_copy(other) ⇒ Object
-
#save_as(path) ⇒ Xcodeproj::Config
Saves the generated xcconfig to the given path.
-
#xcconfig ⇒ Xcodeproj::Config
(also: #generate)
The
xcconfig
build setting for the #target.
Build System collapse
-
#pods_build_dir ⇒ String
The
pods_build_dir
build setting for the #target. -
#pods_configuration_build_dir ⇒ String
The
pods_configuration_build_dir
build setting for the #target. -
#pods_xcframeworks_build_dir ⇒ Object
The
pods_xcframeworks_build_dir
build setting for the #target. -
#use_recursive_script_inputs_in_script_phases ⇒ String
The
use_recursive_script_inputs_in_script_phases
build setting for the #target.
Code Signing collapse
-
#code_sign_identity ⇒ String
The
code_sign_identity
build setting for the #target.
Frameworks collapse
-
#framework_search_paths ⇒ Array<String>
The
framework_search_paths
build setting for the #target. -
#framework_search_paths_to_import_developer_frameworks(frameworks) ⇒ Array<String>
The
FRAMEWORK_SEARCH_PATHS
needed to import developer frameworks. -
#frameworks ⇒ Array<String>
The
frameworks
build setting for the #target. -
#weak_frameworks ⇒ Array<String>
The
weak_frameworks
build setting for the #target.
Libraries collapse
-
#libraries ⇒ Array<String>
The
libraries
build setting for the #target.
Clang collapse
-
#gcc_preprocessor_definitions ⇒ Array<String>
The
gcc_preprocessor_definitions
build setting for the #target. -
#module_map_files ⇒ Array<String>
The
module_map_files
build setting for the #target. -
#other_cflags ⇒ Array<String>
The
other_cflags
build setting for the #target.
Swift collapse
-
#other_swift_flags ⇒ Array<String>
The
other_swift_flags
build setting for the #target. -
#other_swift_flags_without_swift? ⇒ Boolean
Whether
OTHER_SWIFT_FLAGS
should be generated when the target does not use swift.
Linking collapse
-
#_ld_runpath_search_paths(requires_host_target: false, test_bundle: false, uses_swift: false) ⇒ Array<String>
private
The
LD_RUNPATH_SEARCH_PATHS
needed for dynamically linking the #target. - #add_inherited_to_plural(hash) ⇒ Hash<String => String> private
-
#clang_warn_quoted_include_in_framework_header ⇒ Boolean
Xcode 12 turns on this warning by default which is problematic for CocoaPods-generated imports which use double-quoted paths.
-
#load_xcframework(target_name, path) ⇒ Xcode::XCFramework
private
The xcframework at the given path.
-
#merge_spec_xcconfig_into_xcconfig(spec_xcconfig_hash, xcconfig) ⇒ Xcodeproj::Config
private
Merges the spec-defined xcconfig into the derived xcconfig, overriding any singular settings and merging plural settings.
- #merged_xcconfigs(xcconfig_values_by_consumer_by_key, attribute, overriding: {}) ⇒ Hash<String, String> private
-
#other_ldflags ⇒ Array<String>
The
other_ldflags
build setting for the #target. - #quote_array(array) ⇒ Array<String> private
-
#requires_fobjc_arc? ⇒ Boolean
The
requires_fobjc_arc?
build setting for the #target. -
#requires_objc_linker_flag? ⇒ Boolean
The
requires_objc_linker_flag?
build setting for the #target. -
#select_maximal_pod_targets(pod_targets) ⇒ Array<PodTarget>
private
Filters out pod targets whose
specs
are a subset of another target's. - #to_h ⇒ Hash<String => String|Array<String>> private
Constructor Details
#initialize(target) ⇒ BuildSettings
Initialize a new instance
176 177 178 179 |
# File 'lib/cocoapods/target/build_settings.rb', line 176 def initialize(target) @target = target @__memoized = {} end |
Class Attribute Details
.build_settings_names ⇒ Set<String> (readonly)
be present in the #xcconfig
159 160 161 |
# File 'lib/cocoapods/target/build_settings.rb', line 159 def build_settings_names @build_settings_names end |
Instance Attribute Details
#target ⇒ Target (readonly)
Returns The target this build settings object is generating build settings for.
169 170 171 |
# File 'lib/cocoapods/target/build_settings.rb', line 169 def target @target end |
Class Method Details
.define_build_settings_method(method_name, build_setting: false, memoized: false, sorted: false, uniqued: false, compacted: false, frozen: true, from_search_paths_aggregate_targets: false, from_pod_targets_to_link: false, &implementation) ⇒ Object (private)
Creates a method that calculates a part of the build settings for the #target.
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'lib/cocoapods/target/build_settings.rb', line 99 def self.define_build_settings_method(method_name, build_setting: false, memoized: false, sorted: false, uniqued: false, compacted: false, frozen: true, from_search_paths_aggregate_targets: false, from_pod_targets_to_link: false, &implementation) memoized_key = "#{self}##{method_name}" (@build_settings_names ||= Set.new) << method_name.to_s.upcase if build_setting raw_method_name = :"_raw_#{method_name}" define_method(raw_method_name, &implementation) private(raw_method_name) dup_before_freeze = frozen && (from_pod_targets_to_link || from_search_paths_aggregate_targets || uniqued || sorted) define_method(method_name) do if memoized retval = @__memoized.fetch(memoized_key, :not_found) return retval if :not_found != retval end retval = send(raw_method_name) if retval.nil? @__memoized[memoized_key] = retval if memoized return end retval = retval.dup if dup_before_freeze && retval.frozen? retval.concat(pod_targets_to_link.flat_map { |pod_target| pod_target.build_settings_for_spec(pod_target.root_spec, :configuration => configuration_name).public_send("#{method_name}_to_import") }) if from_pod_targets_to_link retval.concat(search_paths_aggregate_target_pod_target_build_settings.flat_map(&from_search_paths_aggregate_targets)) if from_search_paths_aggregate_targets retval.compact! if compacted retval.uniq! if uniqued retval.sort! if sorted retval.freeze if frozen @__memoized[memoized_key] = retval if memoized retval end end |
.xcframework_intermediate_dir(xcframework) ⇒ String
Returns the path to the directory containing the xcframework slice.
147 148 149 |
# File 'lib/cocoapods/target/build_settings.rb', line 147 def self.xcframework_intermediate_dir(xcframework) "#{XCFRAMEWORKS_BUILD_DIR_VARIABLE}/#{xcframework.target_name}" end |
Instance Method Details
#_ld_runpath_search_paths(requires_host_target: false, test_bundle: false, uses_swift: false) ⇒ Array<String> (private)
Returns the LD_RUNPATH_SEARCH_PATHS
needed for dynamically linking the #target.
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 |
# File 'lib/cocoapods/target/build_settings.rb', line 349 def _ld_runpath_search_paths(requires_host_target: false, test_bundle: false, uses_swift: false) paths = [] if uses_swift paths << '/usr/lib/swift' paths << '$(PLATFORM_DIR)/Developer/Library/Frameworks' if test_bundle end if target.platform.symbolic_name == :osx paths << "'@executable_path/../Frameworks'" paths << if test_bundle "'@loader_path/../Frameworks'" else "'@loader_path/Frameworks'" end paths << '${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}' if uses_swift else paths << "'@executable_path/Frameworks'" paths << "'@loader_path/Frameworks'" paths << "'@executable_path/../../Frameworks'" if requires_host_target end paths end |
#add_inherited_to_plural(hash) ⇒ Hash<String => String> (private)
401 402 403 404 405 406 407 408 409 410 411 412 413 414 |
# File 'lib/cocoapods/target/build_settings.rb', line 401 def add_inherited_to_plural(hash) Hash[hash.map do |key, value| next [key, '$(inherited)'] if value.nil? if PLURAL_SETTINGS.include?(key) raise ArgumentError, "#{key} is a plural setting, cannot have #{value.inspect} as its value" unless value.is_a? Array value = "$(inherited) #{quote_array(value)}" else raise ArgumentError, "#{key} is not a plural setting, cannot have #{value.inspect} as its value" unless value.is_a? String end [key, value] end] end |
#clang_warn_quoted_include_in_framework_header ⇒ Boolean
Xcode 12 turns on this warning by default which is problematic for CocoaPods-generated
imports which use double-quoted paths.
The clang_warn_quoted_include_in_framework_header
build setting for the #target.
The return value from this method will be: clang_warn_quoted_include_in_framework_header, build_setting
.
338 339 340 |
# File 'lib/cocoapods/target/build_settings.rb', line 338 define_build_settings_method :clang_warn_quoted_include_in_framework_header, :build_setting => true do 'NO' end |
#code_sign_identity ⇒ String
The code_sign_identity
build setting for the #target.
The return value from this method will be: code_sign_identity, build_setting
.
235 236 237 238 239 |
# File 'lib/cocoapods/target/build_settings.rb', line 235 define_build_settings_method :code_sign_identity, :build_setting => true do return unless target.build_as_dynamic? return unless target.platform.to_sym == :osx '' end |
#framework_search_paths ⇒ Array<String>
The framework_search_paths
build setting for the #target.
The return value from this method will be: framework_search_paths, build_setting, memoized
.
256 257 258 |
# File 'lib/cocoapods/target/build_settings.rb', line 256 define_build_settings_method :framework_search_paths, :build_setting => true, :memoized => true do framework_search_paths_to_import_developer_frameworks(frameworks + weak_frameworks) end |
#framework_search_paths_to_import_developer_frameworks(frameworks) ⇒ Array<String>
Returns the FRAMEWORK_SEARCH_PATHS
needed to import developer frameworks.
265 266 267 268 269 270 271 |
# File 'lib/cocoapods/target/build_settings.rb', line 265 def framework_search_paths_to_import_developer_frameworks(frameworks) if frameworks.include?('XCTest') || frameworks.include?('SenTestingKit') %w[ $(PLATFORM_DIR)/Developer/Library/Frameworks ] else [] end end |
#frameworks ⇒ Array<String>
The frameworks
build setting for the #target.
The return value from this method will be: frameworks
.
246 247 248 |
# File 'lib/cocoapods/target/build_settings.rb', line 246 define_build_settings_method :frameworks do [] end |
#gcc_preprocessor_definitions ⇒ Array<String>
The gcc_preprocessor_definitions
build setting for the #target.
The return value from this method will be: gcc_preprocessor_definitions, build_setting
.
287 288 289 |
# File 'lib/cocoapods/target/build_settings.rb', line 287 define_build_settings_method :gcc_preprocessor_definitions, :build_setting => true do %w( COCOAPODS=1 ) end |
#initialize_copy(other) ⇒ Object
181 182 183 184 |
# File 'lib/cocoapods/target/build_settings.rb', line 181 def initialize_copy(other) super @__memoized = {} end |
#libraries ⇒ Array<String>
The libraries
build setting for the #target.
The return value from this method will be: libraries
.
278 279 280 |
# File 'lib/cocoapods/target/build_settings.rb', line 278 define_build_settings_method :libraries do [] end |
#load_xcframework(target_name, path) ⇒ Xcode::XCFramework (private)
Returns the xcframework at the given path.
517 518 519 |
# File 'lib/cocoapods/target/build_settings.rb', line 517 def load_xcframework(target_name, path) Xcode::XCFramework.new(target_name, path) end |
#merge_spec_xcconfig_into_xcconfig(spec_xcconfig_hash, xcconfig) ⇒ Xcodeproj::Config (private)
Merges the spec-defined xcconfig into the derived xcconfig, overriding any singular settings and merging plural settings.
483 484 485 486 487 488 |
# File 'lib/cocoapods/target/build_settings.rb', line 483 def merge_spec_xcconfig_into_xcconfig(spec_xcconfig_hash, xcconfig) plural_configs, singlular_configs = spec_xcconfig_hash.partition { |k, _v| PLURAL_SETTINGS.include?(k) }.map { |a| Hash[a] } xcconfig.attributes.merge!(singlular_configs) xcconfig.merge!(plural_configs) xcconfig end |
#merged_xcconfigs(xcconfig_values_by_consumer_by_key, attribute, overriding: {}) ⇒ Hash<String, String> (private)
443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 |
# File 'lib/cocoapods/target/build_settings.rb', line 443 def merged_xcconfigs(xcconfig_values_by_consumer_by_key, attribute, overriding: {}) xcconfig_values_by_consumer_by_key.each_with_object(overriding.dup) do |(key, values_by_consumer), xcconfig| uniq_values = values_by_consumer.values.uniq values_are_bools = uniq_values.all? { |v| v.is_a?(String) && v =~ /\A(yes|no)\z/i } if values_are_bools # Boolean build settings if uniq_values.count > 1 UI.warn "Can't merge #{attribute} for pod targets: " \ "#{values_by_consumer.keys.map(&:name)}. Boolean build " \ "setting #{key} has different values." else xcconfig[key] = uniq_values.first end elsif PLURAL_SETTINGS.include? key # Plural build settings if xcconfig.key?(key) overridden = xcconfig[key] uniq_values.prepend(overridden) end xcconfig[key] = uniq_values.uniq.join(' ') elsif uniq_values.count > 1 # Singular build settings UI.warn "Can't merge #{attribute} for pod targets: " \ "#{values_by_consumer.keys.map(&:name)}. Singular build " \ "setting #{key} has different values." else xcconfig[key] = uniq_values.first end end end |
#module_map_files ⇒ Array<String>
The module_map_files
build setting for the #target.
The return value from this method will be: module_map_files
.
297 298 299 |
# File 'lib/cocoapods/target/build_settings.rb', line 297 define_build_settings_method :module_map_files do [] end |
#other_cflags ⇒ Array<String>
The other_cflags
build setting for the #target.
The return value from this method will be: other_cflags, build_setting, memoized
.
292 293 294 |
# File 'lib/cocoapods/target/build_settings.rb', line 292 define_build_settings_method :other_cflags, :build_setting => true, :memoized => true do module_map_files.map { |f| "-fmodule-map-file=#{f}" } end |
#other_ldflags ⇒ Array<String>
The other_ldflags
build setting for the #target.
The return value from this method will be: other_ldflags, build_setting, memoized
.
373 374 375 376 377 378 379 380 381 382 383 |
# File 'lib/cocoapods/target/build_settings.rb', line 373 define_build_settings_method :other_ldflags, :build_setting => true, :memoized => true do ld_flags = [] ld_flags << '-ObjC' if requires_objc_linker_flag? if requires_fobjc_arc? ld_flags << '-fobjc-arc' end libraries.each { |l| ld_flags << %(-l"#{l}") } frameworks.each { |f| ld_flags << '-framework' << %("#{f}") } weak_frameworks.each { |f| ld_flags << '-weak_framework' << %("#{f}") } ld_flags end |
#other_swift_flags ⇒ Array<String>
The other_swift_flags
build setting for the #target.
The return value from this method will be: other_swift_flags, build_setting, memoized
.
314 315 316 317 318 319 |
# File 'lib/cocoapods/target/build_settings.rb', line 314 define_build_settings_method :other_swift_flags, :build_setting => true, :memoized => true do return unless target.uses_swift? || other_swift_flags_without_swift? flags = %w(-D COCOAPODS) flags.concat module_map_files.flat_map { |f| ['-Xcc', "-fmodule-map-file=#{f}"] } flags end |
#other_swift_flags_without_swift? ⇒ Boolean
Returns Whether OTHER_SWIFT_FLAGS
should be generated when the target
does not use swift.
309 310 311 |
# File 'lib/cocoapods/target/build_settings.rb', line 309 def other_swift_flags_without_swift? false end |
#pods_build_dir ⇒ String
The pods_build_dir
build setting for the #target.
The return value from this method will be: pods_build_dir, build_setting
.
212 213 214 |
# File 'lib/cocoapods/target/build_settings.rb', line 212 define_build_settings_method :pods_build_dir, :build_setting => true do '${BUILD_DIR}' end |
#pods_configuration_build_dir ⇒ String
The pods_configuration_build_dir
build setting for the #target.
The return value from this method will be: pods_configuration_build_dir, build_setting
.
217 218 219 |
# File 'lib/cocoapods/target/build_settings.rb', line 217 define_build_settings_method :pods_configuration_build_dir, :build_setting => true do '${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)' end |
#pods_xcframeworks_build_dir ⇒ Object
The pods_xcframeworks_build_dir
build setting for the #target.
The return value from this method will be: pods_xcframeworks_build_dir, build_setting
.
221 222 223 |
# File 'lib/cocoapods/target/build_settings.rb', line 221 define_build_settings_method :pods_xcframeworks_build_dir, :build_setting => true do '$(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates' end |
#quote_array(array) ⇒ Array<String> (private)
420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 |
# File 'lib/cocoapods/target/build_settings.rb', line 420 def quote_array(array) array.map do |element| case element when /\A([\w-]+?)=(.+)\z/ key = Regexp.last_match(1) value = Regexp.last_match(2) value = %("#{value}") if value =~ /[^\w\d]/ %(#{key}=#{value}) when /[\$\[\]\ ]/ %("#{element}") else element end end.join(' ') end |
#requires_fobjc_arc? ⇒ Boolean
The requires_fobjc_arc?
build setting for the #target.
The return value from this method will be: requires_fobjc_arc?
.
331 332 333 |
# File 'lib/cocoapods/target/build_settings.rb', line 331 define_build_settings_method :requires_fobjc_arc? do false end |
#requires_objc_linker_flag? ⇒ Boolean
The requires_objc_linker_flag?
build setting for the #target.
The return value from this method will be: requires_objc_linker_flag?
.
326 327 328 |
# File 'lib/cocoapods/target/build_settings.rb', line 326 define_build_settings_method :requires_objc_linker_flag? do false end |
#save_as(path) ⇒ Xcodeproj::Config
Saves the generated xcconfig to the given path
203 204 205 |
# File 'lib/cocoapods/target/build_settings.rb', line 203 def save_as(path) xcconfig.save_as(path) end |
#select_maximal_pod_targets(pod_targets) ⇒ Array<PodTarget> (private)
Filters out pod targets whose specs
are a subset of
another target's.
497 498 499 500 501 502 503 504 505 506 507 508 509 |
# File 'lib/cocoapods/target/build_settings.rb', line 497 def select_maximal_pod_targets(pod_targets) subset_targets = [] pod_targets.uniq.group_by(&:pod_name).each do |_pod_name, targets| targets.combination(2) do |a, b| if (a.specs - b.specs).empty? subset_targets << a elsif (b.specs - a.specs).empty? subset_targets << b end end end pod_targets - subset_targets end |
#to_h ⇒ Hash<String => String|Array<String>> (private)
392 393 394 395 396 397 398 |
# File 'lib/cocoapods/target/build_settings.rb', line 392 def to_h hash = {} self.class.build_settings_names.sort.each do |setting| hash[setting] = public_send(setting.downcase) end hash end |
#use_recursive_script_inputs_in_script_phases ⇒ String
The use_recursive_script_inputs_in_script_phases
build setting for the #target.
The return value from this method will be: use_recursive_script_inputs_in_script_phases, build_setting
.
226 227 228 |
# File 'lib/cocoapods/target/build_settings.rb', line 226 define_build_settings_method :use_recursive_script_inputs_in_script_phases, :build_setting => true do 'YES' end |
#weak_frameworks ⇒ Array<String>
The weak_frameworks
build setting for the #target.
The return value from this method will be: weak_frameworks
.
251 252 253 |
# File 'lib/cocoapods/target/build_settings.rb', line 251 define_build_settings_method :weak_frameworks do [] end |
#xcconfig ⇒ Xcodeproj::Config Also known as: generate
The xcconfig
build setting for the #target.
The return value from this method will be: xcconfig, memoized
.
187 188 189 190 |
# File 'lib/cocoapods/target/build_settings.rb', line 187 define_build_settings_method :xcconfig, :memoized => true do settings = add_inherited_to_plural(to_h) Xcodeproj::Config.new(settings) end |