lfe-rebar3/compile updates

Since much of my time these days is spent (or ‘writing ‘developing ‘evangelizing) LFE, it should come as no surprise that I use the rebar3 compiler plugin extensively. In doing so, I noticed it always recompiles every .lfe file it finds, irrespective of the staleness of the corresponding .beam file. Having compiled a fair amount of vanilla Erlang via rebar3, I knew it didn’t have to be that way.

To further my quest, tristan__ pointed me to run/7, specifically its use of [check_last_mod]. Before I forked lfe-rebar3/compile, it was using run/4, which does NOT make use of [check_last_mod], hence the unnecessary recompilation.


rebar_base_compiler:run(Opts, [], Files, DoCompile).

After some experimentation, and _checkouts symlinking tricks, I came up with an appropriate run/7 incantation and made a pull request.


rebar_base_compiler:run(Config, FirstFiles, SourceDir, ".lfe", TargetDir, ".beam", fun compile/3).

With those changes, rebar3 lfe compile will now skip unmodified .lfe files. Not only is this The Right Thing™ to do, but it should be time saver in the long run.

Here’s an example of the difference when compiling Lodox

… using run/4 via 0.2.1:

$ time rebar3 lfe compile
~~> Compiling ./src/lodox-html-writer.lfe ... ~~> Compiling ./src/lodox-p.lfe ... ~~> Compiling ./src/lodox-parse.lfe ... ~~> Compiling ./src/lodox-util.lfe ... ~~> Compiling ./src/lodox.lfe ... ~~> Compiling ./src/pandoc.lfe ... ~~> Compiling ./test/unit-lodox-tests.lfe ... 1.39 real 1.14 user 0.24 sys

… using run/7 via 0.3.0:

$ time rebar3 lfe compile
0.94 real 0.73 user 0.20 sys

A little more

microbenchmarking on a proprietary work project:

# run/4 3.58 real 3.02 user 0.58 sys # run/7 1.83 real 1.46 user 0.35 sys

Originally published at blorg.ericb.me.