PageRenderTime 54ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/mix/lib/mix/tasks/compile.ex

https://github.com/vanstee/elixir
Elixir | 96 lines | 71 code | 23 blank | 2 comment | 4 complexity | 90052f222f65e1b3fcda4ce28552b9b7 MD5 | raw file
Possible License(s): Apache-2.0
  1. defmodule Mix.Tasks.Compile do
  2. use Mix.Task
  3. @shortdoc "Compile source files"
  4. @recursive true
  5. @moduledoc """
  6. A meta task that compiles source files. It simply runs the
  7. compilers registered in your project. At the end of compilation
  8. it ensures load paths are set.
  9. ## Configuration
  10. * `:compilers` - compilers to be run, defaults to:
  11. ```
  12. [:elixir, :app]
  13. ```
  14. It can be configured to handle custom compilers, for example:
  15. ```
  16. [compilers: [:elixir, :mycompiler, :app]]
  17. ```
  18. ## Command line options
  19. * `--list` - List all enabled compilers.
  20. Remaining options are forwarded to underlying compilers.
  21. """
  22. def run(["--list"]) do
  23. Mix.Task.load_all
  24. shell = Mix.shell
  25. modules = Mix.Task.all_modules
  26. docs = lc module inlist modules,
  27. task = Mix.Task.task_name(module),
  28. match?("compile." <> _, task),
  29. doc = Mix.Task.shortdoc(module) do
  30. { task, doc }
  31. end
  32. max = Enum.reduce docs, 0, fn({ task, _ }, acc) ->
  33. max(size(task), acc)
  34. end
  35. sorted = Enum.sort(docs)
  36. Enum.each sorted, fn({ task, doc }) ->
  37. shell.info format('mix ~-#{max}s # ~ts', [task, doc])
  38. end
  39. shell.info "\nEnabled compilers: #{Enum.join get_compilers, ", "}"
  40. end
  41. @doc """
  42. Runs this compile task by recursively calling all registered compilers.
  43. """
  44. def run(args) do
  45. Mix.Task.run("loadpaths", args)
  46. res =
  47. Enum.map(get_compilers, fn(compiler) ->
  48. List.wrap Mix.Task.run("compile.#{compiler}", args)
  49. end)
  50. Code.prepend_path Mix.Project.compile_path
  51. if Enum.any?(res, &(:ok in &1)), do: :ok, else: :noop
  52. end
  53. @doc """
  54. Returns manifests for all compilers.
  55. """
  56. def manifests do
  57. Enum.flat_map(get_compilers, fn(compiler) ->
  58. module = Mix.Task.get!("compile.#{compiler}")
  59. if function_exported?(module, :manifests, 0) do
  60. module.manifests
  61. else
  62. []
  63. end
  64. end)
  65. end
  66. defp get_compilers do
  67. Mix.project[:compilers] ||
  68. [:yecc, :leex, :erlang, :elixir, :app]
  69. end
  70. defp format(expression, args) do
  71. :io_lib.format(expression, args) |> iolist_to_binary
  72. end
  73. end