class PhusionPassenger::Config::AgentCompiler

def after_install

def after_install
  super
  FileUtils.remove_entry_secure(@working_dir) if @owns_working_dir
end

def before_install

def before_install
  super
  if !@working_dir
    @working_dir = PhusionPassenger::Utils.mktmpdir("passenger-install.", PlatformInfo.tmpexedir)
    @owns_working_dir = true
  end
end

def check_source_code_available!

def check_source_code_available!
  if PhusionPassenger.build_system_dir.nil?
    puts "<red>Cannot compile agent binary</red>"
    puts
    puts "This #{PROGRAM_NAME} installation does not " +
      "come with any source code, so the agent binary cannot " +
      "be compiled. So instead, please try to download a " +
      "precompiled agent binary from the #{PROGRAM_NAME} website, " +
      "by running:\n\n" +
      "  <b>passenger-config download-agent</b>"
    abort
  end
end

def compile_agent

def compile_agent
  puts "<banner>Compiling #{PROGRAM_NAME} agent...</banner>"
  progress_bar = ProgressBar.new
  e_working_dir = Shellwords.escape(@working_dir)
  args = "#{e_working_dir}/support-binaries/#{AGENT_EXE}" +
    " CACHING=false" +
    " OUTPUT_DIR=#{e_working_dir} "
    " OPTIMIZE=#{!!@optimize}"
  begin
    progress_bar.set(0)
    Dir.chdir(PhusionPassenger.build_system_dir) do
      InstallationUtils.run_rake_task!(args) do |progress, total|
        progress_bar.set(0.05 + (progress / total.to_f) * 0.95)
      end
    end
    progress_bar.set(1)
  ensure
    progress_bar.finish
  end
  FileUtils.cp("#{@working_dir}/support-binaries/#{AGENT_EXE}",
    "#{@destdir}/#{AGENT_EXE}")
  puts "<green>Compilation finished!</green>"
end

def confirm_enable_optimizations

def confirm_enable_optimizations
  if @auto
    if @optimize
      puts "Compiling with optimizations."
    else
      puts "Not compiling with optimizations."
    end
  else
    if @optimize
      puts "Compiling with optimizations."
    else
      new_screen
      render_template 'config/agent_compiler/confirm_enable_optimizations',
        :total_ram => total_ram_gb
      puts
      @optimize = prompt_confirmation('Compile with optimizations?')
      puts
    end
  end
end

def dependencies

def dependencies
  specs = [
    'depcheck_specs/compiler_toolchain',
    'depcheck_specs/ruby',
    'depcheck_specs/gems',
    'depcheck_specs/libs',
    'depcheck_specs/utilities'
  ]
  ids = [
    'cc',
    'c++',
    'rake',
    'libcurl-dev',
    'openssl-dev',
    'zlib-dev'
  ].compact
  return [specs, ids]
end

def run_steps

def run_steps
  check_source_code_available!
  if !@force
    check_whether_os_is_broken
    check_whether_system_has_enough_ram
    InstallationUtils.check_for_download_tool!
  end
  check_dependencies(false) || abort
  puts
  @destdir = InstallationUtils.find_or_create_writable_support_binaries_dir!
  confirm_enable_optimizations
  compile_agent
end

def total_ram_gb

def total_ram_gb
  begin
    meminfo = File.read("/proc/meminfo")
    if meminfo =~ /^MemTotal: *(\d+) kB$/
      return sprintf("%.1f", $1.to_i / 1024 / 1024)
    end
  rescue Errno::ENOENT, Errno::EACCES
    # Don't do anything on systems without memory information.
    return nil
  end
end

def users_guide_path

def users_guide_path
  return PhusionPassenger.standalone_doc_path
end

def users_guide_url

def users_guide_url
  return STANDALONE_DOC_URL
end