Distributing a buildable executable

Dave Cottlehuber dch@REDACTED
Wed Jan 8 15:31:45 CET 2020

On Tue, 7 Jan 2020, at 16:04, Р.С. Алиев wrote:
> Hello list,
> What I have is:
> 1. Pure Erlang part, a simple gen_server;
> 2. Several C++ source files + cmake file, intended to be build into a 
> standalone executable.
> I need to distribute both components in a single package, as my 
> gen_server does open_port({spawn, my_executable}). Moreover, it uses an 
> environmental variable to find the executable, so I need a way to set it 
> too (I use the "QT5_EPORT_DIR=~/Path/to/executable rebar3 shell --apps 
> my_app" command now, but it obviously needs to be generalized somehow).
> What is the standard way to distribute such a two-component Erlang package?
> Thank you.
> -- 
> Regards,
> R.S. Aliev

Hey RS,

Distribute the binary in your application priv directory, & then however you
deploy your app, you can check for & locate the binary at module load time:

init() ->
    PrivDir = case code:priv_dir(?MODULE) of
        {error, _} ->
            %% ENOIDEA so make a wild guess
            EbinDir = filename:dirname(code:which(?MODULE)),
            AppPath = filename:dirname(EbinDir),
            filename:join(AppPath, "priv");
        Path ->
    do_stuff(filename:join(PrivDir, "executable")).

Alternatively for a gen_server you might handle this in Module:init/1.
see jiffy and associated rebar.config for how this all gets assembled.


There's a bunch more useful stuff in Paul's nif-examples[1] repo,
albeit targeted for NIFs obviously. If you need to compile the exe,
enc[2] is the best rebar-ish extension I've used for this, but I don't
know off-hand of any cmake-driven builds.

[1]: https://github.com/davisp/nif-examples/tree/master/apps
[2]: https://github.com/davisp/erlang-native-compiler


More information about the erlang-questions mailing list