Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Compiler Architecture

Compiler Behavior

All compilers implement the rebar_compiler behavior:

-callback context(rebar_app_info:t()) -> Context :: map().
-callback needed_files(Graph, FoundFiles, Mappings, AppInfo) -> NeededFiles.
-callback dependencies(Source, SourceDir, InDirs) -> [Dependency].
-callback dependencies(Source, SourceDir, InDirs, DepOpts) -> [Dependency].
-callback compile(Source, Mappings, Config, Opts) -> Result.
-callback compile_and_track(Source, Mappings, Config, Opts) -> TrackedResult.
-callback clean(Files, AppInfo) -> ok.

Compiler Context

The context/1 callback provides configuration:

#{src_dirs => ["src", "lib"],           % Where to find sources
  include_dirs => ["/abs/path/include"], % Include directories
  src_ext => ".erl",                     % Source extension
  out_mappings => [{".beam", "ebin"}],   % Output extension → directory
  dependencies_opts => [...]}            % Options for dependency scanning

Needed Files

The needed_files/4 callback determines what to compile:

Returns:

{{FirstFiles, FirstOpts},    % Must compile first (sequentially)
 {RestFiles, RestOpts}}      % Can compile after FirstFiles

or:

{{FirstFiles, FirstOpts},
 {{Sequential, Parallel}, RestOpts}}  % Split for parallelization

FirstFiles typically include:

  • Parse transforms
  • Files listed in erl_first_files configuration

Sequential files have incoming dependencies (other files depend on them)

Parallel files are independent and can compile concurrently