]> vaikene.ee Git - evaf/blobdiff - www/pswgen11.html
Finalized tutorial files.
[evaf] / www / pswgen11.html
diff --git a/www/pswgen11.html b/www/pswgen11.html
new file mode 100644 (file)
index 0000000..7fb3f32
--- /dev/null
@@ -0,0 +1,198 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="et" xmlns="http://www.w3.org/1999/xhtml" xml:lang="et">
+
+    <head>
+        <meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
+        <title>eVaf Tutorial - 11 - Building PswGen application</title>
+        <meta name="Author" content="Enar Väikene" />
+        <meta name="description" content="eVaf Tutorial" />
+        <meta name="keywords" content="evaf c++ application development framework tutorial password generator" />
+        <link rel="StyleSheet" href="evaf.css" type="text/css" media="all" />
+        <link rel="StyleSheet" href="highlight.css" type="text/css" media="all" />
+    </head>
+
+    <body>
+
+        <h1>eVaf Tutorial</h1>
+
+        <h2>11 - Buiding PswGen application</h2>
+
+        <h3>CMakeLists.txt</h3>
+
+        <p>Copy an existing <tt>CMakeLists.txt</tt> file from the <tt>Storage</tt> module:</p>
+
+        <pre>evaf/src/apps/PswGen/GUI $ <code>cp ../Storage/CMakeLists.txt .</code></pre>
+
+        <p>We need to modify the <tt>TARGET</tt> variable and remove <tt>QT_USE_QTSQL</tt> and <tt>QT_DONT_USE_QTGUI</tt> variables.
+        This module needs <tt>QtGui</tt> and does not need <tt>QtSql</tt>. Als add <tt>SdiWindow</tt> to the list of eVaf libraries
+        as the module that implements the main window.</p>
+
+        <pre class="hl"><span class="hl com"># Name of the target</span>
+<span class="hl kwa">set</span><span class="hl opt">(</span>TARGET PswGui<span class="hl opt">)</span>
+
+<span class="hl com"># Qt modules</span>
+<span class="hl kwa">include</span><span class="hl opt">(</span><span class="hl kwd">${QT_USE_FILE}</span><span class="hl opt">)</span>
+
+<span class="hl com"># Required eVaf libraries</span>
+<span class="hl kwa">set</span><span class="hl opt">(</span>eVaf_LIBRARIES CommonLib PluginsLib SdiWindow<span class="hl opt">)</span></pre>
+
+        <p>Here is the final <tt>CMakeLists.txt</tt> file:</p>
+
+<pre class="hl"><span class="hl com"># src/apps/PswGen/GUI/CMakeLists.txt</span>
+
+<span class="hl com"># Name of the target</span>
+<span class="hl kwa">set</span><span class="hl opt">(</span>TARGET PswGui<span class="hl opt">)</span>
+
+<span class="hl com"># Qt modules</span>
+<span class="hl kwa">include</span><span class="hl opt">(</span><span class="hl kwd">${QT_USE_FILE}</span><span class="hl opt">)</span>
+
+<span class="hl com"># Include directories</span>
+<span class="hl kwa">include_directories</span><span class="hl opt">(</span><span class="hl kwd">${eVaf_INCLUDE}<span class="hl opt">)</span>
+
+<span class="hl com"># Required eVaf libraries</span>
+<span class="hl kwa">set</span><span class="hl opt">(</span>eVaf_LIBRARIES CommonLib PluginsLib SdiWindow<span class="hl opt">)</span>
+
+<span class="hl com"># Source files</span>
+<span class="hl kwa">set</span><span class="hl opt">(</span>SRCS
+    gui.cpp
+<span class="hl opt">)</span>
+
+<span class="hl com"># Header files for the Qt meta-object compiler</span>
+<span class="hl kwa">set</span><span class="hl opt">(</span>MOC_HDRS
+    gui.h
+<span class="hl opt">)</span>
+
+<span class="hl com"># Version info resource file for Windows builds</span>
+<span class="hl kwa">if</span><span class="hl opt">(</span><span class="hl kwb">WIN32</span><span class="hl opt">)</span>
+    <span class="hl kwa">set</span><span class="hl opt">(</span>SRCS <span class="hl kwd">${SRCS}</span> version.rc<span class="hl opt">)</span>
+<span class="hl kwa">endif</span><span class="hl opt">(</span><span class="hl kwb">WIN32</span><span class="hl opt">)</span>
+
+<span class="hl com"># Run the Qt meta-object compiler</span>
+<span class="hl kwd">qt4_wrap_cpp</span><span class="hl opt">(</span>MOC_SRCS <span class="hl kwd">${MOC_HDRS}</span><span class="hl opt">)</span>
+
+<span class="hl com"># Compile the module</span>
+<span class="hl kwa">add_library</span><span class="hl opt">(</span><span class="hl kwd">${TARGET}</span> <span class="hl kwb">SHARED</span> <span class="hl kwd">${SRCS} ${MOC_SRCS}</span><span class="hl opt">)</span>
+
+<span class="hl com"># Link the module</span>
+<span class="hl kwa">target_link_libraries</span><span class="hl opt">(</span><span class="hl kwd">${TARGET} ${QT_LIBRARIES} ${eVaf_LIBRARIES}</span><span class="hl opt">)</span></pre>
+
+        <p>Open the <tt>CMakeLists.txt</tt> file in the parent directory and add the command to include the <tt>GUI</tt>
+        sub-directory:</p>
+
+        <pre class="hl"><span class="hl com"># src/apps/PswGen/CMakeLists.txt</span>
+<span class="hl com"># ...</span>
+<span class="hl kwa">add_subdirectory</span><span class="hl opt">(</span>GUI<span class="hl opt">)</span></pre>
+
+        <h3>Building the module</h3>
+
+        <p>Go to the previously made <tt>build</tt> directory and build the module:</p>
+
+        <pre>evaf $ <code>cd build</code>
+evaf/build $ <code>make PswGui</code></pre>
+
+        <p>Check the <tt>bin</tt> directory, which should now contain two new libraries:</p>
+
+        <pre>evaf/build $ <code>ls bin</code>
+libCommonLib.so*  libPluginsLib.so*  libPswGen.so*  <b>libPswGui.so*</b>  libPswStorage.so*  <b>libSdiWindow.so*</b>
+evaf/build $</pre>
+
+        <p>The <tt>libSdiWindow.so</tt> library was built because it is a dependency of the <tt>GUI</tt> module.</p>
+
+        <h3>Running the PswGen application</h3>
+
+        <p>In the same <tt>build</tt> directory, create few more sub-directories needed by any <tt>eVaf</tt> applications:</p>
+
+        <pre> evaf/build $ <code>mkdir {etc,log}</code></pre>
+
+        <p>Create the <tt>PswGen.xml</tt> file in the <tt>build/etc</tt> directory. The <tt>PswGen.xml</tt> file defines the
+        application by specifying all the modules that the application needs to load.</p>
+
+        <pre class="hl"><span class="hl kwa">&lt;?xml</span> <span class="hl kwb">version</span>=<span class="hl str">&quot;1.0&quot;</span> <span class="hl kwb">encoding</span>=<span class="hl str">&quot;UTF-8&quot;</span><span class="hl kwa">?&gt;</span>
+<span class="hl kwa">&lt;!DOCTYPE</span> eVaf<span class="hl kwa">&gt;</span>
+<span class="hl kwa">&lt;eVaf</span> <span class="hl kwb">version</span>=<span class="hl str">&quot;1.0&quot;</span><span class="hl kwa">&gt;</span>
+    <span class="hl kwa">&lt;plugins&gt;</span>
+        <span class="hl kwa">&lt;plugin</span> <span class="hl kwb">name</span>=<span class="hl str">&quot;SdiWindow&quot;</span> <span class="hl kwb">filename</span>=<span class="hl str">&quot;SdiWindow&quot;</span> <span class="hl kwa">/&gt;</span>
+        <span class="hl kwa">&lt;plugin</span> <span class="hl kwb">name</span>=<span class="hl str">&quot;Generator&quot;</span> <span class="hl kwb">filename</span>=<span class="hl str">&quot;PswGen&quot;</span> <span class="hl kwa">/&gt;</span>
+        <span class="hl kwa">&lt;plugin</span> <span class="hl kwb">name</span>=<span class="hl str">&quot;Storage&quot;</span> <span class="hl kwb">filename</span>=<span class="hl str">&quot;PswStorage&quot;</span> <span class="hl kwa">/&gt;</span>
+        <span class="hl kwa">&lt;plugin</span> <span class="hl kwb">name</span>=<span class="hl str">&quot;GUI&quot;</span> <span class="hl kwb">filename</span>=<span class="hl str">&quot;PswGui&quot;</span> <span class="hl kwa">/&gt;</span>
+    <span class="hl kwa">&lt;/plugins&gt;</span>
+<span class="hl kwa">&lt;/eVaf&gt;</span></pre>
+
+        <p>Modules are loaded and initialized in the order how they are specified in the xml file. We have to make sure that
+        <tt>SdiWindow</tt>, <tt>Generator</tt> and <tt>Storage</tt> modules are loaded before the <tt>GUI</tt> module. Otherwise
+        their interfaces wouldn't be available when the <tt>GUI</tt> module is initialized.</p>
+
+        <p>The <tt>name</tt> attribute here is optional and will be replaced with the name reported by the actual module.</p>
+
+        <p>The <tt>filename</tt> attribute specifies the name of the library file without prefixes and suffixes meaning that
+        <tt>lib<b>PswGen</b>.so</tt> shall be specified as <tt>PswGen</tt>. This makes sure that the same xml file can be also used
+        on Windows, where the library would be called <tt><b>PswGen</b>.dll</tt>.</p>
+
+        <p>There is no executable file yet that we can run. Build it with the following command:</p>
+
+        <pre>evaf/build $ <code>make eVafGUI</code></pre>
+
+        <p>This command builds the GUI executable and stores it in the <tt>evaf/build/bin</tt> directory. The <tt>bin</tt> directory should look now the following:</p>
+
+        <pre>evaf/build $ <code>ls bin</code>
+eVafGUI*  libCommonLib.so*  libPluginsLib.so*  libPswGen.so*  libPswGui.so*  libPswStorage.so*  libSdiWindow.so*
+evaf/build $</pre>
+
+        <p>Now we can run the PswGen application. Change <tt>--dataroot=${HOME}/evaf/build</tt> to your actual build directory name:</p>
+
+        <pre>evaf/build $ <code>bin/eVafGUI --application=PswGen --dataroot=${HOME}/evaf/build --verbose=INFO</code></pre>
+
+        <p>The <tt>--application=PswGen</tt> command line option specifies the name of the application and also means that the xml file
+        should be called <tt>PswGen.xml</tt>. Different applications can be run in the same build directories by changing the name
+        of the application. The default application is called <tt>eVaf</tt> and if no name is given, then the xml file should be called
+        <tt>eVaf.xml</tt>.</p>
+
+        <p>The <tt>--dataroot=${HOME}/evaf/build</tt> command line option specifies the location of data files for the application. The
+        application assumes that <tt>etc</tt> and <tt>spool</tt> directories are sub-directories in the data root directory. The default
+        data root directory is <tt>${HOME}/.local/share/data</tt> on
+        Linux.</p>
+
+        <p>Finally, the <tt>--verbose=INFO</tt> command line option makes the application to be verbose and output all the info
+        messages to the console.</p>
+
+        <h3>Releasing the PswGen application</h3>
+
+        <p>Now the application is written and tested. We are ready to make a release build and ship it.</p>
+
+        <p>Clean the build directory:</p>
+
+        <pre>evaf/build $ <code>make clean &amp;&amp; rm CMakeCache.txt</code></pre>
+
+        <p>Prepare for a release build and build the application:</p>
+
+        <pre>evaf/build $ <code>cmake -DCMAKE_BUILD_TYPE=Release ..</code>
+evaf/build $ <code>make eVafGUI SdiWindow PswGen PswStorage PswGui</code></pre>
+
+        <p>Packaging and shipping the application is out of the scope of this tutorial and involves more than just copying files that
+        we built. As a minimum, we have to make sure that the target system has Qt libraries installed. In this tutorial, we simply copy the
+        released application into the <tt>{$HOME}/bin/evaf</tt> directory. Qt libraries are already installed and we do not need to
+        worry about them.</p>
+
+        <p>Create the <tt>${HOME}/bin/evaf</tt> directory:</p>
+
+        <pre>evaf/build $ <code>mkdir -p ${HOME}/bin/evaf</code></pre>
+
+        <p>Copy the content of <tt>bin</tt> and </tt>etc</tt> directories</p>
+
+        <pre>evaf/build $ <code>cp -R bin etc ${HOME}/bin/evaf/</code></pre>
+
+        <p>Create the bash script <tt>PswGen</tt> in the <tt>${HOME}/bin</tt> directory:</p>
+
+        <pre class="hl"><span class="hl slc">#!/bin/bash</span>
+EVAF_DIR<span class="hl opt">=</span><span class="hl kwd">${HOME}</span><span class="hl opt">/</span>bin<span class="hl opt">/</span>evaf
+<span class="hl kwd">${EVAF_DIR}</span><span class="hl opt">/</span>bin<span class="hl opt">/</span>eVafGUI <span class="hl opt">--</span>rootdir<span class="hl opt">=</span><span class="hl kwd">${EVAF_DIR}</span> <span class="hl opt">--</span>dataroot<span class="hl opt">=</span><span class="hl kwd">${EVAF_DIR}</span> <span class="hl opt">--</span>application<span class="hl opt">=</span>PswGen
+</pre>
+
+        <p>Don't forget to make it runnable:</p>
+
+        <pre> bin $ <code>chmod a+x PswGen</code></pre>
+
+        <p>Now we can run the application by simply running the bash script <tt>PswGen</tt> in the <tt>${HOME}/bin</tt> directory.
+
+    </body>
+</html>