25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-10-19 15:32:08 +02:00

ext_mod: Compile all Elixir files in a library with one function call

Some Elixir libraries have files with dependencies between them.
Compiler can detect and solve those internal dependency if
we call Compile with a list of all the files
https://hexdocs.pm/elixir/1.17.2/Kernel.ParallelCompiler.html#compile/2

This is useful to compile libcluster
This commit is contained in:
Badlop 2024-07-08 12:50:43 +02:00
parent ce95f1f25a
commit 8a3344e78a

View File

@ -36,7 +36,7 @@
install_contrib_modules/2,
config_dir/0, get_commands_spec/0]).
-export([modules_configs/0, module_ebin_dir/1]).
-export([compile_erlang_file/2, compile_elixir_file/2]).
-export([compile_erlang_file/2, compile_elixir_files/2]).
-export([web_menu_node/3, web_page_node/3, webadmin_node_contrib/3]).
%% gen_server callbacks
@ -603,8 +603,7 @@ compile(LibDir) ->
compile_c_files(LibDir),
Er = [compile_erlang_file(Bin, File, Options)
|| File <- filelib:wildcard(Src++"/**/*.erl")],
Ex = [compile_elixir_file(Bin, File)
|| File <- filelib:wildcard(Lib ++ "/**/*.ex")],
Ex = compile_elixir_files(Bin, filelib:wildcard(Lib ++ "/**/*.ex")),
compile_result(lists:flatten([Er, Ex])).
compile_c_files(LibDir) ->
@ -669,18 +668,23 @@ compile_erlang_file(Dest, File, ErlOptions) ->
end.
-ifdef(ELIXIR_ENABLED).
compile_elixir_file(Dest, File) when is_list(Dest) and is_list(File) ->
compile_elixir_file(list_to_binary(Dest), list_to_binary(File));
compile_elixir_files(Dest, [File | _] = Files) when is_list(Dest) and is_list(File) ->
BinFiles = [list_to_binary(F) || F <- Files],
compile_elixir_files(list_to_binary(Dest), BinFiles);
compile_elixir_file(Dest, File) ->
try 'Elixir.Kernel.ParallelCompiler':files_to_path([File], Dest, []) of
compile_elixir_files(Dest, Files) ->
try 'Elixir.Kernel.ParallelCompiler':files_to_path(Files, Dest, []) of
Modules when is_list(Modules) -> {ok, Modules}
catch
_ -> {error, {compilation_failed, File}}
A:B ->
?ERROR_MSG("Problem ~p compiling Elixir files: ~p~nFiles: ~p", [A, B, Files]),
{error, {compilation_failed, Files}}
end.
-else.
compile_elixir_file(_, File) ->
{error, {compilation_failed, File}}.
compile_elixir_files(_, []) ->
ok;
compile_elixir_files(_, Files) ->
{error, {compilation_failed, Files}}.
-endif.
install(Module, Spec, SrcDir, LibDir, Config) ->