class FrameworkGenerate::Target

Attributes

bundle_id[RW]
dependencies[RW]
enable_code_coverage[RW]
environment_variables[RW]
exclude_files[RW]
header[RW]
include_files[RW]
info_plist[RW]
is_safe_for_extensions[RW]
language[RW]
launch_arguments[RW]
name[RW]
platforms[RW]
post_build_scripts[RW]
pre_build_scripts[RW]
resource_files[RW]
test_target[RW]
type[RW]

Public Class Methods

new(name = nil, platforms = nil, language = nil, info_plist = nil, bundle_id = nil, header = nil, include_files = nil, exclude_files = nil, resource_files = nil, dependencies = nil, type = :framework, pre_build_scripts = nil, post_build_scripts = nil, test_target = nil, is_safe_for_extensions = false, enable_code_coverage = false, launch_arguments = nil, environment_variables = nil) { |self| ... } click to toggle source
# File lib/framework-generate/target.rb, line 8
def initialize(name = nil, platforms = nil, language = nil, info_plist = nil, bundle_id = nil, header = nil, include_files = nil, exclude_files = nil, resource_files = nil, dependencies = nil, type = :framework, pre_build_scripts = nil, post_build_scripts = nil, test_target = nil, is_safe_for_extensions = false, enable_code_coverage = false, launch_arguments = nil, environment_variables = nil)
  @name = name
  @platforms = platforms
  @language = language
  @info_plist = info_plist
  @bundle_id = bundle_id
  @header = header
  @include_files = include_files
  @exclude_files = exclude_files
  @resource_files = resource_files
  @dependencies = dependencies
  @type = type
  @pre_build_scripts = pre_build_scripts
  @post_build_scripts = post_build_scripts
  @test_target = test_target
  @is_safe_for_extensions = is_safe_for_extensions
  @enable_code_coverage = enable_code_coverage
  @launch_arguments = launch_arguments
  @environment_variables = environment_variables

  yield(self) if block_given?
end

Public Instance Methods

add_build_scripts(target, scripts) click to toggle source
# File lib/framework-generate/target.rb, line 251
def add_build_scripts(target, scripts)
  return if scripts.nil?

  scripts.each do |script|
    build_phase = target.new_shell_script_build_phase(script.name)
    build_phase.shell_script = script.script
    build_phase.input_paths = script.inputs
  end
end
add_dependencies(project, target) click to toggle source
# File lib/framework-generate/target.rb, line 158
def add_dependencies(project, target)
  return if @dependencies.nil?

  dependency_names = @dependencies.map do |dependency|
    append_framework_extension(dependency)
  end

  frameworks = dependency_names.reject do |name|
    !project.products.any? { |x| x.path == name }
  end

  frameworks = frameworks.map do |name|
    project.products.find { |x| x.path == name }
  end

  frameworks.each do |path|
    target.frameworks_build_phase.add_file_reference(path, true)
  end
end
add_environment_variables(launch_action) click to toggle source
# File lib/framework-generate/target.rb, line 279
def add_environment_variables(launch_action)
  return if @environment_variables.nil?

  environment_variables = @environment_variables.map do |key, value|
    { key: key, value: value, enabled: true }
  end

  launch_action.environment_variables = Xcodeproj::XCScheme::EnvironmentVariables.new(environment_variables)
end
add_framework_header(project, target) click to toggle source
# File lib/framework-generate/target.rb, line 91
def add_framework_header(project, target)
  return if @header.nil?
  header_path = @header
  header_file_group = find_group(project, header_path)
  header_file = header_file_group.new_reference(header_path)
  header_build_file = target.headers_build_phase.add_file_reference(header_file, true)
  header_build_file.settings ||= {}
  header_build_file.settings['ATTRIBUTES'] = ['Public']
end
add_framework_to_copy_phase(project, build_phase) click to toggle source
# File lib/framework-generate/target.rb, line 216
def add_framework_to_copy_phase(project, build_phase)
  return if @dependencies.nil?

  dependency_names = @dependencies.map do |dependency|
    append_framework_extension(dependency)
  end

  frameworks = dependency_names.reject do |name|
    project.products.any? { |x| x.path == name }
  end

  frameworks.each do |path|
    build_phase.input_paths << path
  end
end
add_info_plist(project) click to toggle source
# File lib/framework-generate/target.rb, line 101
def add_info_plist(project)
  info_plist_path = @info_plist
  info_plist_group = find_group(project, info_plist_path)
  has_info_plist = info_plist_group.find_file_by_path(info_plist_path)

  info_plist_group.new_reference(@info_plist) unless has_info_plist
