rustler_precompiled
rustler_precompiled copied to clipboard
Cannot use the released nif version
EDIT Sorry this seems to be fixed already. I did not check the version used by meeseeks. I'l let this open in case there was a slight difference in the problem, but close at will :)
Hello,
I'm trying to use an Elixir library (meeseeks_html5ever) that only publishes nif-2.15 releases.
But my nif version is 2.17, and rustler precompiled
use RustlerPrecompiled,
nif_versions: ~w(2.15),
But then I have this error:
** (RuntimeError) precompiled NIF is not available for this NIF version: "2.16".
The available NIF versions are:
- 2.15
So I dug and found the following code:
def find_compatible_nif_version(vsn, available) do
if vsn in available do
{:ok, vsn}
else
[major, minor | _] = parse_version(vsn)
available
|> Enum.map(&parse_version/1)
|> Enum.filter(fn
[^major, available_minor | _] when available_minor <= minor -> true
[_ | _] -> false
end)
|> case do
[] -> :error
match -> {:ok, match |> Enum.max() |> Enum.join(".")}
end
end
end
So this will select "2.16" only, although I configured my versions to ["2.15"]
.
The problem is that target_config/0
will pass the hardcoded list of all available versions in find_compatible_nif_version(current_nif_version, Config.available_nif_versions())
, instead of reducing that list to what I configured.
A very simple fix would be to call case target(target_config(config.nif_versions), config.targets, config.nif_versions) do
,
With this signatures: defp target_config(available_nif_versions \\ Config.available_nif_versions()) do
And in there, that call: find_compatible_nif_version(current_nif_version, available_nif_versions)
So I can make a PR but is there a reason not to make this change?
Thank you.