#
View Source mix compile.elixir (Mix v1.15.7)

Compiles Elixir source files.

Elixir is smart enough to recompile only files that have changed and their dependencies. This means if `lib/a.ex` is invoking a function defined over `lib/b.ex` at compile time, whenever `lib/b.ex` changes, `lib/a.ex` is also recompiled.

Note Elixir considers a file as changed if its source file has changed on disk since the last compilation AND its contents are no longer the same.

## `@external_resource`

If a module depends on external files, those can be annotated with the `@external_resource` module attribute. If these files change, the Elixir module is automatically recompiled.

## `__mix_recompile__?/0`

A module may export a `__mix_recompile__?/0` function that can cause the module to be recompiled using custom rules. For example, to recompile whenever a file is changed in a given directory, you can use a combination of `@external_resource` for existing files and a `__mix_recompile__?/0` check to verify when new entries are added to the directory itself:

    defmodule MyModule do
      paths = Path.wildcard("*.txt")
      @paths_hash :erlang.md5(paths)

      for path <- paths do
        @external_resource path
      end

      def __mix_recompile__?() do
        Path.wildcard("*.txt") |> :erlang.md5() != @paths_hash
      end
    end

Compiler calls `__mix_recompile__?/0` for every module being compiled (or previously compiled) and thus it is very important to do there as little work as possible to not slow down the compilation.

If module has `@compile {:autoload, false}`, `__mix_recompile__?/0` will not be used.

## Command line options

- `--docs` (`--no-docs`) - attaches (or not) documentation to compiled modules
- `--debug-info` (`--no-debug-info`) - attaches (or not) debug info to compiled modules
- `--force` - forces compilation regardless of modification times
- `--ignore-module-conflict` - does not emit warnings if a module was previously defined
- `--long-compilation-threshold N` - sets the "long compilation" threshold (in seconds) to `N` (see the docs for `Kernel.ParallelCompiler.compile/2`)
- `--purge-consolidation-path-if-stale PATH` - deletes and purges modules in the given protocol consolidation path if compilation is required
- `--profile` - if set to `time`, outputs timing information of compilation steps
- `--tracer` - adds a compiler tracer in addition to any specified in the `mix.exs` file
- `--verbose` - prints each file being compiled
- `--warnings-as-errors` - treats warnings in the current project as errors and return a non-zero exit status

## Configuration

- `:elixirc_paths` - directories to find source files. Defaults to `["lib"]`.

- `:elixirc_options` - compilation options that apply to Elixir's compiler. See `Code.put_compiler_option/2` for a complete list of options. These options are often overridable from the command line using the switches above.

- `[xref: [exclude: ...]]` - a list of `module` or `{module, function, arity}` that should not be warned on in case on undefined modules or undefined application warnings.