end
add_launch_arguments(launch_action) click to toggle source
# File lib/framework-generate/target.rb, line 269
def add_launch_arguments(launch_action)
  return if @launch_arguments.nil?

  command_line_arguments = @launch_arguments.map do |launch_arguement|
    { argument: launch_arguement, enabled: true }
  end

  launch_action.command_line_arguments = Xcodeproj::XCScheme::CommandLineArguments.new(command_line_arguments)
end
add_post_build_scripts(target) click to toggle source
# File lib/framework-generate/target.rb, line 265
def add_post_build_scripts(target)
  add_build_scripts(target, @post_build_scripts)
end
add_pre_build_scripts(target) click to toggle source
# File lib/framework-generate/target.rb, line 261
def add_pre_build_scripts(target)
  add_build_scripts(target, @pre_build_scripts)
end
add_resource_files(project, target) click to toggle source
# File lib/framework-generate/target.rb, line 232
def add_resource_files(project, target)
  return if @resource_files.nil?

  files = @resource_files.map do |files|
    Dir[files]
  end

  files.each do |file_directory|
    file_directory.each do |path|
      file_group = find_group(project, path)
      has_file = file_group.find_file_by_path(path)
      unless has_file
        file = file_group.new_reference(path)
        target.resources_build_phase.add_file_reference(file, true)
      end
    end
  end
end
add_source_files(project, target) click to toggle source
# File lib/framework-generate/target.rb, line 125
def add_source_files(project, target)
  exclude_files = if @exclude_files.nil?
                    []
                  else
                    @exclude_files.map do |files|
                      Dir[files]
                    end
                  end

  source_files = @include_files.map do |files|
    Dir[files].reject do |path|
      reject_excluded_files(exclude_files, path)
    end
  end

  source_files.each do |file_directory|
    file_directory.each do |path|
      source_file_group = find_group(project, path)
      has_source_file = source_file_group.find_file_by_path(path)
      unless has_source_file
        source_file = source_file_group.new_reference(path)
        target.source_build_phase.add_file_reference(source_file, true)
      end
    end
  end
end
add_supporting_files(project, target) click to toggle source
# File lib/framework-generate/target.rb, line 109
def add_supporting_files(project, target)
  add_info_plist(project)
  return if target.test_target_type?
  add_framework_header(project, target)
end
append_framework_extension(framework) click to toggle source
# File lib/framework-generate/target.rb, line 152
def append_framework_extension(framework)
  return framework if File.extname(framework) == '.framework'

  "#{framework}.framework"
end
copy_carthage_frameworks(project, build_phase, scripts_directory) click to toggle source
# File lib/framework-generate/target.rb, line 178
def copy_carthage_frameworks(project, build_phase, scripts_directory)
  script_file_name = 'copy-carthage-frameworks.sh'
  script_file_path = File.join(File.dirname(__FILE__), script_file_name)

  if scripts_directory.nil?
    script_file = File.open(script_file_path)

    build_phase.shell_script = script_file.read

    script_file.close
  else
    script_path = File.join(Dir.pwd, scripts_directory, script_file_name)
    dirname = File.dirname(script_path)
    FileUtils.mkdir_p(dirname) unless File.directory?(dirname)

    FileUtils.cp(script_file_path, script_path, preserve: true)

    xcode_path = File.join('${SRCROOT}', scripts_directory, script_file_name)
    build_phase.shell_script = " exec \"#{xcode_path}\""
  end

  add_framework_to_copy_phase(project, build_phase)
end
create(project, language, scripts_directory) click to toggle source
# File lib/framework-generate/target.rb, line 289
def create(project, language, scripts_directory)
  name = @name
  type = @type

  # Target
  target = project.new(Xcodeproj::Project::Object::PBXNativeTarget)
  project.targets << target
  target.name = name
  target.product_name = name
  target.product_type = Xcodeproj::Constants::PRODUCT_TYPE_UTI[type]
  target.build_configuration_list = Xcodeproj::Project::ProjectHelper.configuration_list(project, :osx, nil, type, language.type)

  has_frameworks = third_party_frameworks?(project)

  # Pre build script
  add_pre_build_scripts(target)

  add_supporting_files(project, target)
  add_source_files(project, target)

  target.build_configurations.each do |configuration|
    target_build_settings(configuration.build_settings, has_frameworks)
  end

  # Product
  product = project.products_group.new_product_ref_for_target(name, type)
  target.product_reference = product

  # Build phases

  target.build_phases << project.new(Xcodeproj::Project::Object::PBXResourcesBuildPhase)
  target.build_phases << project.new(Xcodeproj::Project::Object::PBXFrameworksBuildPhase)

  # Post build script
  add_post_build_scripts(target)

  # Dependencies
  add_dependencies(project, target)

  # Resource files
  add_resource_files(project, target)

  # Copy frameworks to test target
  if target.test_target_type? && has_frameworks
    build_phase = target.new_shell_script_build_phase('Copy Carthage Frameworks')
    copy_carthage_frameworks(project, build_phase, scripts_directory)
  end

  target
