aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Romain <cromain@users.noreply.github.com>2016-07-28 16:06:12 +0200
committerGitHub <noreply@github.com>2016-07-28 16:06:12 +0200
commitfad088a3c4987efcf558bfd761d65acc02e20b85 (patch)
tree4cec3fe169e0de70e8512ed0cf23dd32b16022e8
parentMerge pull request #1211 from processone/expand_api (diff)
parentStart elixir application after ejabberd_app:start_apps() (diff)
Merge pull request #1193 from gabrielgatu/support-elixir-module-installer
Fix issue #625: Writing Elixir modules
-rw-r--r--src/ejabberd_app.erl7
-rw-r--r--src/ext_mod.erl37
2 files changed, 41 insertions, 3 deletions
diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl
index 703614f63..bbeb510dc 100644
--- a/src/ejabberd_app.erl
+++ b/src/ejabberd_app.erl
@@ -45,6 +45,7 @@ start(normal, _Args) ->
write_pid_file(),
jid:start(),
start_apps(),
+ start_elixir_application(),
ejabberd:check_app(ejabberd),
randoms:start(),
db_init(),
@@ -237,3 +238,9 @@ opt_type(modules) ->
Mods)
end;
opt_type(_) -> [cluster_nodes, loglevel, modules, net_ticktime].
+
+start_elixir_application() ->
+ case application:ensure_started(elixir) of
+ ok -> ok;
+ {error, Msg} -> ?ERROR_MSG("Elixir application not started.", [])
+ end.
diff --git a/src/ext_mod.erl b/src/ext_mod.erl
index 332d2c5e2..842bb09fc 100644
--- a/src/ext_mod.erl
+++ b/src/ext_mod.erl
@@ -484,17 +484,28 @@ compile_deps(_Module, _Spec, DestDir) ->
filelib:ensure_dir(filename:join(Ebin, ".")),
Result = lists:foldl(fun(Dep, Acc) ->
Inc = filename:join(Dep, "include"),
+ Lib = filename:join(Dep, "lib"),
Src = filename:join(Dep, "src"),
Options = [{outdir, Ebin}, {i, Inc}],
[file:copy(App, Ebin) || App <- filelib:wildcard(Src++"/*.app")],
- Acc++[case compile:file(File, Options) of
+
+ %% Compile erlang files
+ Acc1 = Acc ++ [case compile:file(File, Options) of
{ok, _} -> ok;
{ok, _, _} -> ok;
{ok, _, _, _} -> ok;
error -> {error, {compilation_failed, File}};
Error -> Error
end
- || File <- filelib:wildcard(Src++"/*.erl")]
+ || File <- filelib:wildcard(Src++"/*.erl")],
+
+ %% Compile elixir files
+ Acc1 ++ [case compile_elixir_file(Ebin, File) of
+ {ok, _} -> ok;
+ {error, File} -> {error, {compilation_failed, File}}
+ end
+ || File <- filelib:wildcard(Lib ++ "/*.ex")]
+
end, [], filelib:wildcard("deps/*")),
case lists:dropwhile(
fun(ok) -> true;
@@ -515,6 +526,8 @@ compile(_Module, _Spec, DestDir) ->
verbose, report_errors, report_warnings]
++ ExtLib,
[file:copy(App, Ebin) || App <- filelib:wildcard("src/*.app")],
+
+ %% Compile erlang files
Result = [case compile:file(File, Options) of
{ok, _} -> ok;
{ok, _, _} -> ok;
@@ -523,14 +536,32 @@ compile(_Module, _Spec, DestDir) ->
Error -> Error
end
|| File <- filelib:wildcard("src/*.erl")],
+
+ %% Compile elixir files
+ Result1 = Result ++ [case compile_elixir_file(Ebin, File) of
+ {ok, _} -> ok;
+ {error, File} -> {error, {compilation_failed, File}}
+ end
+ || File <- filelib:wildcard("lib/*.ex")],
+
case lists:dropwhile(
fun(ok) -> true;
(_) -> false
- end, Result) of
+ end, Result1) of
[] -> ok;
[Error|_] -> Error
end.
+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_file(Dest, File) ->
+ try 'Elixir.Kernel.ParallelCompiler':files_to_path([File], Dest, []) of
+ [Module] -> {ok, Module}
+ catch
+ _ -> {error, File}
+ end.
+
install(Module, Spec, DestDir) ->
Errors = lists:dropwhile(fun({_, {ok, _}}) -> true;
(_) -> false