summaryrefslogblamecommitdiffstats
path: root/articles/erlang.mk-and-relx/index.html
blob: 59ab22ca1f000aa570f17090e92103740fd3daeb (plain) (tree)
1
2
3
4
5
6
7
8
9








                                                                                           

                                                                            
                                                                                                                      
                                                   
































                                                                                                                                                                                   



















                                                                                                                                                                             

                                                     


            




                                                                                                                                                                                                                                                                                                                                                      
                                                                                                              


                                                                                                                                                                                                                                                                    
                                                                                                              



                                                                                                                                                                                                                                                    
                                                                                         


                                            









                                                                                                                                                                                                   
            









                                                                                                                                                                                                                                                                                                                                                            







                                           
                

                



                                                                                                                                       



                                                                                                             



                                                                                                     



                                                                                                                   



                                                                                                                   



                                                                                                                                              



                                                                                                                            



                                                                                                                               



                                                                                                                                



                                                                                                     



                                                                                                   



                                                                                                     



                                                                                               



                                                                                               



                                                                                                   



                                                                                               



                                                                                                                      



                                                                                                                        



                                                                                                     



                                                                                                     



                                                                                                     



                                                                                                     



                                                                                                     





                                                                                                                              
        


                                                                                                                               
        


                                                                                                                      
        


                                                                                                                         
        


                                                                                                 
        


                                                                                                               
        


                                                                                                           
        


                                                                                                                                                                 
        


                                                                                                                     
        


                                                                                                                                        
        


                                                                                                           
        


                                                                                                               
        


                                                                                                                     
        


                                                                                                                     
        


                                                                                                                
        


                                                                                                                                              
        


                                                                                                                                    
        


                                                                                                                                      
        


                                                                                                                   
        


                                                                                                                                  
        


                                                                                                                    
        


                                                                                                                        
        


                                                                                                                                    
        


                                                                                                          
        
























                                                                                                                                                                                                                           
                                                             





                  



                                         
<!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">

    <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=7" 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="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="year">2013</span>
		<span class="day-month">28 May</span>
	</p>
</header>

<p>Building OTP releases has always been a difficult task. Tools like Reltool or Rebar have made this simpler, but it&apos;s no panacea. This article will show you an alternative and hopefully much simpler solution.</p>
<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>
<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>
<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&apos;t require a configuration file. And if you do need one, it will be a pretty small one.</p>
<p>Let&apos;s take a look at the smallest Erlang.mk powered Makefile. There is only one thing required: defining the project name.</p>
<div class="listingblock"><div class="content">source-highlight: could not find a language definition for make
</div></div>
<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>
<p>Let&apos;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 class="listingblock"><div class="content">source-highlight: could not find a language definition for make
</div></div>
<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>
<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>
<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&apos;s take a look at the configuration file for this release.</p>
<div class="listingblock"><div class="content"><!-- Generator: GNU source-highlight 3.1.9
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt>{<font color="#FF6600">release</font>, {<font color="#FF6600">ninenines</font>, <font color="#FF0000">"1"</font>}, [<font color="#FF6600">ninenines</font>]}<font color="#990000">.</font>

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

{<font color="#FF6600">overlay</font>, [
	{<font color="#FF6600">mkdir</font>, <font color="#FF0000">"log"</font>},
	{<font color="#FF6600">copy</font>, <font color="#FF0000">"rel/vm.args"</font>,
		<font color="#FF0000">"releases/\{\{release_name\}\}-\{\{release_version\}\}/vm.args"</font>}
]}<font color="#990000">.</font></tt></pre>
</div></div>
<p>The first line defines a release named <code>ninenines</code>, which has a version number <code>&quot;1&quot;</code> and includes one application, also named <code>ninenines</code>, although it doesn&apos;t have to.</p>
<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>
<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>
<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>
<p>For example, this release includes the following applications. Only what&apos;s strictly required.</p>
<div class="listingblock"><div class="content"><pre>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</pre></div></div>
<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>
<p>Building OTP releases has always been a difficult task. Until now.</p>


</article>
</div>

<div class="span3 sidecol">
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
	
		
	
		
			<li><a href="https://ninenines.eu/articles/merry-christmas-2019/">Merry Christmas 2019: New Beginnings</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/github-sponsors/">GitHub Sponsors</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/cowboy-2.7.0/">Cowboy 2.7</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/gun-2.0.0-pre.1/">Gun 2.0 pre-release 1</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/gun-2.0.0-pre.2/">Gun 2.0 pre-release 2</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/erlang-meetup-10-septembre-2019/">Erlang meetup: 10 septembre 2019</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/ranch-2.0.0-rc.1/">Ranch 2.0 release candidate 1</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/joe_the_rubber_duck/">Joe Armstrong the rubber duck</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/merry-christmas-2018/">Merry Christmas 2018: A Recap</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/cowboy-2.6.0/">Cowboy 2.6</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/ranch-1.7.0/">Ranch 1.7</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/cowboy-2.5.0/">Cowboy 2.5</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/gun-1.3.0/">Gun 1.3</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/gun-1.2.0/">Gun 1.2</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/ranch-1.6.0/">Ranch 1.6</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/gun-1.0.0/">Gun 1.0</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/asciideck/">Asciideck: Asciidoc for Erlang</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/gun-1.0.0-rc.1/">Gun 1.0 release candidate 1</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/cowboy-2.4.0/">Cowboy 2.4</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/cowboy-2.3.0/">Cowboy 2.3</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/cowboy-2.2.0/">Cowboy 2.2</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/cowboy-2.1.0/">Cowboy 2.1</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/cowboy-2.0.0/">Cowboy 2.0</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-rc.2/">Cowboy 2.0 release candidate 2</a></li>
		
	
		
			<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-rc.1/">Cowboy 2.0 release candidate 1</a></li>
		
	
		
			<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-2018</p>
            </div>
          </div>
        </div>
      </footer>

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