class XcodeArchiveCache::Injection::BuildFlagsChanger

Constants

FRAMEWORK_SEARCH_PATHS_KEY
HEADER_SEARCH_PATHS_KEY
INHERITED_SETTINGS_VALUE
LIBRARY_SEARCH_PATHS_KEY
MODULE_MAP_FLAG
OTHER_CFLAGS_KEY
OTHER_CPLUSPLUSFLAGS_KEY
OTHER_LDFLAGS_KEY
OTHER_LIBTOOLFLAGS_KEY
OTHER_SWIFT_FLAGS_KEY
SWIFT_INCLUDE_PATHS_KEY

Public Instance Methods

add_capital_i_path(build_configuration, path) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [String] path

# File lib/injection/build_flags_changer.rb, line 93
def add_capital_i_path(build_configuration, path)
  debug("using -I path #{path}")
  add_cflag(build_configuration, path_to_capital_i(path))
end
add_framework_headers_iquote(build_configuration, artifact_location, node) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [String] artifact_location @param [XcodeArchiveCache::BuildGraph::Node] node

# File lib/injection/build_flags_changer.rb, line 60
def add_framework_headers_iquote(build_configuration, artifact_location, node)
  headers_search_path = get_framework_headers_iquote(artifact_location, node)
  debug("using -iquote path #{headers_search_path}")
  add_cflag(build_configuration, headers_search_path)
end
add_framework_linker_flag(build_configuration, node) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [XcodeArchiveCache::BuildGraph::Node] node

# File lib/injection/build_flags_changer.rb, line 18
def add_framework_linker_flag(build_configuration, node)
  linker_flag = get_framework_linker_flag(node)
  if linker_flag
    debug("using linker flag #{linker_flag}")
    add_linker_flag(build_configuration, linker_flag)
  end
end
add_headers_search_path(build_configuration, path) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [String] path

# File lib/injection/build_flags_changer.rb, line 77
def add_headers_search_path(build_configuration, path)
  debug("using headers search path #{path}")
  add_flag_to_configuration(build_configuration, HEADER_SEARCH_PATHS_KEY, path)
end
add_iquote_path(build_configuration, path) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [String] path

# File lib/injection/build_flags_changer.rb, line 85
def add_iquote_path(build_configuration, path)
  debug("using -iquote path #{path}")
  add_cflag(build_configuration, path_to_iquote(path))
end
add_static_lib_libtool_flag(build_configuration, node) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [XcodeArchiveCache::BuildGraph::Node] node

# File lib/injection/build_flags_changer.rb, line 40
def add_static_lib_libtool_flag(build_configuration, node)
  flag = get_linker_flag(node)
  if flag
    debug("using libtool flag #{flag}")
    add_libtool_flag(build_configuration, flag)
  end
end
add_static_lib_linker_flag(build_configuration, node) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [XcodeArchiveCache::BuildGraph::Node] node

# File lib/injection/build_flags_changer.rb, line 29
def add_static_lib_linker_flag(build_configuration, node)
  flag = get_linker_flag(node)
  if flag
    debug("using ld flag #{flag}")
    add_linker_flag(build_configuration, flag)
  end
end
add_swift_include_path(build_configuration, path) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [String] path

# File lib/injection/build_flags_changer.rb, line 51
def add_swift_include_path(build_configuration, path)
  debug("adding #{path} to SWIFT_INCLUDE_PATHS")
  add_flag_to_configuration(build_configuration, SWIFT_INCLUDE_PATHS_KEY, path_to_search_path(path))
end
fix_module_map_path(build_configuration, old_modulemap_names, path) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [Array<String>] old_modulemap_names @param [String] path

# File lib/injection/build_flags_changer.rb, line 102
def fix_module_map_path(build_configuration, old_modulemap_names, path)
  debug("using #{path}")

  settings_with_modulemaps = [OTHER_CFLAGS_KEY, OTHER_CPLUSPLUSFLAGS_KEY, OTHER_SWIFT_FLAGS_KEY]
  replace_or_add_flag(build_configuration, settings_with_modulemaps, MODULE_MAP_FLAG, old_modulemap_names, path_to_search_path(path), false)