end
find_group(project, path) click to toggle source
# File lib/framework-generate/target.rb, line 86
def find_group(project, path)
  folder_path = File.dirname(path)
  project.main_group.find_subpath(folder_path, true)
end
reject_excluded_files(exclude_files, path) click to toggle source
# File lib/framework-generate/target.rb, line 115
def reject_excluded_files(exclude_files, path)
  exclude_files.each do |files_to_exclude|
    files_to_exclude.each do |file_to_exclude|
      return true if File.fnmatch(file_to_exclude, path)
    end
  end

  false
end
target_build_settings(settings, has_frameworks) click to toggle source
# File lib/framework-generate/target.rb, line 35
def target_build_settings(settings, has_frameworks)
  settings.delete('CODE_SIGN_IDENTITY')
  settings.delete('CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING')
  settings.delete('CLANG_WARN_COMMA')
  settings.delete('CLANG_WARN_NON_LITERAL_NULL_CONVERSION')
  settings.delete('CLANG_WARN_OBJC_LITERAL_CONVERSION')
  settings.delete('CLANG_WARN_RANGE_LOOP_ANALYSIS')
  settings.delete('CLANG_WARN_STRICT_PROTOTYPES')

  settings['INFOPLIST_FILE'] = @info_plist
  settings['PRODUCT_BUNDLE_IDENTIFIER'] = @bundle_id
  settings['APPLICATION_EXTENSION_API_ONLY'] = @is_safe_for_extensions ? 'YES' : 'NO'
  settings['SUPPORTED_PLATFORMS'] = FrameworkGenerate::Platform.supported_platforms(@platforms)

  macos = FrameworkGenerate::Platform.find_platform(@platforms, :macos)
  unless macos.nil?
    settings['MACOSX_DEPLOYMENT_TARGET'] = FrameworkGenerate::Platform.deployment_target(macos)
    if has_frameworks
      settings['FRAMEWORK_SEARCH_PATHS[sdk=macosx*]'] = FrameworkGenerate::Platform.search_paths(macos)
    end
  end

  ios = FrameworkGenerate::Platform.find_platform(@platforms, :ios)
  unless ios.nil?
    settings['IPHONEOS_DEPLOYMENT_TARGET'] = FrameworkGenerate::Platform.deployment_target(ios)
    if has_frameworks
      settings['FRAMEWORK_SEARCH_PATHS[sdk=iphone*]'] = FrameworkGenerate::Platform.search_paths(ios)
    end
  end

  watchos = FrameworkGenerate::Platform.find_platform(@platforms, :watchos)
  unless watchos.nil?
    settings['WATCHOS_DEPLOYMENT_TARGET'] = FrameworkGenerate::Platform.deployment_target(watchos)
    if has_frameworks
      settings['FRAMEWORK_SEARCH_PATHS[sdk=watch*]'] = FrameworkGenerate::Platform.search_paths(watchos)
    end
  end

  tvos = FrameworkGenerate::Platform.find_platform(@platforms, :tvos)
  unless tvos.nil?
    settings['TVOS_DEPLOYMENT_TARGET'] = FrameworkGenerate::Platform.deployment_target(tvos)
    if has_frameworks
      settings['FRAMEWORK_SEARCH_PATHS[sdk=appletv*]'] = FrameworkGenerate::Platform.search_paths(tvos)
    end
  end

  settings['SWIFT_VERSION'] = @language.version

  settings
end
third_party_frameworks?(project) click to toggle source
# File lib/framework-generate/target.rb, line 202
def third_party_frameworks?(project)
  return if @dependencies.nil?

  dependency_names = @dependencies.map do |dependency|
    append_framework_extension(dependency)
  end

  frameworks = dependency_names.reject do |name|
    project.products.any? { |x| x.path == name }
  end

  frameworks.length > 0
end
to_s() click to toggle source
# File lib/framework-generate/target.rb, line 31
def to_s
  "Target<#{name}, #{info_plist}, #{bundle_id}, #{header}, #{include_files}, #{exclude_files}, #{dependencies}, #{type}, #{test_target}, #{is_safe_for_extensions}, #{enable_code_coverage}>"
end