class Pod::DyInstaller::Xcode::PodsProjectGenerator::AggregateTargetInstaller

Creates the targets which aggregate the Pods libraries in the Pods project and the relative support files.

Public Instance Methods

install!() click to toggle source

Creates the target in the Pods project and the relative support files.

@return [void]

# File lib/pod/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 13
def install!
  UI.message "- Installing target `#{target.name}` #{target.platform}" do
    add_target
    create_support_files_dir
    create_support_files_group
    create_xcconfig_file
    if target.requires_frameworks?
      create_info_plist_file(target.info_plist_path, native_target, target.version, target.platform)
      create_module_map
      create_umbrella_header
    elsif target.uses_swift?
      create_module_map
      create_umbrella_header
    end
    # Because embedded targets live in their host target, CocoaPods
    # copies all of the embedded target's pod_targets to its host
    # targets. Having this script for the embedded target would
    # cause an App Store rejection because frameworks cannot be
    # embedded in embedded targets.
    #
    create_embed_frameworks_script unless target.requires_host_target?
    create_bridge_support_file
    create_copy_resources_script
    create_acknowledgements
    create_dummy_source
  end
end

Private Instance Methods

create_acknowledgements() click to toggle source

Generates the acknowledgement files (markdown and plist) for the target.

@return [void]

# File lib/pod/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 156
def create_acknowledgements
  basepath = target.acknowledgements_basepath
  Generator::Acknowledgements.generators.each do |generator_class|
    path = generator_class.path_from_basepath(basepath)
    file_accessors = target.pod_targets.map(&:file_accessors).flatten
    generator = generator_class.new(file_accessors)
    update_changed_file(generator, path)
    add_file_to_support_group(path)
  end
end
create_bridge_support_file() click to toggle source

Generates the bridge support metadata if requested by the {Podfile}.

@note The bridge support metadata is added to the resources of the

target because it is needed for environments interpreted at
runtime.

@return [void]

# File lib/pod/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 111
def create_bridge_support_file
  if target.podfile.generate_bridge_support?
    path = target.bridge_support_path
    headers = native_target.headers_build_phase.files.map { |bf| sandbox.root + bf.file_ref.path }
    generator = Generator::BridgeSupport.new(headers)
    update_changed_file(generator, path)
    add_file_to_support_group(path)
  end
end
create_copy_resources_script() click to toggle source

Creates a script that copies the resources to the bundle of the client target.

@note The bridge support file needs to be created before the prefix

header, otherwise it will not be added to the resources script.

@return [void]

# File lib/pod/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 129
def create_copy_resources_script
  path = target.copy_resources_script_path
  generator = Generator::CopyResourcesScript.new(target.resource_paths_by_config, target.platform)
  update_changed_file(generator, path)
  add_file_to_support_group(path)
end
create_embed_frameworks_script() click to toggle source

Creates a script that embeds the frameworks to the bundle of the client target.

@note We can't use Xcode default copy bundle resource phase, because

we need to ensure that we only copy the resources, which are
relevant for the current build configuration.

@return [void]

# File lib/pod/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 145
def create_embed_frameworks_script
  path = target.embed_frameworks_script_path
  generator = Generator::EmbedFrameworksScript.new(target.framework_paths_by_config)
  update_changed_file(generator, path)
  add_file_to_support_group(path)
end
create_support_files_group() click to toggle source

Creates the group that holds the references to the support files generated by this installer.

@return [void]

# File lib/pod/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 81
def create_support_files_group
  parent = project.support_files_group
  name = target.name
  dir = target.support_files_dir
  @support_files_group = parent.new_group(name, dir)
end
create_xcconfig_file() click to toggle source

Generates the contents of the xcconfig file and saves it to disk.

@return [void]

# File lib/pod/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 92
def create_xcconfig_file
  native_target.build_configurations.each do |configuration|
    path = target.xcconfig_path(configuration.name)
    gen = Generator::XCConfig::AggregateXCConfig.new(target, configuration.name)
    update_changed_file(gen, path)
    target.xcconfigs[configuration.name] = gen.xcconfig
    xcconfig_file_ref = add_file_to_support_group(path)
    configuration.base_configuration_reference = xcconfig_file_ref
  end
end
custom_build_settings() click to toggle source

Ensure that vendored static frameworks and libraries are not linked twice to the aggregate target, which shares the xcconfig of the user target.

Calls superclass method
# File lib/pod/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 55
def custom_build_settings
  settings = {
    'CODE_SIGN_IDENTITY[sdk=appletvos*]' => '',
    'CODE_SIGN_IDENTITY[sdk=iphoneos*]'  => '',
    'CODE_SIGN_IDENTITY[sdk=watchos*]'   => '',
    'MACH_O_TYPE'                        => 'staticlib',
    'OTHER_LDFLAGS'                      => '',
    'OTHER_LIBTOOLFLAGS'                 => '',
    'PODS_ROOT'                          => '$(SRCROOT)',
    'PRODUCT_BUNDLE_IDENTIFIER'          => 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}',
    'SKIP_INSTALL'                       => 'YES',

    # Needed to ensure that static libraries won't try to embed the swift stdlib,
    # since there's no where to embed in for a static library.
    # Not necessary for dynamic frameworks either, since the aggregate targets are never shipped
    # on their own, and are always further embedded into an app target.
    'ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES' => 'NO',
  }
  super.merge(settings)
end
target_definition() click to toggle source

@return [TargetDefinition] the target definition of the library.

# File lib/pod/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 47
def target_definition
  target.target_definition
end