Add verbose option throughout compilers
This commit is contained in:
@@ -15,7 +15,7 @@ defmodule Mix.Compilers.Elixir do
|
||||
between modules, which helps it recompile only the modules that
|
||||
have changed at runtime.
|
||||
"""
|
||||
def compile(manifest, srcs, exts, dest, force, on_start) do
|
||||
def compile(manifest, srcs, exts, dest, force, opts) do
|
||||
all = Mix.Utils.extract_files(srcs, exts)
|
||||
{all_entries, all_sources} = parse_manifest(manifest)
|
||||
|
||||
@@ -53,7 +53,7 @@ defmodule Mix.Compilers.Elixir do
|
||||
|
||||
cond do
|
||||
stale != [] ->
|
||||
compile_manifest(manifest, entries, sources, stale, dest, on_start)
|
||||
compile_manifest(manifest, entries, sources, stale, dest, opts)
|
||||
:ok
|
||||
removed != [] ->
|
||||
write_manifest(manifest, entries, sources)
|
||||
@@ -92,23 +92,31 @@ defmodule Mix.Compilers.Elixir do
|
||||
do: {module, kind, beam}
|
||||
end
|
||||
|
||||
defp compile_manifest(manifest, entries, sources, stale, dest, on_start) do
|
||||
defp compile_manifest(manifest, entries, sources, stale, dest, opts) do
|
||||
Mix.shell.print_app()
|
||||
Mix.Project.ensure_structure()
|
||||
true = Code.prepend_path(dest)
|
||||
|
||||
on_start.()
|
||||
set_compiler_opts(opts)
|
||||
cwd = File.cwd!
|
||||
|
||||
extra =
|
||||
if opts[:verbose] do
|
||||
[each_file: &each_file/1]
|
||||
else
|
||||
[]
|
||||
end
|
||||
|
||||
# Starts a server responsible for keeping track which files
|
||||
# were compiled and the dependencies between them.
|
||||
{:ok, pid} = Agent.start_link(fn -> {entries, sources} end)
|
||||
|
||||
try do
|
||||
_ = Kernel.ParallelCompiler.files :lists.usort(stale),
|
||||
each_module: &each_module(pid, dest, cwd, &1, &2, &3),
|
||||
each_timeout: &each_timeout(&1),
|
||||
timeout: 5_000,
|
||||
dest: dest
|
||||
[each_module: &each_module(pid, dest, cwd, &1, &2, &3),
|
||||
each_timeout: &each_timeout(&1),
|
||||
timeout: 5_000,
|
||||
dest: dest] ++ extra
|
||||
Agent.cast pid, fn {entries, sources} ->
|
||||
write_manifest(manifest, entries, sources)
|
||||
{entries, sources}
|
||||
@@ -120,6 +128,12 @@ defmodule Mix.Compilers.Elixir do
|
||||
:ok
|
||||
end
|
||||
|
||||
defp set_compiler_opts(opts) do
|
||||
opts = Keyword.take(opts, Code.available_compiler_options)
|
||||
opts = Keyword.merge(Mix.Project.config[:elixirc_options] || [], opts)
|
||||
Code.compiler_options opts
|
||||
end
|
||||
|
||||
defp each_module(pid, dest, cwd, source, module, binary) do
|
||||
beam =
|
||||
dest
|
||||
@@ -170,6 +184,10 @@ defmodule Mix.Compilers.Elixir do
|
||||
do: relative
|
||||
end
|
||||
|
||||
defp each_file(source) do
|
||||
Mix.shell.info "Compiled #{source}"
|
||||
end
|
||||
|
||||
defp each_timeout(source) do
|
||||
Mix.shell.info "Compiling #{source} (it's taking more than 5s)"
|
||||
end
|
||||
|
||||
@@ -73,6 +73,7 @@ defmodule Mix.Compilers.Erlang do
|
||||
if stale == [] && removed == [] do
|
||||
:noop
|
||||
else
|
||||
Mix.shell.print_app
|
||||
Mix.Project.ensure_structure()
|
||||
|
||||
# Let's prepend the newly created path so compiled files
|
||||
@@ -85,7 +86,7 @@ defmodule Mix.Compilers.Erlang do
|
||||
|
||||
# Compile stale files and print the results
|
||||
results = for {input, output} <- stale do
|
||||
interpret_result(input, callback.(input, output))
|
||||
callback.(input, output)
|
||||
end
|
||||
|
||||
# Write final entries to manifest
|
||||
@@ -150,14 +151,6 @@ defmodule Mix.Compilers.Erlang do
|
||||
artifact |> Path.basename |> Path.rootname
|
||||
end
|
||||
|
||||
defp interpret_result(file, result) do
|
||||
case result do
|
||||
{:ok, _} -> Mix.shell.info "Compiled #{file}"
|
||||
:error -> nil
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
defp read_manifest(file) do
|
||||
case File.read(file) do
|
||||
{:ok, contents} -> String.split(contents, "\n")
|
||||
|
||||
@@ -60,7 +60,7 @@ defmodule Mix.Tasks.Compile.App do
|
||||
"""
|
||||
@spec run(OptionParser.argv) :: :ok | :noop
|
||||
def run(args) do
|
||||
{opts, _, _} = OptionParser.parse(args, switches: [force: :boolean])
|
||||
{opts, _, _} = OptionParser.parse(args, switches: [force: :boolean, verbose: :boolean])
|
||||
|
||||
project = Mix.Project.get!
|
||||
config = Mix.Project.config
|
||||
@@ -78,6 +78,8 @@ defmodule Mix.Tasks.Compile.App do
|
||||
sources = Mix.Project.config_files
|
||||
|
||||
if opts[:force] || Mix.Utils.stale?(sources, [target]) || modules_changed?(mods, target) do
|
||||
Mix.shell.print_app()
|
||||
|
||||
best_guess = [
|
||||
vsn: to_charlist(version),
|
||||
modules: mods,
|
||||
@@ -101,7 +103,9 @@ defmodule Mix.Tasks.Compile.App do
|
||||
|
||||
Mix.Project.ensure_structure()
|
||||
File.write!(target, :io_lib.format("~p.", [contents]), [:utf8])
|
||||
Mix.shell.info "Generated #{app} app"
|
||||
if opts[:verbose] do
|
||||
Mix.shell.info "Generated #{app} app"
|
||||
end
|
||||
:ok
|
||||
else
|
||||
:noop
|
||||
|
||||
@@ -38,7 +38,7 @@ defmodule Mix.Tasks.Compile.Elixir do
|
||||
|
||||
@switches [force: :boolean, docs: :boolean, warnings_as_errors: :boolean,
|
||||
ignore_module_conflict: :boolean, debug_info: :boolean,
|
||||
elixirc_paths: :keep]
|
||||
elixirc_paths: :keep, verbose: :boolean]
|
||||
|
||||
@doc """
|
||||
Runs this task.
|
||||
@@ -55,9 +55,7 @@ defmodule Mix.Tasks.Compile.Elixir do
|
||||
configs = Mix.Project.config_files ++ Mix.Tasks.Compile.Erlang.manifests
|
||||
force = opts[:force] || Mix.Utils.stale?(configs, [manifest])
|
||||
|
||||
Mix.Compilers.Elixir.compile(manifest, srcs, [:ex], dest, force, fn ->
|
||||
set_compiler_opts(project, opts, [])
|
||||
end)
|
||||
Mix.Compilers.Elixir.compile(manifest, srcs, [:ex], dest, force, opts)
|
||||
end
|
||||
|
||||
@doc """
|
||||
@@ -72,10 +70,4 @@ defmodule Mix.Tasks.Compile.Elixir do
|
||||
def clean do
|
||||
Mix.Compilers.Elixir.clean(manifest())
|
||||
end
|
||||
|
||||
defp set_compiler_opts(project, opts, extra) do
|
||||
opts = Keyword.take(opts, Code.available_compiler_options)
|
||||
opts = Keyword.merge(project[:elixirc_options] || [], opts)
|
||||
Code.compiler_options Keyword.merge(opts, extra)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -91,7 +91,15 @@ defmodule Mix.Tasks.Compile.Erlang do
|
||||
:code.delete(module)
|
||||
|
||||
file = to_erl_file(Path.rootname(input, ".erl"))
|
||||
:compile.file(file, erlc_options)
|
||||
case :compile.file(file, erlc_options) do
|
||||
{:ok, _} = ok ->
|
||||
if opts[:verbose] do
|
||||
Mix.shell.info "Compiled #{input}"
|
||||
end
|
||||
ok
|
||||
:error ->
|
||||
:error
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ defmodule Mix.Tasks.Compile.Leex do
|
||||
"""
|
||||
@spec run(OptionParser.argv) :: :ok | :noop
|
||||
def run(args) do
|
||||
{opts, _, _} = OptionParser.parse(args, switches: [force: :boolean])
|
||||
{opts, _, _} = OptionParser.parse(args, switches: [force: :boolean, verbose: true])
|
||||
|
||||
project = Mix.Project.config
|
||||
source_paths = project[:erlc_paths]
|
||||
@@ -53,7 +53,15 @@ defmodule Mix.Tasks.Compile.Leex do
|
||||
input, output ->
|
||||
Erlang.ensure_application!(:parsetools, input)
|
||||
options = options ++ @forced_opts ++ [scannerfile: Erlang.to_erl_file(output)]
|
||||
:leex.file(Erlang.to_erl_file(input), options)
|
||||
case :leex.file(Erlang.to_erl_file(input), options) do
|
||||
{:ok, _} = ok ->
|
||||
if opts[:verbose] do
|
||||
Mix.shell.info "Compiled #{input}"
|
||||
end
|
||||
ok
|
||||
:error ->
|
||||
:error
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
|
||||
@@ -53,7 +53,15 @@ defmodule Mix.Tasks.Compile.Yecc do
|
||||
input, output ->
|
||||
Erlang.ensure_application!(:parsetools, input)
|
||||
options = options ++ @forced_opts ++ [parserfile: Erlang.to_erl_file(output)]
|
||||
:yecc.file(Erlang.to_erl_file(input), options)
|
||||
case :yecc.file(Erlang.to_erl_file(input), options) do
|
||||
{:ok, _} = ok ->
|
||||
if opts[:verbose] do
|
||||
Mix.shell.info "Compiled #{input}"
|
||||
end
|
||||
ok
|
||||
:error ->
|
||||
:error
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user