end
replace_or_add_framework_search_path(build_configuration, target_name, path) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [String] path

# File lib/injection/build_flags_changer.rb, line 10
def replace_or_add_framework_search_path(build_configuration, target_name, path)
  debug("using framework search path #{path}")
  replace_or_add_flag(build_configuration, [FRAMEWORK_SEARCH_PATHS_KEY], nil, [target_name], path_to_search_path(path), true)
end
replace_or_add_library_search_path(build_configuration, target_name, path) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [String] path

# File lib/injection/build_flags_changer.rb, line 69
def replace_or_add_library_search_path(build_configuration, target_name, path)
  debug("using library search path #{path}")
  replace_or_add_flag(build_configuration, [LIBRARY_SEARCH_PATHS_KEY], nil, [target_name], path_to_search_path(path), true)
end

Private Instance Methods

add_cflag(build_configuration, flag) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [String] flag

# File lib/injection/build_flags_changer.rb, line 141
def add_cflag(build_configuration, flag)
  add_flag_to_configuration(build_configuration, OTHER_CFLAGS_KEY, flag)
end
add_flag(flags, new_flag) click to toggle source

@param [Object] flags @param [String] new_flag

@return [Array<String>]

# File lib/injection/build_flags_changer.rb, line 159
def add_flag(flags, new_flag)
  if flags && flags.length > 0
    if flags.is_a?(String)
      flags = [flags, new_flag]
    elsif flags.is_a?(Array)
      flags += [new_flag] unless flags.include?(new_flag)
    else
      raise StandardError.new, "Flags value is neither string nor array: #{flags.class}"
    end
  else
    flags = [INHERITED_SETTINGS_VALUE, new_flag]
  end

  flags
end
add_flag_to_configuration(build_configuration, key, flag) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [String] key @param [String] flag

# File lib/injection/build_flags_changer.rb, line 149
def add_flag_to_configuration(build_configuration, key, flag)
  flags = build_configuration.build_settings[key]
  build_configuration.build_settings[key] = add_flag(flags, flag)
end
add_libtool_flag(build_configuration, flag) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [String] flag

# File lib/injection/build_flags_changer.rb, line 134
def add_libtool_flag(build_configuration, flag)
  add_flag_to_configuration(build_configuration, OTHER_LIBTOOLFLAGS_KEY, flag)
end
add_linker_flag(build_configuration, flag) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [String] flag

# File lib/injection/build_flags_changer.rb, line 127
def add_linker_flag(build_configuration, flag)
  add_flag_to_configuration(build_configuration, OTHER_LDFLAGS_KEY, flag)
end
get_framework_headers_iquote(path, node) click to toggle source

@param [String] path @param [XcodeArchiveCache::BuildGraph::Node] node

@return [String]

# File lib/injection/build_flags_changer.rb, line 188
def get_framework_headers_iquote(path, node)
  if node.has_framework_product?
    headers_dir_path = File.join(path, node.product_file_name, "Headers")
    path_to_iquote(headers_dir_path)
  end
end
get_framework_linker_flag(node) click to toggle source

@param [XcodeArchiveCache::BuildGraph::Node] node

@return [String]

Something.framework -> -framework "Something"
# File lib/injection/build_flags_changer.rb, line 217
def get_framework_linker_flag(node)
  return unless node.product_file_name

  framework_name = File.basename(node.product_file_name, File.extname(node.product_file_name))
  return unless framework_name

  "-framework \"#{framework_name}\""
end
get_full_flag_value(flag_name, value) click to toggle source
# File lib/injection/build_flags_changer.rb, line 339
def get_full_flag_value(flag_name, value)
  "#{flag_name}#{value}"
end
get_linker_flag(node) click to toggle source

@param [XcodeArchiveCache::BuildGraph::Node] node

@return [String]

libSomething.a -> -lSomething
# File lib/injection/build_flags_changer.rb, line 232
def get_linker_flag(node)
  return unless node.product_file_name

  node.product_file_name.gsub(/^lib/, "-l").gsub(/\.a$/, "")
end
path_to_capital_i(path) click to toggle source

@param [String] path

@return [Stirng]

