lutin/lutin_module.html

180 lines
47 KiB
HTML

<!-- HTML header for doxygen 1.8.8-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- For Mobile Devices -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<title>lutin: build system and packager: Create a new Module:</title>
<!--<link href="tabs.css" rel="stylesheet" type="text/css"/>-->
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { init_search(); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
<script type="text/javascript" src="doxy-boot.js"></script>
</head>
<body>
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand">lutin: build system and packager 2.0.0</a>
</div>
</div>
</nav>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div class="content" id="content">
<div class="container">
<div class="row">
<div class="col-sm-12 panel panel-default" style="padding-bottom: 15px;">
<div style="margin-bottom: 15px;">
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">Create a new Module: </div> </div>
</div><!--header-->
<div class="contents">
<div class="toc"><h3>Table of Contents</h3>
<ul><li class="level1"><a href="#lutin_module_base_file">Base of the module file: </a></li>
<li class="level1"><a href="#lutin_module_library">Create a new Module (LIBRARY): </a></li>
<li class="level1"><a href="#lutin_module_binary">Create a new Module (BINARY): </a><ul><li class="level2"><a href="#lutin_module_binary_base">Generic Binary: </a></li>
<li class="level2"><a href="#lutin_module_binary_tools">Create a new Module (TEST-BINARY / TOOL-BINARY): </a></li>
</ul>
</li>
<li class="level1"><a href="#lutin_module_data">Create a new Module (DATA): </a></li>
<li class="level1"><a href="#lutin_module_internal">Module internal specifications: </a><ul><li class="level2"><a href="#lutin_module_internal_compile">Add file to compile: </a></li>
<li class="level2"><a href="#lutin_module_internal_header">Include directory &amp; install header: </a></li>
<li class="level2"><a href="#lutin_module_internal_depend">Add Sub-dependency: </a></li>
<li class="level2"><a href="#lutin_module_internal_flag">Compilation adn link flags/libs: </a></li>
<li class="level2"><a href="#lutin_module_internal_target_mode">build mode (release/debug): </a></li>
<li class="level2"><a href="#lutin_module_internal_target_type">build type target: </a></li>
<li class="level2"><a href="#lutin_module_internal_data">Add some data in the install path (share path): </a></li>
<li class="level2"><a href="#lutin_module_internal_write_log">display some debug to help writing code: </a></li>
</ul>
</li>
<li class="level1"><a href="#lutin_module_full_template">A Full template: </a></li>
</ul>
</div>
<div class="textblock"><h1><a class="anchor" id="lutin_module_base_file"></a>
Base of the module file: </h1>
<p>To create a new module you will use a generic naming:</p>
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;lutin_module-name.py</div></div><!-- fragment --><p>Replace your <code>module-name</code> with the delivery you want. The name can contain [a-zA-Z0-9-_] values.</p>
<p>In the module name you must define some values:</p>
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;#!/usr/bin/python</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;import lutin.module as module</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;import lutin.tools as tools</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;# A simple list of type:</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;# - BINARY</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;# - BINARY_SHARED</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;# - BINARY_STAND_ALONE</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;# - LIBRARY</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;# - LIBRARY_DYNAMIC</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;# - LIBRARY_STATIC</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;# - PACKAGE</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;# - PREBUILD</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;# - DATA</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;def get_type():</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; return &quot;LIBRARY&quot;</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;# simple description of the module that appear in the &#39;lutin -h&#39;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;# Note: this fucntion is optionnal.</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;def get_desc():</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; return &quot;Ewol tool kit&quot;</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;# type of licence:</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;# &quot;APACHE-2&quot;</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;# &quot;BSD-1&quot; / &quot;BSD-2&quot; / &quot;BSD-3&quot; / &quot;BSD-4&quot;</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;# &quot;GPL-1&quot; / &quot;GPL-2&quot; / &quot;GPL-3&quot;</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;# &quot;LGPL-1&quot; / &quot;LGPL-2&quot; / &quot;LGPL-3&quot;</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;# PROPRIETARY</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;# ...</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;# Note: this fucntion is optionnal.</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;def get_licence():</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; return &quot;APACHE-2&quot;</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;# type of compagny that provide the software:</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;# com : Commercial</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;# net : Network??</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;# org : Organisation</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;# gov : Governement</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;# mil : Military</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;# edu : Education</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;# pri : Private</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;# museum : ...</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;# ...</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;# Note: this fucntion is optionnal.</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;def get_compagny_type():</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; return &quot;com&quot;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;# Name of the compagny</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;# Note: this fucntion is optionnal.</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;def get_compagny_name():</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; return &quot;hello-compagny&quot;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;# People to contact if a problem appear in the build system / library</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;# Note: this fucntion is optionnal.</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;def get_maintainer():</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; return [&quot;Mr NAME SurName &lt;my-email@group.com&gt;&quot;]</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;# Version of the library</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;# Note: this fucntion is optionnal.</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;def get_version():</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; return [0,9,&quot;dev&quot;]</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;# create the module</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;# @param[in] target reference on the Target that is currently build</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;# @param[in] module_name Name of the module that is extract from the file name (to be generic)</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;def create(target, module_name):</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; my_module = module.Module(__file__, module_name, get_type())</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; ...</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; return my_module</div></div><!-- fragment --><p>Thes it is simple to specify build for:</p>
<h1><a class="anchor" id="lutin_module_library"></a>
Create a new Module (LIBRARY): </h1>
<p>What to change: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def get_type():</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; return &quot;LIBRARY&quot;</div></div><!-- fragment --><p>By default the library is compile in shared and static. The binary select the mode it prefer...</p>
<p>You can force the library to be compile as a dll/so: <code>LIBRARY_DYNAMIC</code> or a basic include lib: .a <code>LIBRARY_STATIC</code></p>
<h1><a class="anchor" id="lutin_module_binary"></a>
Create a new Module (BINARY): </h1>
<h2><a class="anchor" id="lutin_module_binary_base"></a>
Generic Binary: </h2>
<p>What to change: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def get_type():</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; return &quot;BINARY&quot;</div></div><!-- fragment --><p> The Binay is compile by default target mode (note that the IOs target generate a single .so with all the library inside)</p>
<p>You can force the Binary to be use dynamic library when possible: <code>BINARY_SHARED</code> or create a single binary with no .so depenency: <code>BINARY_STAND_ALONE</code></p>
<h2><a class="anchor" id="lutin_module_binary_tools"></a>
Create a new Module (TEST-BINARY / TOOL-BINARY): </h2>
<p>Two binary are really usefull in developpement, the tools and the test-unit, This is the reason why we specify for this 2 cases.</p>
<p>Add the subElement description: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def get_type():</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; return &quot;BINARY&quot;</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;def get_sub_type():</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160; return &quot;TEST&quot;</div></div><!-- fragment --><p> or: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def get_type():</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; return &quot;BINARY&quot;</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;def get_sub_type():</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160; return &quot;TOOL&quot;</div></div><!-- fragment --><h1><a class="anchor" id="lutin_module_data"></a>
Create a new Module (DATA): </h1>
<p>This pode permit to only copy data and no dependency with compilling system</p>
<p>What to change: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def get_type():</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; return &quot;DATA&quot;</div></div><!-- fragment --><h1><a class="anchor" id="lutin_module_internal"></a>
Module internal specifications: </h1>
<h2><a class="anchor" id="lutin_module_internal_compile"></a>
Add file to compile: </h2>
<p>This is simple: (you just need to specify all the file to compile)</p>
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def create(target, module_name):</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; ...</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160; # add the file to compile:</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160; my_module.add_src_file([</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; &#39;module-name/file1.cpp&#39;,</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; &#39;module-name/file2.cpp&#39;,</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; &#39;module-name/file3.S&#39;</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; ])</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; ...</div></div><!-- fragment --><h2><a class="anchor" id="lutin_module_internal_header"></a>
Include directory &amp; install header: </h2>
<p>A big point to understand is that your library will be used by an other module, then it need to use headers.</p>
<p>The developper must isolate the external include and internal include, then lutin "install" the header and add the "install" header path to build the local library. This permit to check error inclusion directly in developpement and separate the <code>#include "XXX.h"</code> and the <code>#include &lt;lib-xxx/XXX.h&gt;</code></p>
<p>Add file to external include: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def create(target, module_name):</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; ...</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160; my_module.add_header_file([</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160; &#39;module-name/file1.h&#39;,</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; &#39;module-name/file2.h&#39;</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; ])</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; ...</div></div><!-- fragment --><p>You can add a path to your local include: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def create(target, module_name):</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; ...</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160; my_module.add_path(os.path.join(tools.get_current_path(__file__), &quot;lib-name&quot;))</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; ...</div></div><!-- fragment --><h2><a class="anchor" id="lutin_module_internal_depend"></a>
Add Sub-dependency: </h2>
<p>All library need to add at minimum of a simple library (C lib) and other if needed. To do it jus call: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def create(target, module_name):</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; ...</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160; # add dependency of the generic C library:</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160; my_module.add_module_depend(&#39;c&#39;)</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; # add dependency of the generic C++ library:</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; my_module.add_module_depend(&#39;cxx&#39;)</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; # add dependency of the generic math library:</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; my_module.add_module_depend(&#39;m&#39;)</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; # or other user lib:</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; my_module.add_module_depend(&#39;lib-name&#39;)</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; ...</div></div><!-- fragment --><p>The system can have optinnal sub-library, then if you just want to add an optionnal dependency: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def create(target, module_name):</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; ...</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160; # Add an optionnal dependency (set flag in CPP build if the subLib exist) ==&gt; flag is locally set</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160; my_module.add_optionnal_module_depend(&#39;z&#39;, [&quot;c++&quot;, &quot;-DLIB_NAME_BUILD_ZLIB&quot;])</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; # Add an optionnal dependency (set flag in CPP build if the subLib exist) ==&gt; flag is exported in external upper build</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; my_module.add_optionnal_module_depend(&#39;z&#39;, [&quot;c++&quot;, &quot;-DLIB_NAME_BUILD_ZLIB&quot;], export=True)</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; ...</div></div><!-- fragment --><h2><a class="anchor" id="lutin_module_internal_flag"></a>
Compilation adn link flags/libs: </h2>
<p>It is possible to define local and external flags (external are set internal too): </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def create(target, module_name):</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; ...</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160; # external flags:</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160; my_module.add_flag(&#39;link-lib&#39;, &quot;pthread&quot;, export=True)</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160; my_module.add_flag(&#39;c++&#39;, &quot;-DHELLO_FLAG=\&quot;kljlkj\&quot;&quot;, export=True)</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; # internal flags:</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; my_module.add_flag(&#39;c&#39;, &quot;-DMODE_RELEASE&quot;)</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; ...</div></div><!-- fragment --><h2><a class="anchor" id="lutin_module_internal_target_mode"></a>
build mode (release/debug): </h2>
<p>To add somes element dependent of the build mode: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def create(target, module_name):</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; ...</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160; if target.get_mode() == &quot;release&quot;:</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160; pass</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; else:</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; pass</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; ...</div></div><!-- fragment --><h2><a class="anchor" id="lutin_module_internal_target_type"></a>
build type target: </h2>
<p>To add somes element dependent of the target type:</p>
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def create(target, module_name):</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; ...</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160; if &quot;Windows&quot; in target.get_type():</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160; pass</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; elif &quot;MacOs&quot; in target.get_type():</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; pass</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; elif &quot;IOs&quot; in target.get_type():</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; pass</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; elif &quot;Linux&quot; in target.get_type():</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; pass</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; elif &quot;Android&quot; in target.get_type():</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; pass</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; ...</div></div><!-- fragment --><p>The target get_type return a list of type that represent the hiararchy dependency, a simple example:</p>
<p>A "Debian" herited of a "Linux" then it will return ["Linux", "Debian"]</p>
<h2><a class="anchor" id="lutin_module_internal_data"></a>
Add some data in the install path (share path): </h2>
<p>You can install a simple file:</p>
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def create(target, module_name):</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; ...</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160; # copy file in the share/binanyName/ path (no sub path)</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160; my_module.copy_path(&#39;data/icon.svg&#39;)</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; ...</div></div><!-- fragment --><p>Copy multiple files (change path)</p>
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;def create(target, module_name):</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; ...</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160; my_module.copy_path(&#39;data/*&#39;, &#39;destinationPath&#39;)</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; ...</div></div><!-- fragment --><h2><a class="anchor" id="lutin_module_internal_write_log"></a>
display some debug to help writing code: </h2>
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;import lutin.debug as debug</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;def function(...):</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160; debug.error(&quot;comment that stop the build&quot;)</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; debug.warning(&quot;comment that print a simple warning&quot;)</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; debug.info(&quot;comment that print a simple information&quot;)</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; debug.debug(&quot;comment that print a simple debug&quot;)</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; debug.verbose(&quot;comment that print a simple verbose&quot;)</div></div><!-- fragment --><h1><a class="anchor" id="lutin_module_full_template"></a>
A Full template: </h1>
<p>Create the file: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;lutin_module-name.py</div></div><!-- fragment --><p>With: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;#!/usr/bin/python</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;import lutin.module as module</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;import lutin.tools as tools</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;import lutin.debug as debug</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;import os</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;# A simple list of type:</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;# - BINARY</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;# - BINARY_SHARED</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;# - BINARY_STAND_ALONE</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;# - LIBRARY</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;# - LIBRARY_DYNAMIC</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;# - LIBRARY_STATIC</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;# - PACKAGE</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;# - PREBUILD</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;# - DATA</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;def get_type():</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; return &quot;LIBRARY&quot;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;# simple description of the module that appear in the &#39;lutin -h&#39;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;# Note: this fucntion is optionnal.</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;def get_desc():</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; return &quot;Descriptiuon of the PROGRAMM&quot;</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;# type of licence:</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;# &quot;APACHE-2&quot;</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;# &quot;BSD-1&quot; / &quot;BSD-2&quot; / &quot;BSD-3&quot; / &quot;BSD-4&quot;</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;# &quot;GPL-1&quot; / &quot;GPL-2&quot; / &quot;GPL-3&quot;</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;# &quot;LGPL-1&quot; / &quot;LGPL-2&quot; / &quot;LGPL-3&quot;</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;# PROPRIETARY</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;# ...</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;# Note: this fucntion is optionnal.</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;def get_licence():</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; return &quot;PROPRIETARY&quot;</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;# type of compagny that provide the software:</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;# com : Commercial</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;# net : Network??</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;# org : Organisation</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;# gov : Governement</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;# mil : Military</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;# edu : Education</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;# pri : Private</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;# museum : ...</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;# ...</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;# Note: this fucntion is optionnal.</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;def get_compagny_type():</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; return &quot;com&quot;</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;# Name of the compagny</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;# Note: this fucntion is optionnal.</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;def get_compagny_name():</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; return &quot;hello-compagny&quot;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;# People to contact if a problem appear in the build system / library</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;# Note: this fucntion is optionnal.</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;def get_maintainer():</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; return [&quot;Mr NAME SurName &lt;my-email@group.com&gt;&quot;]</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;# Version of the library</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;# Note: this fucntion is optionnal.</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;def get_version():</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; return [0,1,&quot;dev&quot;]</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;# create the module</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;# @param[in] target reference on the Target that is currently build</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;# @param[in] module_name Name of the module that is extract from the file name (to be generic)</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;def create(target, module_name):</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; my_module = module.Module(__file__, module_name, get_type())</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; # add the file to compile:</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; my_module.add_src_file([</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; &#39;module-name/file1.cpp&#39;,</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; &#39;module-name/file2.cpp&#39;,</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; &#39;module-name/file3.S&#39;</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; ])</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; my_module.add_header_file([</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; &#39;module-name/file1.h&#39;,</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; &#39;module-name/file2.h&#39;</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; ])</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; my_module.add_path(os.path.join(tools.get_current_path(__file__), &quot;lib-name&quot;))</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; # add dependency of the generic C library:</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; my_module.add_module_depend(&#39;c&#39;)</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; # add dependency of the generic C++ library:</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; my_module.add_module_depend(&#39;cxx&#39;)</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; # add dependency of the generic math library:</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; my_module.add_module_depend(&#39;m&#39;)</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; # or other user lib:</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; my_module.add_module_depend([</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; &#39;lib-name1&#39;,</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; &#39;lib-name2&#39;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; ])</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; # Add an optionnal dependency (set flag in CPP build if the subLib exist) ==&gt; flag is locally set</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; my_module.add_optionnal_module_depend(&#39;z&#39;, [&quot;c++&quot;, &quot;-DLIB_NAME_BUILD_ZLIB&quot;])</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; # Add an optionnal dependency (set flag in CPP build if the subLib exist) ==&gt; flag is exported in external upper build</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; my_module.add_optionnal_module_depend(&#39;z&#39;, [&quot;c++&quot;, &quot;-DLIB_NAME_BUILD_ZLIB&quot;], export=True)</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; # external flags:</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; my_module.add_flag(&#39;link-lib&#39;, &quot;pthread&quot;, export=True)</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; my_module.add_flag(&#39;c++&#39;, &quot;-DHELLO_FLAG=\&quot;kljlkj\&quot;&quot;, export=True)</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; # internal flags:</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; my_module.add_flags(&#39;c&#39;, &quot;-DMODE_RELEASE&quot;)</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; if target.get_mode() == &quot;release&quot;:</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; pass</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; else:</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; pass</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; if &quot;Windows&quot; in target.get_type():</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; pass</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; elif &quot;MacOs&quot; in target.get_type():</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; pass</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; elif &quot;IOs&quot; in target.get_type():</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; pass</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; elif &quot;Linux&quot; in target.get_type():</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; pass</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; elif &quot;Android&quot; in target.get_type():</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; pass</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; # copy file in the share/binanyName/ path (no sub path)</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; my_module.copy_path(&#39;data/icon.svg&#39;)</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; my_module.copy_path(&#39;data/*&#39;, &#39;destinationPath&#39;)</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; return my_module</div></div><!-- fragment --><p><b>Index:</b></p><ul>
<li>mainpage</li>
<li><a class="el" href="lutin_concept.html">Basic concept</a></li>
<li><a class="el" href="lutin_use.html">How to use lutin</a></li>
<li><a class="el" href="lutin_module.html">Create a new Module:</a> </li>
</ul>
</div></div><!-- contents -->
<!-- HTML footer for doxygen 1.8.8-->
<!-- start footer part -->
</div>
</div>
</div>
</div>
</div>
<hr class="footer"/><address class="footer"><small>
Generated on Fri Sep 9 2016 12:15:03 for lutin: build system and packager by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.11
</small></address>
</body>
</html>