# `mix compile.elixir`
[🔗](https://github.com/elixir-lang/elixir/blob/7ff272706afc522e74121493b7166719985cb099/lib/mix/lib/mix/tasks/compile.elixir.ex#L5)

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. More details
about dependencies between files can be found in the documentation
of [`mix xref`](`Mix.Tasks.Xref`).

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

  * `--all-warnings` (`--no-all-warnings`) - prints all warnings, including previous compilations
    (default is true except on errors)
  * `--docs` (`--no-docs`) - attaches (or not) documentation to compiled modules
  * `--debug-info` (`--no-debug-info`) - attaches (or not) debug info to compiled modules.
    Passing this flag will force a full recompilation
  * `--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`)
  * `--long-verification-threshold N` - sets the "long verification" threshold
    (in seconds) to `N` (see the docs for `Kernel.ParallelCompiler.compile/2`)
  * `--no-verification` - disables code verification, such as unused functions,
    deprecation warnings, and type checking. It must be used solely for debugging
    alongside `MIX_DEBUG=1`
  * `--no-check-cwd` - (since v1.19.2) Elixir stores absolute paths in .beam files,
    which means that relocating the project root triggers a full build. Pass this option
    if you don't want the current working directory to be checked
  * `--purge-consolidation-path-if-stale PATH` - deletes and purges modules in the
    given protocol consolidation path if compilation is required
  * `--purge-compiler-modules` - automatically purge compilation modules
    after compilation (see `Code.purge_compiler_modules/0`)
  * `--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` - exit with non-zero status if compilation has one or more warnings

## Configuration

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

  * `:elixirc_options` - compilation options that apply to Elixir's compiler.
    It supports many of the options above  plus the options listed in
    `Code.put_compiler_option/2`. In case conflicting options are given,
    the ones given through the command line are used.

  * `[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.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
