defmodule FennecPrecompile.Precompiler do @typedoc """ Target triplets """ @type target :: String.t() @doc """ This callback should return the target triplet for current node. """ @callback current_target() :: {:ok, target} | {:error, String.t()} @doc """ This callback should return a list of triplets for all supported targets. """ @callback all_supported_targets() :: [target] @typedoc """ A map that contains detailed info of a precompiled artefact. - `:path`, path to the archived build artefact. - `:checksum_algo`, name of the checksum algorithm. - `:checksum`, the checksum of the archived build artefact using `:checksum_algo`. """ @type precompiled_artefact_detail :: %{:path => String.t(), :checksum => String.t(), :checksum_algo => atom} @typedoc """ A tuple that indicates the target and the corresponding precompiled artefact detail info. `{target, precompiled_artefact_detail}`. """ @type precompiled_artefact :: {target, precompiled_artefact_detail} @typedoc """ Command line arguments. """ @type cmd_args :: [String.t()] @doc """ This callback should precompile the library to the given target(s). Returns a list of `{target, acrhived_artefacts}` if successfully compiled. """ @callback precompile(cmd_args, [target]) :: {:ok, [precompiled_artefact]} | no_return defmacro __using__(_opts) do quote do @behaviour FennecPrecompile.Precompiler use Mix.Task @return if Version.match?(System.version(), "~> 1.9"), do: {:ok, []}, else: :ok def run(args) do with {:ok, _precompiled_artefacts} <- precompile(args, all_supported_targets()) do @return else error -> Logger.error("Error: #{inspect(error)}") end end end end end