Example Scenarios
Scenario 1: Simple Erlang Module Compilation
Files:
src/my_module.erl
Flow:
- Compiler:
rebar_compiler_erl - Find:
[src/my_module.erl] - Check DAG: not compiled yet
- Needed files:
[src/my_module.erl] - No first files, no dependencies
- Parallel compilation: single file, no benefit
- Compile:
compile:file("src/my_module.erl", [{outdir, "ebin"}, ...]) - Result:
ebin/my_module.beam
Scenario 2: Module with Include Files
Files:
src/my_module.erl
include/types.hrl
my_module.erl:
-module(my_module).
-include("types.hrl").
Flow:
- Dependency scan finds
include/types.hrl - Add dependency:
my_module.erl→types.hrl - Store in DAG
- Compile
my_module.erl - Store artifact with timestamp
Next Run:
- Check timestamps
- If
types.hrlmodified: recompilemy_module.erl - If not: skip compilation
Scenario 3: Parse Transform
Files:
src/my_transform.erl (parse transform)
src/user_module.erl (uses transform)
user_module.erl:
-compile([{parse_transform, my_transform}]).
Flow:
- Split sources:
[my_transform.erl]vs[user_module.erl] - FirstFiles:
[my_transform.erl] - Compile
my_transform.erlfirst - Dependency:
user_module.erl→my_transform.erl - Compile
user_module.erl(transform applied)
Scenario 4: Yecc Parser
Files:
src/parser.yrl
Flow:
- Compiler:
rebar_compiler_yrl - Find:
[src/parser.yrl] - Compile:
yecc:file("src/parser.yrl") - Generates:
src/parser.erl - Compiler:
rebar_compiler_erl - Find:
[src/parser.erl](generated) - Compile:
compile:file("src/parser.erl", ...) - Result:
ebin/parser.beam
Scenario 5: Parallel Compilation
Files:
src/mod_a.erl (independent)
src/mod_b.erl (independent)
src/mod_c.erl (independent)
src/mod_d.erl (uses mod_a)
Dependencies:
- mod_d → mod_a
- mod_a, mod_b, mod_c independent
Compilation Order:
Sequential: [mod_a] (mod_d depends on it)
Parallel: [mod_b, mod_c] (independent)
Then Sequential: [mod_d] (after mod_a done)
Workers: 2 parallel workers
- Worker 1: compile mod_b
- Worker 2: compile mod_c
- Main: compile mod_a (sequential)
- Main: compile mod_d (after mod_a)
Scenario 6: Incremental Build
Initial Build:
Compile: mod_a, mod_b, mod_c
DAG: stored with timestamps
Modify mod_b.erl:
Find: mod_b.erl timestamp changed
DAG: mod_b needs recompilation
Compile: only mod_b
Result: 1 file compiled vs 3 initial
Modify include/common.hrl (used by mod_a, mod_c):
DAG propagation: common.hrl timestamp updated
Dependents: mod_a, mod_c use common.hrl
Compile: mod_a, mod_c (mod_b unchanged)
Result: 2 files compiled
Scenario 7: Changed Compiler Options
Initial:
{erl_opts, [debug_info]}.
Build: All files compiled with debug_info
Modified:
{erl_opts, [debug_info, warnings_as_errors]}.
Next Build:
- DAG compares stored opts vs current opts
- Mismatch detected:
warnings_as_errorsadded - All files need recompilation
- Compile all with new options
- Update DAG with new options