Add verbose option throughout compilers

This commit is contained in:
José Valim
2016-05-15 12:04:47 +02:00
parent 504462b21b
commit 85f5269a34
7 changed files with 64 additions and 33 deletions
+26 -8
View File
@@ -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
+2 -9
View File
@@ -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")
+6 -2
View File
@@ -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
+2 -10
View File
@@ -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
+9 -1
View File
@@ -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
+10 -2
View File
@@ -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
+9 -1
View File
@@ -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