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