defmodule Kinda.Precompiler do
@behaviour ElixirMake.Precompiler
def current_target({:unix, _}) do
# get current target triplet from `:erlang.system_info/1`
system_architecture = to_string(:erlang.system_info(:system_architecture))
current = String.split(system_architecture, "-", trim: true)
case length(current) do
4 ->
{:ok, "#{Enum.at(current, 0)}-#{Enum.at(current, 2)}-#{Enum.at(current, 3)}"}
3 ->
case :os.type() do
{:unix, :darwin} ->
# could be something like aarch64-apple-darwin21.0.0
# but we don't really need the last 21.0.0 part
if String.match?(Enum.at(current, 2), ~r/^darwin.*/) do
{:ok, "#{Enum.at(current, 0)}-#{Enum.at(current, 1)}-darwin"}
else
{:ok, system_architecture}
end
_ ->
{:ok, system_architecture}
end
_ ->
{:error, "cannot decide current target"}
end
end
@impl ElixirMake.Precompiler
def current_target do
current_target(:os.type())
end
@impl ElixirMake.Precompiler
def all_supported_targets(:fetch) do
~w(
aarch64-apple-darwin
x86_64-apple-darwin
x86_64-linux-gnu
aarch64-linux-gnu
)
end
def all_supported_targets(:compile) do
{:ok, t} = current_target()
[t]
end
@impl ElixirMake.Precompiler
def build_native(args) do
ElixirMake.Compiler.compile(args)
end
@impl ElixirMake.Precompiler
def precompile(args, _target) do
build_native(args)
:ok
end
end