module Xcodeproj::Project::ProjectHelper

def self.common_build_settings(type, platform, deployment_target = nil, target_product_type = nil)

Returns:
  • (Hash) - The common build settings

Parameters:
  • deployment_target (String) --
  • platform (Symbol) --
  • type (Symbol) --
def self.common_build_settings(type, platform, deployment_target = nil, target_product_type = nil)
  if target_product_type == Constants::PRODUCT_TYPE_UTI[:bundle]
    build_settings = {
      'PRODUCT_NAME' => '$(TARGET_NAME)',
      'WRAPPER_EXTENSION' => 'bundle',
      'SKIP_INSTALL' => 'YES'
    }
    if platform == :osx
      build_settings['COMBINE_HIDPI_IMAGES'] = 'YES'
      build_settings['SDKROOT'] = 'macosx'
    else
      build_settings['SDKROOT'] = 'iphoneos'
    end
    build_settings
  else
    common_settings = Constants::COMMON_BUILD_SETTINGS
    settings = deep_dup(common_settings[:all])
    settings.merge!(deep_dup(common_settings[type]))
    settings.merge!(deep_dup(common_settings[platform]))
    settings.merge!(deep_dup(common_settings[[platform, type]]))
    if deployment_target
      if platform == :ios
        settings['IPHONEOS_DEPLOYMENT_TARGET'] = deployment_target
      elsif platform == :osx
        settings['MACOSX_DEPLOYMENT_TARGET'] = deployment_target
      end
    end
    settings
  end
end

def self.configuration_list(project, platform, deployment_target = nil)

Returns:
  • (XCConfigurationList) - the generated configuration list.

Parameters:
  • deployment_target (String) --
  • platform (Symbol) --
  • project (Project) --
def self.configuration_list(project, platform, deployment_target = nil)
  cl = project.new(XCConfigurationList)
  cl.default_configuration_is_visible = '0'
  cl.default_configuration_name = 'Release'
  release_conf = project.new(XCBuildConfiguration)
  release_conf.name = 'Release'
  release_conf.build_settings = common_build_settings(:release, platform, deployment_target)
  debug_conf = project.new(XCBuildConfiguration)
  debug_conf.name = 'Debug'
  debug_conf.build_settings = common_build_settings(:debug, platform, deployment_target)
  cl.build_configurations << release_conf
  cl.build_configurations << debug_conf
  cl
end

def self.deep_dup(object)

Returns:
  • (Object) - The deeply copy of the obejct object.

Parameters:
  • object (Object) --
def self.deep_dup(object)
  case object
  when Hash
    new_hash = {}
    object.each do |key, value|
      new_hash[key] = deep_dup(value)
    end
    new_hash
  when Array
    object.map { |value| deep_dup(value) }
  else
    object.dup
  end
end

def self.new_resources_bundle(project, name, platform, product_group)

Returns:
  • (PBXNativeTarget) - the target.

Parameters:
  • platform (Symbol) --
  • name (String) --
  • project (Project) --
def self.new_resources_bundle(project, name, platform, product_group)
  # Target
  target = project.new(PBXNativeTarget)
  project.targets << target
  target.name = name
  target.product_name = name
  target.product_type = Constants::PRODUCT_TYPE_UTI[:bundle]
  build_settings = common_build_settings(nil, platform, nil, target.product_type)
  # Configuration List
  cl = project.new(XCConfigurationList)
  cl.default_configuration_is_visible = '0'
  cl.default_configuration_name = 'Release'
  release_conf = project.new(XCBuildConfiguration)
  release_conf.name = 'Release'
  release_conf.build_settings = build_settings
  debug_conf = project.new(XCBuildConfiguration)
  debug_conf.name = 'Debug'
  debug_conf.build_settings = build_settings
  cl.build_configurations << release_conf
  cl.build_configurations << debug_conf
  cl
  target.build_configuration_list = cl
  # Product
  product = product_group.new_bundle(name)
  target.product_reference = product
  # Build phases
  target.build_phases << project.new(PBXSourcesBuildPhase)
  target.build_phases << project.new(PBXFrameworksBuildPhase)
  target.build_phases << project.new(PBXResourcesBuildPhase)
  target
end

def self.new_target(project, type, name, platform, deployment_target, product_group)

Returns:
  • (PBXNativeTarget) - the target.

Parameters:
  • deployment_target (String) --
  • platform (Symbol) --
  • name (String) --
  • type (Symbol) --
  • project (Project) --
def self.new_target(project, type, name, platform, deployment_target, product_group)
  # Target
  target = project.new(PBXNativeTarget)
  project.targets << target
  target.name = name
  target.product_name = name
  target.product_type = Constants::PRODUCT_TYPE_UTI[type]
  target.build_configuration_list = configuration_list(project, platform, deployment_target)
  # Product
  product = product_group.new_product_ref_for_target(name, type)
  target.product_reference = product
  # Build phases
  target.build_phases << project.new(PBXSourcesBuildPhase)
  target.build_phases << project.new(PBXFrameworksBuildPhase)
  # Frameworks
  framework_name = (platform == :ios) ? 'Foundation' : 'Cocoa'
  framework_ref = target.add_system_framework(framework_name)
  target
end