class Pod::Installer::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 [TargetInstallationResult] the result of the installation of this target.

# File lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 13
def install!
  UI.message "- Installing target `#{target.name}` #{target.platform}" do
    native_target = add_target
    create_support_files_dir
    create_support_files_group
    create_xcconfig_file(native_target)
    if target.requires_frameworks?
      create_info_plist_file(target.info_plist_path, native_target, target.version, target.platform)
      create_module_map(native_target)
      create_umbrella_header(native_target)
    elsif target.uses_swift?
      create_module_map(native_target)
      create_umbrella_header(native_target)
    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(native_target)
    create_copy_resources_script
    create_acknowledgements
    create_dummy_source(native_target)
    clean_support_files_temp_dir
    TargetInstallationResult.new(target, native_target)
  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/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 165
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(native_target) 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.

@param [PBXNativeTarget] native_target

the native target to add the bridge support file into.

@return [void]

# File lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 120
def create_bridge_support_file(native_target)
  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/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 138
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/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 154
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/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 83
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(native_target) click to toggle source

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

@param [PBXNativeTarget] native_target

the native target to link the module map file into.

@return [void]

# File lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 97
def create_xcconfig_file(native_target)
  native_target.build_configurations.each do |configuration|
    next unless target.user_build_configurations.key?(configuration.name)
    path = target.xcconfig_path(configuration.name)
    build_settings = target.build_settings(configuration.name)
    update_changed_file(build_settings, path)
    target.xcconfigs[configuration.name] = build_settings.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/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 57
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/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb, line 49
def target_definition
  target.target_definition
end