<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>zInformatik &#187; Makefile</title>
	<atom:link href="http://zinformatik.de/tag/makefile/feed/" rel="self" type="application/rss+xml" />
	<link>http://zinformatik.de</link>
	<description>Computer, Informatik und Mikrocontroller Blog</description>
	<lastBuildDate>Sat, 22 Oct 2011 09:51:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>NaturalDocs &#8211; Quelltexte natürlich dokumentieren</title>
		<link>http://zinformatik.de/programmieren/naturaldocs-quelltexte-naturlich-dokumentieren/</link>
		<comments>http://zinformatik.de/programmieren/naturaldocs-quelltexte-naturlich-dokumentieren/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 14:14:03 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[ADA]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Makefile]]></category>
		<category><![CDATA[NaturalDocs]]></category>
		<category><![CDATA[Pascal]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[TCL]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1374</guid>
		<description><![CDATA[<div id="attachment_1412" class="wp-caption alignright" style="width: 205px"><a href="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs_big.png" class="liimagelink"><img src="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs_big-195x300.png" alt="NaturalDocs Dokuementation des zBot" title="NaturalDocs Dokuementation des zBot" width="195" height="300" class="size-medium wp-image-1412" /></a><p class="wp-caption-text">NaturalDocs Dokuementation des zBot</p></div>Da mir POD/PerlDoc nicht gefällt, habe ich mich vor einiger Zeit auf die Suche nach einer Alternative gemacht und bin auf <a href="http://www.naturaldocs.org" title="NaturalDocs" target="_blank" class="liexternal">NaturalDocs</a> gestoßen. Mit diesem System können eine ganze Reihe von Programmiersprachen dokumentiert werden, wie z.B. perl, C#, c++, Makefiles, Ruby, Python, PHP, ActionScript, Java, JavaScript, Pascal, ADA,<p>&#8230;</p>]]></description>
			<content:encoded><![CDATA[<div id="attachment_1412" class="wp-caption alignright" style="width: 205px"><a href="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs_big.png" class="liimagelink"><img src="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs_big-195x300.png" alt="NaturalDocs Dokuementation des zBot" title="NaturalDocs Dokuementation des zBot" width="195" height="300" class="size-medium wp-image-1412" /></a><p class="wp-caption-text">NaturalDocs Dokuementation des zBot</p></div>Da mir POD/PerlDoc nicht gefällt, habe ich mich vor einiger Zeit auf die Suche nach einer Alternative gemacht und bin auf <a href="http://www.naturaldocs.org" title="NaturalDocs" target="_blank" class="liexternal">NaturalDocs</a> gestoßen. Mit diesem System können eine ganze Reihe von Programmiersprachen dokumentiert werden, wie z.B. perl, C#, c++, Makefiles, Ruby, Python, PHP, ActionScript, Java, JavaScript, Pascal, ADA, TCL, &#8230;</p>
<p>Sehr schön an NaturalDocs ist, dass die Dokumentation sehr nahe an natürlichsprachlichem Plaintext ist und sich die Beschreibungen von Klassen oder Methoden auch sehr gut aus den Quellen lesen lässt ohne dass man die Syntax von NaturalDocs kennen muss. Auch einfache Textdateien wie eine Readme oder ähnliches können damit erstellt werden. So kann man (zumindest bei kleineren Projekten) sogar sämtliche Dokumente wie Anforderungen, UML-Diagramme, &#8230; mit NaturalDocs erstellen, wodurch man alle Informationen an einem Ort gebündelt und in einem einheitlichen Format vorliegen hat.</p>
<p>Das Perl-Tool versteht auch JavaDoc, so dass eine Umstellung erleichtert wird.</p>
<p>Gestartet wird NaturalDocs mittels:<br />
<code>NaturalDocs -i [input (source) directory]<br />
            -o [output format] [output directory]<br />
            -p [project directory]<br />
            [options]</code><br />
wobei ich mir ein kleines Script zum erstellen/aktualisieren der Dokumentation erstellt habe, welches ein Changelog beinhaltet, welches aus einem <code>svn log</code> automatisch generiert wird. Das Script habe ich unten angehängt.</p>
<p>Ein Beispiel in perl:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># SUB: multiplicate</span>
<span style="color: #666666; font-style: italic;"># </span>
<span style="color: #666666; font-style: italic;"># multiplicates two numbers</span>
<span style="color: #666666; font-style: italic;"># </span>
<span style="color: #666666; font-style: italic;"># PARAMETERS:</span>
<span style="color: #666666; font-style: italic;"># $a - first parameter</span>
<span style="color: #666666; font-style: italic;"># $b - second parameter</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># RETURNS:</span>
<span style="color: #666666; font-style: italic;"># the product of $a and $b</span>
<span style="color: #000000; font-weight: bold;">sub</span> multiplicate <span style="color: #009900;">&#123;</span>
    <span style="color: #0000ff;">$a</span><span style="color: #339933;">=</span><span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$b</span><span style="color: #339933;">=</span><span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$a</span><span style="color: #0000ff;">*$b</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>So sieht die Dokumentation einer einfachen Funktion aus. Bei Sprachen die full language support besitzen (bisher perl, ActionScript und C#) kann auch eine JavDoc-artige Dokumentation genutzt werden:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">##</span>
<span style="color: #666666; font-style: italic;"># multiplicates two numbers</span>
<span style="color: #666666; font-style: italic;"># </span>
<span style="color: #666666; font-style: italic;"># PARAMETERS:</span>
<span style="color: #666666; font-style: italic;"># $a - first parameter</span>
<span style="color: #666666; font-style: italic;"># $b - second parameter</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># RETURNS:</span>
<span style="color: #666666; font-style: italic;"># the product of $a and $bsub multiplicate {</span>
    <span style="color: #0000ff;">$a</span><span style="color: #339933;">=</span><span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$b</span><span style="color: #339933;">=</span><span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$a</span><span style="color: #0000ff;">*$b</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Beide Beispiele haben das selbe Ergebnis:<br />
<div id="attachment_1401" class="wp-caption aligncenter" style="width: 439px"><a href="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs.png" class="liimagelink"><img src="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs.png" alt="NaturalDocs Beispiel" title="NaturalDocs Beispiel" width="429" height="350" class="size-full wp-image-1401" /></a><p class="wp-caption-text">NaturalDocs Beispiel</p></div>
<p>Listen können erstellt werden, indem eine Zeile mit &#8220;<code>-</code>&#8221; angefangen wird. Definitionen haben ein &#8220;<code>-</code>&#8221; zwischen Bezeichner und Definition. Es können auch Grafiken, Beispielquelltexte und ASCII-Diagramme eingefügt werden.</p>
<p>Leider kann NaturalDocs von Haus aus nicht mit Listen in Listen umgehen, doch dafür gibt es einen Patch: <a href="http://sourceforge.net/tracker/index.php?func=detail&#038;aid=1371134&#038;group_id=81796&#038;atid=564052" title="NaturalDocs Patch - Nested Bullet Lists" target="_blank" class="liexternal">Nested Bullets</a>, womit man durch <code>+</code> oder <code>*</code> eine Liste in der Liste einleitet.<br />
Installiert wird es, indem die Datei Native.pm.diff nach $NATURALDOCS_PATH/Modules/NaturalDocs/Parser Kopiert wird und dann der Befehl</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">patch</span> Native.pm Native.pm.diff</pre></div></div>

<p>aufgerufen wird.</p>
<p>Einen neuen Absatz erzwingt man durch eine Leerzeile. Eine Überschrift kann mittels <code># Überschrift:</code> eingefügt werden, wobei die Zeile darüber leer sein muss.<br />
Es kann auch auf Webseiten, Emailadressen und andere Stellen der Dokumentation verlinkt werden.<br />
Natürlich kann auch unterstrichen und fett geschrieben werden. Die Zusammenfassung wird automatisch erstellt. </p>
<p>Cool ist auch die Möglichkeit der Abkürzung, womit man mehrere Defines, Funktionen oder Variablen zusammenfassend dokumentieren kann. So kann man statt dem folgenden Code</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># VARIABLE: $configFile</span>
<span style="color: #666666; font-style: italic;"># Filename of configuration file</span>
<span style="color: #0000ff;">$configFile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;config.txt&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># VARIABLE: $inputFile</span>
<span style="color: #666666; font-style: italic;"># Filename of input file</span>
<span style="color: #0000ff;">$inputFile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;input.txt&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># VARIABLE: $outputFile</span>
<span style="color: #666666; font-style: italic;"># Filename of output file</span>
<span style="color: #0000ff;">$outputFile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;out.txt&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>die Variablen für die Dateinamen zusammen fassen:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># VARIABLES: Filenames</span>
<span style="color: #666666; font-style: italic;"># $configFile - Filename of configuration file</span>
<span style="color: #666666; font-style: italic;"># $inputFile - Filename of input file</span>
<span style="color: #666666; font-style: italic;"># $outputFile - Filename of output file</span>
<span style="color: #0000ff;">$configFile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;config.txt&quot;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$inputFile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;input.txt&quot;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$outputFile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;out.txt&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Dabei können mehrere solcher Blöcke für verschiedene Belange angelegt werden (z.B. Dateinamen, Logindaten für Datenbank, &#8230;). Das Ergebnis sieht dann so aus:<br />
<div id="attachment_1410" class="wp-caption aligncenter" style="width: 394px"><a href="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs2.png" class="liimagelink"><img src="http://zinformatik.de/wp-content/uploads/2009/06/naturaldocs2.png" alt="NaturalDocs - Variablen zusammenfassend dokumentiert" title="NaturalDocs - Variablen zusammenfassend dokumentiert" width="384" height="195" class="size-full wp-image-1410" /></a><p class="wp-caption-text">NaturalDocs - Variablen zusammenfassend dokumentiert</p></div></p>
<p>Auch mein <a href="http://zinformatik.de/tipps-tricks/interessante-programme/zbot-ein-jabber-bot-in-perl/" title="zBot - ein Jabber Bot in Perl" target="_self" class="liinternal">Jabber Bot zBot</a> ist mit NaturalDocs dokumentiert. Als Beispiel kann man sich <a href="http://zinformatik.de/zbotdoc/index.html" title="Dokumentation zBot Version 0.2" target="_blank" class="liinternal">dessen Dokumentation</a> ansehen.</p>
<p>Für Neulinge gibt es ein schönes <a href="http://www.naturaldocs.org/documenting/walkthrough.html" title=" NaturalDocs - Walpthrough" target="_blank" class="liexternal">Walktrough</a>, wo die ersten Schritte mit NaturalDocs erklärt werden.</p>
<p>Hier noch das Script, welches eine von NaturalDocs lesbare Changelist im Ordner documents  und dann die Dokumentation selbst erstellt:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Script: makedocs.pl</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># This script generates the documentation.</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Requirements:</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># - NaturalDocs path must be in ENV variable $NATURALDOCS_PATH</span>
<span style="color: #666666; font-style: italic;"># - Projectdirectory naturaldocs has to be in the same directory as this script</span>
<span style="color: #666666; font-style: italic;"># - There must be a (empty) directory documentation in the same directory as this script</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Usage:</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Just start this script when something has changed or use the script &lt;make.pl&gt;</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># &gt; tools/makedocs.pl [OPTIONS]</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Options:</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;">#  -o - start makedocs.pl in offline modus</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># In offlinemode the changelog is not generated</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># SVN:</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Commit only the textfiles of the projectdirectory (Not the directory &quot;Data&quot;) from NaturalDocs.</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># The documentation directory should be an empty dir in SVN.</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># So everybody can create the documentation by himself just by executing this script.</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> vars <span style="color: #000066;">qw</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">%ENV</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Sub: generatechangelog</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Generates documents/changelog.txt from svn log -v</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #000000; font-weight: bold;">sub</span> generatechangelog <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Generating changelog...n&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$ENV</span><span style="color: #009900;">&#123;</span>LANG<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;C&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$log</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">`svn log -v`</span><span style="color: #339933;">;</span> 
&nbsp;
    <span style="color: #0000ff;">$log</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/(-){2,}//g</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$log</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/(r[0-9]{1,4})/$1:nn$1/g</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$log</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/n/nn/g</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$log</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/Pfade:/Pfade/g</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$log</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/paths:/paths/g</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$log</span> <span style="color: #339933;">=~</span> <span style="color: #000066;">s</span><span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span>A<span style="color: #339933;">-</span>Z<span style="color: #009900;">&#93;</span> <span style="color: #339933;">/</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/-</span> <span style="color: #0000ff;">$1</span><span style="color: #339933;">/</span>g<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span>DATEI<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;&gt;documents/changelog.txt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">print</span> DATEI <span style="color: #ff0000;">&quot;Title: Changelognn$log&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">close</span> DATEI<span style="color: #339933;">;</span>
    <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Done.n&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">######### PROGRAM START ############</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066;">defined</span> <span style="color: #0000ff;">$ENV</span><span style="color: #009900;">&#123;</span>NATURALDOCS_PATH<span style="color: #009900;">&#125;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #0000ff;">$ENV</span><span style="color: #009900;">&#123;</span>NATURALDOCS_PATH<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">ne</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    generatechangelog<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">not</span><span style="color: #009900;">&#40;</span><span style="color: #000066;">defined</span> <span style="color: #339933;">@</span><span style="color: #000000; font-weight: bold;">ARGV</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #0000ff;">$ARGV</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">&quot;-o&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;"># Generate documentation of current directory in HTML and save to directory documentation. Projectdirectory is naturaldocs.</span>
<span style="color: #666666; font-style: italic;"># Ignore directory tests</span>
    <span style="color: #000066;">system</span>
<span style="color: #ff0000;">&quot;$ENV{NATURALDOCS_PATH}/NaturalDocs -i . -o HTML ./documentation -p ./naturaldocs -xi ./tests&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Environment variable $NATURALDOCS_PATH not defined!n&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/programmieren/naturaldocs-quelltexte-naturlich-dokumentieren/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tools zur VHDL Entwicklung in der Linux Konsole</title>
		<link>http://zinformatik.de/linux/tools-zur-vhdl-entwicklung-in-der-linux-konsole/</link>
		<comments>http://zinformatik.de/linux/tools-zur-vhdl-entwicklung-in-der-linux-konsole/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 13:06:49 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[FPGA, CPLD und VHDL]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Konsole]]></category>
		<category><![CDATA[make]]></category>
		<category><![CDATA[Makefile]]></category>
		<category><![CDATA[VHDL]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=835</guid>
		<description><![CDATA[<p>Wie <a href="http://zinformatik.de/tipps-tricks/vim-tipps/vhdl-coding-mit-vim/" title="VHDL Coding mit vim" target="_self" class="liinternal">versprochen</a> hier ein Toolset zu VHDL in der Linux Konsole.</p>
<p>Um sich das ganze geklicke zum Synthetisieren und Implementieren unter ISE zu ersparen, hat Torsten Meißner ein <a href="http://editthis.info/freefpga/Linux" title="Makefile mit Batch Dateien" target="_blank" class="liexternal">Makefile mit einigen Batch Dateien</a> erstellt, die von Simon Schulz erweitert wurden. Auf seiner <a href="http://avr.auctionant.de/vhdl/xilinx_fpga_makefile_linux.html" title="Makefile und&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Wie <a href="http://zinformatik.de/tipps-tricks/vim-tipps/vhdl-coding-mit-vim/" title="VHDL Coding mit vim" target="_self" class="liinternal">versprochen</a> hier ein Toolset zu VHDL in der Linux Konsole.</p>
<p>Um sich das ganze geklicke zum Synthetisieren und Implementieren unter ISE zu ersparen, hat Torsten Meißner ein <a href="http://editthis.info/freefpga/Linux" title="Makefile mit Batch Dateien" target="_blank" class="liexternal">Makefile mit einigen Batch Dateien</a> erstellt, die von Simon Schulz erweitert wurden. Auf seiner <a href="http://avr.auctionant.de/vhdl/xilinx_fpga_makefile_linux.html" title="Makefile und Tools für die Benutzung der Xilinx ISE unter Linux" target="_blank" class="liexternal">Website</a> kann man sie herunter laden (und darauf beziehe ich mich im Folgenden).</p>
<p>Wenn das Archiv entpackt ist, kann man seine vhd Dateien in den Ordner ./rtl kopieren. In der Datei ./config/settings werden grundlegende Einstellungen vorgenommen. Die ucf-Datei kommt in das Verzeichnis ./layout.</p>
<p>Nach einem <em>make project</em> sollte eigentlich alles Funktionieren. Jedoch wird in den Dateien ./syn/src/implement.sh und ./syn/src/synthesize.sh die nichtexistente Datei ~/Xillinx/settings.sh importiert, die einige Umgebungsvariablen definieren soll. Diese Definitionen habe ich einfach statt dem Aufruf der Datei in dei beiden Dateien geschrieben. Der Pfad zum ISE Verzeichnis muss entsprechend angepasst werden:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#set envirement for ise</span>
<span style="color: #666666; font-style: italic;">#. ~/Xilinx/settings.sh</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PLATFORM</span>=lin
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">XILINX</span>=<span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>ISE
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LMC_HOME</span>=<span style="color: #800000;">${XILINX}</span><span style="color: #000000; font-weight: bold;">/</span>smartmodel<span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${PLATFORM}</span><span style="color: #000000; font-weight: bold;">/</span>installed_lin
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #800000;">${XILINX}</span><span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${PLATFORM}</span>:<span style="color: #800000;">${PATH}</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LD_LIBRARY_PATH</span>=<span style="color: #800000;">${XILINX}</span><span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${PLATFORM}</span>:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>X11R6<span style="color: #000000; font-weight: bold;">/</span>lib
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">NPX_PLUGIN_PATH</span>=<span style="color: #800000;">${XILINX}</span><span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${PLATFORM}</span><span style="color: #000000; font-weight: bold;">/</span>jre<span style="color: #000000; font-weight: bold;">/</span>plugin<span style="color: #000000; font-weight: bold;">/</span>i386<span style="color: #000000; font-weight: bold;">/</span>ns4
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">myxilinxrc</span>=<span style="color: #800000;">${HOME}</span><span style="color: #000000; font-weight: bold;">/</span>.qt<span style="color: #000000; font-weight: bold;">/</span>xilinxrc</pre></div></div>

<p>In der Makefile hat das Target bitup bei mir nicht funktioniert, da ich die libusb-driver benuzte. Daher hab ich das Ziel durch folgendes ersetzt (der Pfad zu ISE muss entsprechend angepasst werden):</p>

<div class="wp_syntax"><div class="code"><pre class="make" style="font-family:monospace;"><span style="color: #339900; font-style: italic;">#upload bit to fpga</span>
bitup <span style="color: #004400;">:</span>
    bash <span style="color: #004400;">-</span>c <span style="color: #CC2200;">'export LD_PRELOAD=/usr/lib/libusb-driver.so; /path/to/ISE/bin/lin/impact -batch impact/impact_upload_bit.cmd'</span></pre></div></div>

<p>Da das Makefile im Verzeichnis ./syn/src liegt, die vhd Dateien jedoch in ./rtl ist ein Aufruf von make aus vim heraus nur umständlich möglich. Daher habe ich ein kleines Makefile generiert, welches man ins Verzeichnis ./rtl kopieren kann.<br />
Es wechselt für jedes Ziel das Verzeichnis und ruft das echte Makefile mit dem entsprechenden Ziel auf:</p>

<div class="wp_syntax"><div class="code"><pre class="make" style="font-family:monospace;"><span style="color: #339900; font-style: italic;">#rule for synthesis</span>
syn <span style="color: #004400;">:</span>
    cd <span style="color: #004400;">../</span>syn<span style="color: #004400;">/</span>src <span style="color: #004400;">&amp;&amp;</span> make syn
&nbsp;
<span style="color: #339900; font-style: italic;">#rule for implementation</span>
imp <span style="color: #004400;">:</span>
    cd <span style="color: #004400;">../</span>syn<span style="color: #004400;">/</span>src <span style="color: #004400;">&amp;&amp;</span> make imp
&nbsp;
<span style="color: #339900; font-style: italic;">#project file generation</span>
project <span style="color: #004400;">:</span>
    cd <span style="color: #004400;">../</span>syn<span style="color: #004400;">/</span>src <span style="color: #004400;">&amp;&amp;</span> make project
&nbsp;
<span style="color: #339900; font-style: italic;">#upload bit to fpga</span>
bitup <span style="color: #004400;">:</span>
    cd <span style="color: #004400;">../</span>syn<span style="color: #004400;">/</span>src <span style="color: #004400;">&amp;&amp;</span> make bitup
&nbsp;
<span style="color: #339900; font-style: italic;">#upload prom to fpga</span>
promup <span style="color: #004400;">:</span>
    cd <span style="color: #004400;">../</span>syn<span style="color: #004400;">/</span>src <span style="color: #004400;">&amp;&amp;</span> make promup
&nbsp;
<span style="color: #339900; font-style: italic;">#generate prom</span>
promgen <span style="color: #004400;">:</span>
    cd <span style="color: #004400;">../</span>syn<span style="color: #004400;">/</span>src <span style="color: #004400;">&amp;&amp;</span> make promgen
&nbsp;
<span style="color: #339900; font-style: italic;">#reset/unlock pport cable (if impact says cable locked)</span>
unlock_cable <span style="color: #004400;">:</span>
    cd <span style="color: #004400;">../</span>syn<span style="color: #004400;">/</span>src <span style="color: #004400;">&amp;&amp;</span> make unlock_cable
&nbsp;
<span style="color: #339900; font-style: italic;">#rule for all</span>
all <span style="color: #004400;">:</span> clean syn imp bitup
&nbsp;
<span style="color: #339900; font-style: italic;">#rule for cleaning</span>
clean <span style="color: #004400;">:</span>
    cd <span style="color: #004400;">../</span>syn<span style="color: #004400;">/</span>src <span style="color: #004400;">&amp;&amp;</span> make clean</pre></div></div>

<p>Nun funktioniert alles und man kann aus vim heraus mit <em>:make all</em> den kompletten Vorgang starten.</p>
<p>Mittels</p>
<ul>
<li><em>:make clean</em> werden alle temporär erstellten Dateien gelöscht (inklusive Bit-Datei)</li>
<li><em>:make syn</em> wird die Synthese gestartet</li>
<li><em>:make imp</em> wird die Diesign Implementation gestartet (Map, Place &amp; Route,&#8230;) und die Bit-Datei erstellt</li>
<li><em>:make bitup</em> wird die Bit-Datei in den FPGA geladen</li>
<li><em>:make all</em> werden alle 4 Vorgänge nacheinander gestartet</li>
</ul>
<p>Nachdem Dateien hinzugefügt oder gelöscht wurden muss man die Datei ./config/settings anpassen und erneut <em>make project</em> ausführen.</p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/linux/tools-zur-vhdl-entwicklung-in-der-linux-konsole/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

