[erlang-questions] erlc speed (or lack thereof), Make and emake

Loïc Hoguin essen@REDACTED
Tue Jan 29 02:44:39 CET 2013


On 01/25/2013 03:28 AM, Loïc Hoguin wrote:
> Anthony Ramine gave me a tip on how to build only modified erl files
> using make's functionality directly, I'll try it out tomorrow and report
> back.

I have finally played with this. It is very nice and works perfectly.

The idea is to recompile only source files newer than the .app file. 
This can be done by making source files depend on the .app file, and 
using $? to obtain the list of changed files.

This can be seen here:

 
https://github.com/extend/cowboy/blob/747bfc29ee951841f38d6e8d471041d6a3008d60/Makefile

If no files have changed:

essen@REDACTED (0) % time make
make[1]: Entering directory `/home/essen/extend/ranch'
make[1]: Leaving directory `/home/essen/extend/ranch'
make  0.04s user 0.01s system 77% cpu 0.060 total

If one file has changed:

essen@REDACTED (0) % time make
erlc -v -Werror +debug_info +warn_export_all  -o ebin/ -pa ebin/ \
	src/cowboy_middleware.erl src/cowboy.erl
make[1]: Entering directory `/home/essen/extend/ranch'
make[1]: Leaving directory `/home/essen/extend/ranch'
make  0.20s user 0.03s system 91% cpu 0.249 total

As you can see I always compile cowboy_middleware, because I need it 
compiled before anything else, as it's a behavior.

If you want to rebuild everything:

essen@REDACTED (0) % time make clean app
make[1]: Entering directory `/home/essen/extend/ranch'
rm -rf ebin/
rm -f test/*.beam
rm -f erl_crash.dump
make[1]: Leaving directory `/home/essen/extend/ranch'
rm -rf ebin/
rm -f test/*.beam
rm -f erl_crash.dump
erlc -v -Werror +debug_info +warn_export_all  -o ebin/ -pa ebin/ \
	src/cowboy_middleware.erl src/cowboy_multipart.erl 
src/cowboy_http_handler.erl src/cowboy_handler.erl src/cowboy_router.erl 
src/cowboy_http.erl src/cowboy_loop_handler.erl src/cowboy_websocket.erl 
src/cowboy_sup.erl src/cowboy_rest.erl src/cowboy_app.erl 
src/cowboy_bstr.erl src/cowboy_protocol.erl src/cowboy_req.erl 
src/cowboy_middleware.erl src/cowboy.erl src/cowboy_client.erl 
src/cowboy_websocket_handler.erl src/cowboy_clock.erl src/cowboy_static.erl
make[1]: Entering directory `/home/essen/extend/ranch'
erlc -v -Werror +debug_info +warn_export_all  -o ebin/ -pa ebin/ \
	src/ranch_transport.erl src/ranch_transport.erl src/ranch_acceptor.erl 
src/ranch_sup.erl src/ranch_listener.erl src/ranch_server.erl 
src/ranch_acceptors_sup.erl src/ranch_conns_sup.erl 
src/ranch_listener_sup.erl src/ranch_ssl.erl src/ranch_app.erl 
src/ranch_protocol.erl src/ranch.erl src/ranch_tcp.erl
make[1]: Leaving directory `/home/essen/extend/ranch'
make clean app  1.39s user 0.10s system 98% cpu 1.512 total

That's pretty fast in my book.

In comparison, rebar:

essen@REDACTED (0) % time rebar clean compile
==> ranch (clean)
==> cowboy (clean)
==> ranch (compile)
Compiled src/ranch_protocol.erl
Compiled src/ranch_transport.erl
Compiled src/ranch_acceptor.erl
Compiled src/ranch_listener.erl
Compiled src/ranch.erl
Compiled src/ranch_tcp.erl
Compiled src/ranch_listener_sup.erl
Compiled src/ranch_conns_sup.erl
Compiled src/ranch_ssl.erl
Compiled src/ranch_acceptors_sup.erl
Compiled src/ranch_server.erl
Compiled src/ranch_sup.erl
Compiled src/ranch_app.erl
==> cowboy (compile)
Compiled src/cowboy_http_handler.erl
Compiled src/cowboy_loop_handler.erl
Compiled src/cowboy_websocket_handler.erl
Compiled src/cowboy_middleware.erl
Compiled src/cowboy.erl
Compiled src/cowboy_bstr.erl
Compiled src/cowboy_router.erl
Compiled src/cowboy_static.erl
Compiled src/cowboy_handler.erl
Compiled src/cowboy_rest.erl
Compiled src/cowboy_protocol.erl
Compiled src/cowboy_sup.erl
Compiled src/cowboy_multipart.erl
Compiled src/cowboy_req.erl
Compiled src/cowboy_clock.erl
Compiled src/cowboy_websocket.erl
Compiled src/cowboy_app.erl
Compiled src/cowboy_client.erl
Compiled src/cowboy_http.erl
rebar clean compile  2.38s user 0.17s system 179% cpu 1.419 total

All this on a state of the art 13" laptop with a good SSD, i7 and 
everything, if you wonder.

I probably won't bother trying to make -j to work. Feel free to send a 
patch if you want to have fun with it, though.

-- 
Loïc Hoguin
Erlang Cowboy
Nine Nines
http://ninenines.eu



More information about the erlang-questions mailing list