Class: Pod::Target::BuildSettings

Inherits:
Object
  • Object
show all
Defined in:
lib/cocoapods/target/build_settings.rb

Overview

Since:

  • 1.5.0

Direct Known Subclasses

AggregateTargetSettings, PodTargetSettings

Defined Under Namespace

Classes: AggregateTargetSettings, PodTargetSettings

Constants collapse

PLURAL_SETTINGS =

Returns The build settings that should be treated as arrays, rather than strings.

Returns:

  • (Set<String>)

    The build settings that should be treated as arrays, rather than strings.

Since:

  • 1.5.0

%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.

Returns:

  • (String)

    The variable for the configuration build directory used when building pod targets.

Since:

  • 1.5.0

'${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.

Returns:

  • (String)

    The variable for the configuration intermediate frameworks directory used for building pod targets that contain vendored xcframeworks.

Since:

  • 1.5.0

'${PODS_XCFRAMEWORKS_BUILD_DIR}'

Public API collapse

DSL collapse

Public API collapse

Build System collapse

Code Signing collapse

Frameworks collapse

Libraries collapse

Clang collapse

Swift collapse

Linking collapse

Constructor Details

#initialize(target) ⇒ BuildSettings

Initialize a new instance

Parameters:

Since:

  • 1.5.0


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_namesSet<String> (readonly)

be present in the #xcconfig

Returns:

  • (Set<String>)

    a set of all the build settings names that will

Since:

  • 1.5.0


159
160
161
# File 'lib/cocoapods/target/build_settings.rb', line 159

def build_settings_names
  @build_settings_names
end

Instance Attribute Details

#targetTarget (readonly)

Returns The target this build settings object is generating build settings for.

Returns:

  • (Target)

    The target this build settings object is generating build settings for

Since:

  • 1.5.0


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.

Parameters:

  • method_name (Symbol, String)

    The name of the method to define

  • build_setting (Boolean) (defaults to: false)

    Whether the method name should be added (upcased) to build_setting_names

  • memoized (Boolean) (defaults to: false)

    Whether the method should be memoized

  • sorted (Boolean) (defaults to: false)

    Whether the return value should be sorted

  • uniqued (Boolean) (defaults to: false)

    Whether the return value should be uniqued

  • compacted (Boolean) (defaults to: false)

    Whether the return value should be compacted

  • frozen (Boolean) (defaults to: true)

    Whether the return value should be frozen

  • from_search_paths_aggregate_targets (Boolean, Symbol) (defaults to: false)

    If truthy, the method from Aggregate that should be used to concatenate build settings from AggregateTarget#search_paths_aggregate_target

  • from_pod_targets_to_link (Symbol) (defaults to: false)

    If truthy, the _to_import values from BuildSettings#pod_targets_to_link will be concatenated

  • implementation (Block)

Since:

  • 1.5.0


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.

Parameters:

  • xcframework (XCFramework)

    the xcframework thats slice will be copied to the intermediates dir

Returns:

  • (String)

    the path to the directory containing the xcframework slice

Since:

  • 1.5.0


147
148
149
# File 'lib/cocoapods/target/build_settings.rb', line 147

def self.xcframework_intermediate_dir(xcframework)
  "#{XCFRAMEWORKS_BUILD_DIR_VARIABLE}/#{xcframework.name}"
end

Instance Method Details

#_ld_runpath_search_paths(requires_host_target: false, test_bundle: false) ⇒ Array<String> (private)

Returns the LD_RUNPATH_SEARCH_PATHS needed for dynamically linking the #target.

Parameters:

  • requires_host_target (Boolean) (defaults to: false)
  • test_bundle (Boolean) (defaults to: false)

Returns:

  • (Array<String>)

    the LD_RUNPATH_SEARCH_PATHS needed for dynamically linking the #target

Since:

  • 1.5.0


349
350
351
352
353
354
355
356
357
358
359
360
361
# File 'lib/cocoapods/target/build_settings.rb', line 349

def _ld_runpath_search_paths(requires_host_target: false, test_bundle: false)
  if target.platform.symbolic_name == :osx
    ["'@executable_path/../Frameworks'",
     test_bundle ? "'@loader_path/../Frameworks'" : "'@loader_path/Frameworks'"]
  else
    paths = [
      "'@executable_path/Frameworks'",
      "'@loader_path/Frameworks'",
    ]
    paths << "'@executable_path/../../Frameworks'" if requires_host_target
    paths
  end
end

#add_inherited_to_plural(hash) ⇒ Hash<String => String> (private)

Returns:

  • (Hash<String => String>)

Since:

  • 1.5.0


393
394
395
396
397
398
399
400
401
402
403
404
405
406
# File 'lib/cocoapods/target/build_settings.rb', line 393

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_headerBoolean

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.

Returns:

  • (Boolean)

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_identityString

The code_sign_identity build setting for the #target.

The return value from this method will be: code_sign_identity, build_setting.

Returns:

  • (String)

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_pathsArray<String>

The framework_search_paths build setting for the #target.

The return value from this method will be: framework_search_paths, build_setting, memoized.

Returns:

  • (Array<String>)

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.

Parameters:

  • frameworks (Array<String>)

    The list of framework names

