Current section
Files
Jump to
Current section
Files
lib/mix/compilers/lfe.ex
defmodule Mix.Compilers.Lfe do
alias Mix.Compilers.Erlang, as: ErlangCompiler
@moduledoc false
@doc """
Compiles the files in `mappings` with '.lfe' extensions into
the destinations.
Does this for each stale input and output pair (or for all if `force` is `true`) and
removes files that no longer have a source, while keeping the `manifest` up to date.
`mappings` should be a list of tuples in the form of `{src, dest}` paths.
Uses an [idea](https://github.com/elixir-lang/elixir/blob/e1c903a5956e4cb9075f0aac00638145788b0da4/lib/mix/lib/mix/compilers/erlang.ex#L20) from the Erlang Mix compiler to do so.
It supports the options of the Erlang Mix compiler under the covers as it is used.
"""
def compile(manifest, [{_, _} | _] = mappings, opts) do
callback = fn input, output ->
module = input |> Path.basename(".lfe") |> String.to_atom()
:code.purge(module)
:code.delete(module)
outdir = output |> Path.dirname() |> ErlangCompiler.to_erl_file()
compile_result(:lfe_comp.file(ErlangCompiler.to_erl_file(input), [{:outdir, outdir}, :return, :report]))
end
ErlangCompiler.compile(manifest, mappings, :lfe, :beam, opts, callback)
end
@doc """
Removes compiled files for the given `manifest`.
"""
def clean(manifest), do: ErlangCompiler.clean(manifest)
defp compile_result({:error, [{:error, [{file, [error | _]}], []}], [], []}) do
{:error, [{file, [error]}], []}
end
defp compile_result(result), do: result
end