defmodule Mix.Tasks.Compile.FennecPrecompile do
@moduledoc """
Drop-in replacement of `:elixir_make`
"""
use Mix.Task
@user_config Application.compile_env(:fennec_precompile, :config, [])
@return if Version.match?(System.version(), "~> 1.9"), do: {:ok, []}, else: :ok
def run(args) do
app = get_app_name()
config =
Mix.Project.config()
|> Keyword.merge(Keyword.get(@user_config, app, []), fn _key, _mix, user_config -> user_config end)
|> FennecPrecompile.Config.new()
if config.force_build == true do
Mix.Tasks.Fennec.Precompile.build_native(args)
else
FennecPrecompile.write_metadata_to_file(config)
priv_dir = Path.join([Mix.Project.app_path(), "priv"])
load_path = "#{priv_dir}/#{config.nif_filename}.so"
with {:skip_if_exists, false} <- {:skip_if_exists, File.exists?(load_path)},
{:error, precomp_error} <- FennecPrecompile.download_or_reuse_nif_file(config) do
message = """
Error while downloading precompiled NIF: #{precomp_error}.
You can force the project to build from scratch with:
mix fennec.precompile
"""
{:error, message}
else
_ -> {:ok, config}
end
end
@return
end
defp get_app_name() do
System.get_env("FENNEC_PRECOMPILE_OTP_APP", "#{Mix.Project.config()[:app]}")
|> String.to_atom()
end
end