class CarthageSupport::CLI

Public Instance Methods

setup() click to toggle source
# File lib/carthage_support/cli.rb, line 21
def setup()
  begin
    
    repos = []
    frameworks = []
    project = nil
    
    yaml = Hashie::Mash.load("carthage.yml")
    yaml.each_with_index do |obj,i|
      if obj.first == "project_path"
        project = Xcodeproj::Project.open(obj.last)
      else
        repos.push(obj.first)
        obj.last.each do |fw,j|
          frameworks.push(fw)
        end
      end
    end

    if project.nil?
      raise "projectfile is not"
    end

    ## Create Cartfile
    File.write("Cartfile", repos.join("\n"))

    ## Framework Search Paths
    project.targets.each do |target|
      target.build_configuration_list.build_configurations.each do |config|
        paths = target.build_settings(config.name)["FRAMEWORK_SEARCH_PATHS"]
        path_carthage = "$(PROJECT_DIR)/Carthage/Build/iOS"
        if paths.nil?
          paths = ['$(inherited)', path_carthage]
        else
          unless paths.include?(path_carthage)
            paths.push(path_carthage)
          end
        end
        target.build_settings(config.name)["FRAMEWORK_SEARCH_PATHS"] = paths
      end
    end

    ## Run Script
    project.targets.each do |target|
      exists_build_phase = false
      target.build_phases.each do |build_phase|
        if shell_script_phase?(build_phase)
          exists_build_phase = true
        end
      end
      if !exists_build_phase
        build_phase = project.new(Xcodeproj::Project::Object::PBXShellScriptBuildPhase)
        build_phase.name = BUILD_PHASE_NAME
        build_phase.shell_path = "/bin/sh"
        build_phase.shell_script = "/usr/local/bin/carthage copy-frameworks\n"
        build_phase.input_paths = []
        target.build_phases << build_phase
      end
    end

    project.targets.each do |target|
      target.build_phases.each do |build_phase|
        if shell_script_phase?(build_phase)
          frameworks.each do |framework|
            framework_path = "$(SRCROOT)/Carthage/Build/iOS/" + framework
            unless build_phase.input_paths.include?(framework_path)
              build_phase.input_paths.push(framework_path)
            end
          end
        end
      end
    end

    ## Linked Frameworks and Libraries
    project.targets.each do |target|
      target.build_phases.each do |build_phase|
        if build_phase.isa == "PBXFrameworksBuildPhase"
          build_phase.files_references.each do |ref|
            unless ref.name.nil?
              if ref.name.include?("Carthage_")
                build_phase.remove_file_reference(ref)
              end
            end
          end
        end
      end
    end
    
    project.targets.each do |target|
      target.build_phases.each do |build_phase|
        if build_phase.isa == "PBXFrameworksBuildPhase"
          frameworks.each do |framework|
            framework_ref = project.new(Xcodeproj::Project::Object::PBXFileReference)
            framework_ref.name = "Carthage_" + framework
            framework_ref.path = "Carthage/Build/iOS/" + framework

            count = build_phase.files_references.count{|ref| ref.name == "Carthage_" + framework && framework_ref.path == ref.path }
            if count == 0
              build_phase.add_file_reference(framework_ref, false)
            end
          end
        end
      end
    end

    project.save()
    
  rescue => e
    p e
  end
  
end