Returns:

  • (Array<String>)

    the FRAMEWORK_SEARCH_PATHS needed to import developer frameworks

Since:

  • 1.5.0


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

#frameworksArray<String>

The frameworks build setting for the #target.

The return value from this method will be: frameworks.

Returns:

  • (Array<String>)

246
247
248
# File 'lib/cocoapods/target/build_settings.rb', line 246

define_build_settings_method :frameworks do
  []
end

#gcc_preprocessor_definitionsArray<String>

The gcc_preprocessor_definitions build setting for the #target.

The return value from this method will be: gcc_preprocessor_definitions, build_setting.

Returns:

  • (Array<String>)

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

Since:

  • 1.5.0


181
182
183
184
# File 'lib/cocoapods/target/build_settings.rb', line 181

def initialize_copy(other)
  super
  @__memoized = {}
end

#librariesArray<String>

The libraries build setting for the #target.

The return value from this method will be: libraries.

Returns:

  • (Array<String>)

278
279
280
# File 'lib/cocoapods/target/build_settings.rb', line 278

define_build_settings_method :libraries do
  []
end

#load_xcframework(path) ⇒ Xcode::XCFramework (private)

Returns the xcframework at the given path.

Parameters:

  • path (Pathname, String)

    the path to the xcframework bundle

Returns:

Since:

  • 1.5.0


507
508
509
# File 'lib/cocoapods/target/build_settings.rb', line 507

def load_xcframework(path)
  Xcode::XCFramework.new(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.

Parameters:

  • spec_xcconfig_hash (Hash<String,String>)

    the merged xcconfig defined in the spec.

  • xcconfig (Xcodeproj::Config)

    the config to merge into.

Returns:

  • (Xcodeproj::Config)

    the merged config.

Since:

  • 1.5.0


475
476
477
478
479
480
# File 'lib/cocoapods/target/build_settings.rb', line 475

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)

Parameters:

  • xcconfig_values_by_consumer_by_key (Hash)
  • attribute (#to_s)

    The name of the attribute being merged

Returns:

  • (Hash<String, String>)

Since:

  • 1.5.0


435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
# File 'lib/cocoapods/target/build_settings.rb', line 435

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 =~ /\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_filesArray<String>

The module_map_files build setting for the #target.

The return value from this method will be: module_map_files.

Returns:

  • (Array<String>)

297
298
299
# File 'lib/cocoapods/target/build_settings.rb', line 297

define_build_settings_method :module_map_files do
  []
end

#other_cflagsArray<String>

The other_cflags build setting for the #target.

The return value from this method will be: other_cflags, build_setting, memoized.

Returns:

  • (Array<String>)

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_ldflagsArray<String>

The other_ldflags build setting for the #target.

The return value from this method will be: other_ldflags, build_setting, memoized.

Returns:

  • (Array<String>)

365
366
367
368
369
370
371
372
373
374
375
# File 'lib/cocoapods/target/build_settings.rb', line 365

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_flagsArray<String>

The other_swift_flags build setting for the #target.

The return value from this method will be: other_swift_flags, build_setting, memoized.

Returns:

  • (Array<String>)

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.

Returns:

  • (Boolean)

    Whether OTHER_SWIFT_FLAGS should be generated when the target does not use swift.

Since:

  • 1.5.0


309
310
311
# File 'lib/cocoapods/target/build_settings.rb', line 309

def other_swift_flags_without_swift?
  false
end

#pods_build_dirString

The pods_build_dir build setting for the #target.

The return value from this method will be: pods_build_dir, build_setting.

Returns:

  • (String)

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_dirString

The pods_configuration_build_dir build setting for the #target.

The return value from this method will be: pods_configuration_build_dir, build_setting.

Returns:

  • (String)

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_dirObject

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)

Parameters:

  • array (Array<String>)

Returns:

  • (Array<String>)

Since:

  • 1.5.0


412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
# File 'lib/cocoapods/target/build_settings.rb', line 412

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?.

Returns:

  • (Boolean)

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?.

Returns:

  • (Boolean)

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

Parameters:

  • path (String, Pathname)

    The path the xcconfig will be saved to

Returns:

  • (Xcodeproj::Config)

See Also:

Since:

  • 1.5.0


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.

Parameters:

Returns:

Since:

  • 1.5.0


489
490
491
492
493
494
495
496
497
498
499
500
501
# File 'lib/cocoapods/target/build_settings.rb', line 489

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_hHash<String => String|Array<String>> (private)

Returns:

  • (Hash<String => String|Array<String>>)

Since:

  • 1.5.0


384
385
386
387
388
389
390
# File 'lib/cocoapods/target/build_settings.rb', line 384

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_phasesString

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.

Returns:

  • (String)

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_frameworksArray<String>

The weak_frameworks build setting for the #target.

The return value from this method will be: weak_frameworks.

Returns:

  • (Array<String>)

251
252
253
# File 'lib/cocoapods/target/build_settings.rb', line 251

define_build_settings_method :weak_frameworks do
  []
end

#xcconfigXcodeproj::Config Also known as: generate

The xcconfig build setting for the #target.

The return value from this method will be: xcconfig, memoized.

Returns:

  • (Xcodeproj::Config)

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