lib/mix/tasks/compile/appup.ex

defmodule Mix.Tasks.Compile.Appup do
  @moduledoc """
  Compiles appup files into the application's ebin folder.
  """
  @shortdoc "Compiles appup files"
  use Mix.Task.Compiler


  @recursive true

  @impl true
  def run(_args) do
    if src = Mix.Project.config[:appup] do
      if File.exists?(src) do
        {appup, []} = Code.eval_file(src)
        dst = Path.join(Mix.Project.compile_path(), "#{Mix.Project.config[:app]}.appup")
        File.write(dst, :io_lib.format('~tp.~n', [appup]))
      else
        {:ok, diagnostic(:warning, "Appup file not found: #{src}")}
      end
    else
      {:ok, diagnostic(:warning, "No appup specified in project")}
    end
  end

  defp diagnostic(severity, message, file \\ Mix.Project.project_file) do
    %Mix.Task.Compiler.Diagnostic{compiler_name: "Appup", file: file, position: nil, severity: severity, message: message}
  end

end