# File lib/injection/build_flags_changer.rb, line 207
def path_to_capital_i(path)
  "-I\"#{path}\""
end
path_to_iquote(path) click to toggle source

@param [String] path

@return [String]

# File lib/injection/build_flags_changer.rb, line 199
def path_to_iquote(path)
  "-iquote \"#{path}\""
end
path_to_search_path(path) click to toggle source

@param [String] path

@return [String]

# File lib/injection/build_flags_changer.rb, line 179
def path_to_search_path(path)
  "\"#{path}\""
end
replace_flag_value(attributes, setting_key, flag_name, possible_old_values, new_value) click to toggle source

@param [Hash] attributes @param [String] setting_key @param [String] flag_name @param [Array<String>] possible_old_values @param [String] new_value

# File lib/injection/build_flags_changer.rb, line 304
def replace_flag_value(attributes, setting_key, flag_name, possible_old_values, new_value)
  build_settings = attributes[setting_key]
  return unless build_settings

  replaced = false
  is_string = build_settings.is_a?(String)
  build_settings = build_settings.split(" ") if is_string
  full_value = get_full_flag_value(flag_name, new_value)
  old_value_regexps = possible_old_values.map { |value| Regexp.new("/#{value}\"*$") }

  updated_settings = build_settings
                      .map { |line| line.split(" ") }
                      .flatten
                      .map do |line|
    if flag_name
      next line unless line.include?(flag_name)
    end

    updated_line = line

    old_value_regexps.each do |regexp|
      if regexp.match?(line)
        replaced = true
        updated_line = full_value
        break
      end
    end

    updated_line
  end

  attributes[setting_key] = is_string ? updated_settings.join(" ") : updated_settings
  replaced
end
replace_flag_value_in_xcconfig_recursively(xcconfig_path, project_dir, setting_keys, flag_name, possible_old_values, new_value) click to toggle source

@param [String] xcconfig_path @param [String] project_dir @param [Array<String>] setting_keys @param [String] flag_name @param [Array<String>] possible_old_values @param [String] new_value

# File lib/injection/build_flags_changer.rb, line 277
def replace_flag_value_in_xcconfig_recursively(xcconfig_path, project_dir, setting_keys, flag_name, possible_old_values, new_value)
  debug("changing #{possible_old_values} to #{new_value} in #{File.basename(xcconfig_path)}")
  return unless File.exist?(xcconfig_path)

  replaced = false
  xcconfig = Xcodeproj::Config.new(xcconfig_path)

  setting_keys.each do |key|
    replaced = replace_flag_value(xcconfig.attributes, key, flag_name, possible_old_values, new_value) || replaced
  end

  xcconfig.save_as(Pathname.new(xcconfig_path))

  xcconfig.includes.each do |included_xcconfig|
    included_xcconfig_path = File.join(project_dir, included_xcconfig)
    replaced = replace_flag_value_in_xcconfig_recursively(included_xcconfig_path, project_dir, setting_keys, flag_name, possible_old_values, new_value) || replaced
  end

  replaced
end
replace_or_add_flag(build_configuration, setting_keys, flag_name, possible_old_values, new_value, add_if_missing) click to toggle source

@param [Xcodeproj::Project::Object::XCBuildConfiguration] build_configuration @param [Array<String>] setting_keys @param [String] flag_name @param [Array<String>] possible_old_values @param [String] new_value

# File lib/injection/build_flags_changer.rb, line 244
def replace_or_add_flag(build_configuration, setting_keys, flag_name, possible_old_values, new_value, add_if_missing)
  replaced = false

  setting_keys.each do |setting|
    replaced = replace_flag_value(build_configuration.build_settings, setting, flag_name, possible_old_values, new_value) || replaced
  end

  if build_configuration.has_xcconfig?
    replaced = replace_flag_value_in_xcconfig_recursively(
      build_configuration.get_xcconfig_path,
      build_configuration.get_project_dir,
      setting_keys,
      flag_name,
      possible_old_values,
      new_value) || replaced
  end

  if !replaced && add_if_missing
    full_value = get_full_flag_value(flag_name, new_value)

    setting_keys.each do |setting|
      add_flag_to_configuration(build_configuration, setting, full_value)
    end
  end
end