lib/nerves.ex

defmodule Nerves do
  @elixir_version_req ">= 1.7.0"
  @otp_version_req ">= 21.0.0"

  def version, do: unquote(Mix.Project.config()[:version])
  def elixir_version, do: unquote(System.version())
  def otp_release, do: unquote(System.otp_release())

  def system_requirements(elixir_version \\ nil, otp_release \\ nil) do
    elixir_version = elixir_version || elixir_version()
    otp_release = otp_release || otp_release()

    with {:ok, otp_rel_version} <- Version.parse(otp_release <> ".0.0"),
         true <- Version.match?(elixir_version, @elixir_version_req),
         true <- Version.match?(otp_rel_version, @otp_version_req) do
      :ok
    else
      _ ->
        Nerves.Utils.Shell.warn("""
        Nerves #{version()} requires at least Elixir #{@elixir_version_req} and Erlang/OTP #{@otp_version_req}.

        Your system has Elixir #{elixir_version} and Erlang/OTP #{otp_release}.

        Please resolve this by either:

        1. Installing a compatible version of Elixir and Erlang/OTP

        2. Pinning your nerves and nerves_bootstrap dependencies to
           older versions.
        """)

        :error
    end
  end
end