summaryrefslogtreecommitdiffstats
path: root/articles/erlang.mk-and-relx/index.html
blob: 83910b52ceaf4e706b233dc42e990298871e00c2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="">
    <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">

    <meta name="generator" content="Hugo 0.17" />

    <title>Nine Nines: Build Erlang releases with Erlang.mk and Relx</title>

    <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
    <link href="/css/99s.css?r=1" rel="stylesheet">

    <link rel="shortcut icon" href="/img/ico/favicon.ico">
    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
    <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">

    
</head>


<body class="">
  <header id="page-head">
    <div id="topbar" class="container">
        <div class="row">
          <div class="span2">
            <h1 id="logo"><a href="/" title="99s">99s</a></h1>
          </div>
          <div class="span10">
            
            <div id="side-header">
              <nav>
                <ul>
                  <li class="active"><a title="Hear my thoughts" href="/articles">Articles</a></li>
  				  <li><a title="Watch my talks" href="/talks">Talks</a></li>
  				  <li><a title="Read the docs" href="/docs">Documentation</a></li>
  				  <li><a title="Request my services" href="/services">Consulting & Training</a></li>
                </ul>
              </nav> 
              <ul id="social">
                <li>
                  <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
                </li>
                    <li>
						<a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
					</li>
                    <li>
						<a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
					</li>
              </ul>
            </div>
          </div>
        </div>
    </div>


</header>

<div id="contents">
<div class="container">
<div class="row">
<div class="span9 maincol">

<article class="blog_item">
<header>
	<h1 class="lined-header"><span>Build Erlang releases with Erlang.mk and Relx</span></h1>
	<p class="date">
		<span class="day">28</span>
		<span class="month">May</span>
	</p>
</header>

<div class="paragraph"><p>Building OTP releases has always been a difficult task. Tools like
Reltool or Rebar have made this simpler, but
it&#8217;s no panacea. This article will show you an alternative and
hopefully much simpler solution.</p></div>
<div class="paragraph"><p>There is two steps to building a release. First you need to build
the various OTP applications you want to include in the release. Once
done, you need to create the release itself, by including the Erlang
runtime system alongside the applications, a boot script to start the
node and all its applications, and some configuration files.</p></div>
<div class="paragraph"><p><a href="https://github.com/extend/erlang.mk">Erlang.mk</a> solves
the first step. It is an include file for GNU Make. Just
including it in a Makefile is enough to allow building your project,
fetching and building dependencies, building documentation, performing
static analysis and more.</p></div>
<div class="paragraph"><p><a href="https://github.com/erlware/relx">Relx</a> solves the second
step. It is a release creation tool, wrapped into a single executable
file. It doesn&#8217;t require a configuration file. And if you do need one,
it will be a pretty small one.</p></div>
<div class="paragraph"><p>Let&#8217;s take a look at the smallest Erlang.mk powered
Makefile. There is only one thing required: defining the project
name.</p></div>
<div class="listingblock">
<div class="content"></div></div>
<div class="paragraph"><p>Simply doing this allows you to build your application by typing
<code>make</code>, running tests using <code>make tests</code>, and
more. It will even compile your <em>.dtl</em> files found in the
<em>templates/</em> directory if you are using ErlyDTL!</p></div>
<div class="paragraph"><p>Let&#8217;s now take a look at a simplified version of the Makefile for
this website. I only removed a few targets that were off-topic.</p></div>
<div class="listingblock">
<div class="content"></div></div>
<div class="paragraph"><p>You can see here how to define dependencies. First you list all
the dependency names, then you have one line per dependency, giving
the repository URL and the commit number, tag or branch you want.</p></div>
<div class="paragraph"><p>Then you can see two targets defined, with <code>release</code>
becoming the default target, because it was defined first. You can
override the default target <code>all</code>, which builds the
application and its dependencies, this way.</p></div>
<div class="paragraph"><p>And as you can see, the <code>release</code> target uses
Relx to build a release into the <em>rel/ninenines/</em>
directory. Let&#8217;s take a look at the configuration file for this release.</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt>{<span style="color: #FF6600">release</span>, {<span style="color: #FF6600">ninenines</span>, <span style="color: #FF0000">"1"</span>}, [<span style="color: #FF6600">ninenines</span>]}<span style="color: #990000">.</span>

{<span style="color: #FF6600">extended_start_script</span>, <span style="color: #000080">true</span>}<span style="color: #990000">.</span>
{<span style="color: #FF6600">sys_config</span>, <span style="color: #FF0000">"rel/sys.config"</span>}<span style="color: #990000">.</span>

{<span style="color: #FF6600">overlay</span>, [
        {<span style="color: #FF6600">mkdir</span>, <span style="color: #FF0000">"log"</span>},
        {<span style="color: #FF6600">copy</span>, <span style="color: #FF0000">"rel/vm.args"</span>,
                <span style="color: #FF0000">"releases/\{\{release_name\}\}-\{\{release_version\}\}/vm.args"</span>}
]}<span style="color: #990000">.</span></tt></pre></div></div>
<div class="paragraph"><p>The first line defines a release named <code>ninenines</code>, which
has a version number <code>"1"</code> and includes one application, also
named <code>ninenines</code>, although it doesn&#8217;t have to.</p></div>
<div class="paragraph"><p>We then use the <code>extended_start_script</code> option to tell
Relx that we would like to have a start script that allows
us to not only start the release, but do so with the node in the
background, or also to allow us to connect to a running node, and so on.
This start script has the same features as the one tools like
Rebar generates.</p></div>
<div class="paragraph"><p>The rest of the file just makes sure our configuration files are
where we expect them. Relx will automatically take care
of your <em>sys.config</em> file as long as you tell it where to
find it. The <em>vm.args</em> file used by the extended start script
needs to be handled more explicitly by using an overlay however.</p></div>
<div class="paragraph"><p>How does Relx find what applications to include?
By looking at the application dependencies in the <em>.app</em>
file of each OTP application. Make sure you put all dependencies in
there, <em>including</em> library applications, and Relx
will find everything for you.</p></div>
<div class="paragraph"><p>For example, this release includes the following applications.
Only what&#8217;s strictly required.</p></div>
<div class="listingblock">
<div class="content">
<pre><code>compiler-4.9.1  crypto-2.3     kernel-2.16.1    ranch-0.8.3    syntax_tools-1.6.11
cowboy-0.8.5    erlydtl-0.7.0  ninenines-0.2.0  stdlib-1.19.1</code></pre>
</div></div>
<div class="paragraph"><p>The <em>sys.config</em> file is standard and
<a href="http://www.erlang.org/doc/man/config.html">well documented</a>.
The <em>vm.args</em> file is just an optionally multiline file
containing all the flags to pass to the Erlang VM, for example
<code>-name [email protected] -heart</code>.</p></div>
<div class="paragraph"><p>Building OTP releases has always been a difficult task. Until now.</p></div>

</article>
</div>

<div class="span3 sidecol">
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
	
		<li><a href="https://ninenines.eu/articles/the-elephant-in-the-room/">The elephant in the room</a></li>
	
		<li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
	
		<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
	
		<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
	
		<li><a href="https://ninenines.eu/articles/ml-archives/">Mailing list archived</a></li>
	
		<li><a href="https://ninenines.eu/articles/website-update/">Website update</a></li>
	
		<li><a href="https://ninenines.eu/articles/erlanger-playbook-september-2015-update/">The Erlanger Playbook September 2015 Update</a></li>
	
		<li><a href="https://ninenines.eu/articles/erlanger-playbook/">The Erlanger Playbook</a></li>
	
		<li><a href="https://ninenines.eu/articles/erlang-validate-utf8/">Validating UTF-8 binaries with Erlang</a></li>
	
		<li><a href="https://ninenines.eu/articles/on-open-source/">On open source</a></li>
	
		<li><a href="https://ninenines.eu/articles/the-story-so-far/">The story so far</a></li>
	
		<li><a href="https://ninenines.eu/articles/cowboy2-qs/">Cowboy 2.0 and query strings</a></li>
	
		<li><a href="https://ninenines.eu/articles/january-2014-status/">January 2014 status</a></li>
	
		<li><a href="https://ninenines.eu/articles/farwest-funded/">Farwest got funded!</a></li>
	
		<li><a href="https://ninenines.eu/articles/erlang.mk-and-relx/">Build Erlang releases with Erlang.mk and Relx</a></li>
	
		<li><a href="https://ninenines.eu/articles/xerl-0.5-intermediate-module/">Xerl: intermediate module</a></li>
	
		<li><a href="https://ninenines.eu/articles/xerl-0.4-expression-separator/">Xerl: expression separator</a></li>
	
		<li><a href="https://ninenines.eu/articles/erlang-scalability/">Erlang Scalability</a></li>
	
		<li><a href="https://ninenines.eu/articles/xerl-0.3-atomic-expressions/">Xerl: atomic expressions</a></li>
	
		<li><a href="https://ninenines.eu/articles/xerl-0.2-two-modules/">Xerl: two modules</a></li>
	
		<li><a href="https://ninenines.eu/articles/xerl-0.1-empty-modules/">Xerl: empty modules</a></li>
	
		<li><a href="https://ninenines.eu/articles/ranch-ftp/">Build an FTP Server with Ranch in 30 Minutes</a></li>
	
		<li><a href="https://ninenines.eu/articles/tictactoe/">Erlang Tic Tac Toe</a></li>
	
</ul>

<h3>Feedback</h3>
<p>Feel free to <a href="mailto:[email protected]">email us</a>
if you found any mistake or need clarification on any of the
articles.</p>

</div>
</div>
</div>
</div>

      <footer>
        <div class="container">
          <div class="row">
            <div class="span6">
              <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
              <nav>
                <ul>
                  <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
                </ul>
              </nav>
            </div>
            <div class="span6 credits">
               <p><img src="/img/footer_logo.png"></p>
               <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
            </div>
          </div>
        </div>
      </footer>

    
    <script src="/js/custom.js"></script>
  </body>
</html>