Dbox2 Entwicklungsumgebung: Unterschied zwischen den Versionen
Dbt (Diskussion | Beiträge) KKeine Bearbeitungszusammenfassung |
Dbt (Diskussion | Beiträge) KKeine Bearbeitungszusammenfassung |
||
| Zeile 7: | Zeile 7: | ||
{{Review}} | {{Review}} | ||
=Allgemeines= | =Allgemeines= | ||
Newmake ist eine Überarbeitung des alten "make" Prozesses, inzwischen auch als [[Image erstellen|Oldmake]] bezeichnet, und wurde durch Barf ins Leben gerufen. | Newmake ist eine Überarbeitung des alten "[[Make|make]]" Prozesses, inzwischen auch als [[Image erstellen|Oldmake]] bezeichnet, und wurde durch Barf ins Leben gerufen. | ||
Neben einer deutlich strukturierteren Basis, bietet es unter anderem auch den Vorteil, dass es auch ohne ohne | Neben einer deutlich strukturierteren Basis, bietet [[ES|es]] unter anderem auch den Vorteil, dass [[ES|es]] auch ohne ohne groß[[ES|es]] Verständnis für den Buildprozess gelingen kann, [[Images|Flashimages]] und [[yadd|YADDs]] unter [[Linux|Linux]] zu erstellen. | ||
Basierend auf Newmake gibt es inzwischen auch eine auf Scripts basierende Quasi-Frontendlösung, mit der sich [[Images|Flashimages]] oder [[yadd|YADDs]] benutzerdefiniert erstellen lassen, das sogenannte [[yBuild]].<br> | Basierend auf Newmake gibt [[ES|es]] inzwischen auch eine auf Scripts basierende Quasi-Frontendlösung, mit der sich [[Images|Flashimages]] oder [[yadd|YADDs]] benutzerdefiniert erstellen lassen, das sogenannte [[yBuild]].<[[BR|br]]> | ||
Dieser Artikel basiert zum größtem Teil auf die deutsche Version von [http://bengt-martensson.de/dbox2/ Barfs Newmake-Dokumentation], die er uns freundlicheweise zur Verfügung gestellt hat. | Dieser Artikel basiert zum größtem Teil auf die deutsche Version von [http://bengt-martensson.de/dbox2/ Barfs Newmake-Dokumentation], die er uns freundlicheweise zur Verfügung gestellt hat. | ||
Eine detaillierte Beschreibung (auch der make targets) unter anderem auch in englischer Sprache befindet sich auf [http://bengt-martensson.de/dbox2/ Barf's Homepage].<br> | Eine detaillierte Beschreibung (auch der [[Make|make]] targets) unter anderem auch in englischer Sprache befindet sich auf [http://bengt-martensson.de/dbox2/ Barf's Homepage].<[[BR|br]]> | ||
Dieser Artikel behandelt Newmake aus Sicht des Benutzers (nicht Entwickler). Es behandelt die [[Image]]- u. [[yadd|YADD]]-Herstellung sowie einfache Beipiele für Benutzeranpassungen ("[[Customization]]"). <br> | Dieser Artikel behandelt Newmake aus Sicht des Benutzers (nicht Entwickler). [[ES|Es]] behandelt die [[Image]]- u. [[yadd|YADD]]-Herstellung sowie einfache Beipiele für Benutzeranpassungen ("[[Customization]]"). <[[BR|br]]> | ||
==Zur Geschichte== | ==Zur Geschichte== | ||
Vor einigen Jahren war die Imageherstellung für die Tuxbox so etwas wie [[Wikipedia:Schwarze Kunst|"Schwarze Kunst"]]. | Vor einigen Jahren war die Imageherstellung für die [[Tuxbox|Tuxbox]] so etwas wie [[Wikipedia:Schwarze Kunst|"Schwarze Kunst"]]. | ||
Die Makefile-Unterstützung war, insbesondere für andere [[Images]] als [[cramfs]]-[[Images]], ziehmlich lückenhaft. Die [[CVS]] Werkzeuge waren schlecht, oder unvollständig. Noch schlimmer, einige Teile wurden absichtlich geheim gehalten. Vorallem das Werkzeug, jetzt als [[mkflfs]] bekannt, welches inzwischen aber im CVS-Verzeichnis ''.../hostapps/mkflfs'' zu finden ist, wurde zurückgehalten. | Die Makefile-Unterstützung war, insbesondere für andere [[Images]] als [[cramfs]]-[[Images]], ziehmlich lückenhaft. Die [[CVS]] Werkzeuge waren schlecht, oder unvollständig. Noch schlimmer, einige Teile wurden absichtlich geheim gehalten. Vorallem das Werkzeug, jetzt als [[mkflfs]] bekannt, welches inzwischen aber im [[CVS|CVS]]-Verzeichnis ''.../hostapps/[[Mkflfs|mkflfs]]'' zu finden ist, wurde zurückgehalten. | ||
Laut eines Forumsbeitrags aus dieser Zeit, waren die meisten Entwickler nicht in der Lage, eigene [[Images]] herzustellen. Die "Gilde der Imagehersteller" wurde geboren. Aus dieser Zeit dürften die "[[AlexW-Images]]" ein Begriff sein. | Laut eines Forumsbeitrags aus dieser Zeit, waren die meisten Entwickler nicht in der Lage, eigene [[Images]] herzustellen. Die "Gilde der Imagehersteller" wurde geboren. Aus dieser Zeit dürften die "[[AlexW-Images]]" ein Begriff sein. | ||
Hauptsächlich bestanden diese aus reinen CVS-Sources mit einigen mehr-oder-weniger geheim gehaltenen "Fixes", (vermutlich) notwendig für das Herstellen eines funktionierenden [[Images]] aus dem CVS-Quellcode. | Hauptsächlich bestanden diese aus reinen [[CVS|CVS]]-Sources mit einigen mehr-oder-weniger geheim gehaltenen "Fixes", (vermutlich) notwendig für das Herstellen eines funktionierenden [[Images]] aus dem [[CVS|CVS]]-Quellcode. | ||
<br> | <[[BR|br]]> | ||
<br> | <[[BR|br]]> | ||
Im August 2003, wurde es für das [[DBox2 Software Projekt|GNU DBox2 Software-Projekt]] in zunehmendem Maße peinlich, [[mkflfs]] geheim zu halten und der Quellcode für [[mkflfs]] wurde ins [[CVS]] eingecheckt. Auch die Funktionalität der [[Makefiles]] wurde stufenweise verbessert. Noch war viel zu wünschen übrig: Funktionalität, Pflegbarkeit, gesundes Software-Design... <br> | Im August 2003, wurde [[ES|es]] für das [[DBox2 Software Projekt|GNU DBox2 Software-Projekt]] in zunehmendem Maße peinlich, [[mkflfs]] geheim zu halten und der Quellcode für [[mkflfs]] wurde ins [[CVS]] eingecheckt. Auch die Funktionalität der [[Makefiles]] wurde stufenweise verbessert. Noch war viel zu wünschen übrig: Funktionalität, Pflegbarkeit, gesundes [[Software|Software]]-Design... <[[BR|br]]> | ||
Ein [[Image]] aus reinen CVS-Dateien zu bauen, war nicht wirklich möglich. | Ein [[Image]] aus reinen [[CVS|CVS]]-Dateien zu bauen, war nicht wirklich möglich. | ||
<br> | <[[BR|br]]> | ||
<br> | <[[BR|br]]> | ||
2004 wurde das [[YADI]] ("'''Y'''et '''A'''nother '''D'''Box '''I'''mage") Projekt geboren. <br> | 2004 wurde das [[YADI]] ("'''Y'''et '''A'''nother '''D'''Box '''I'''mage") Projekt geboren. <[[BR|br]]> | ||
Sein Ziel war es, das "Imagebauen" zu automatisieren und zu vereinfachen. Zu diesem Zweck wurden eine Anzahl von [[Wikipedia:Skripte|Scripten]] und [[Wikipedia:Patches|Patches]] gesammelt und/oder geschrieben. Zusätzlich wurden flashfertige [[Images]] zur Verfügung gestellt. | Sein Ziel war [[ES|es]], das "Imagebauen" zu automatisieren und zu vereinfachen. Zu diesem Zweck wurden eine Anzahl von [[Wikipedia:Skripte|Scripten]] und [[Wikipedia:Patches|Patches]] gesammelt und/oder geschrieben. Zusätzlich wurden flashfertige [[Images]] zur Verfügung gestellt. | ||
<br> | <[[BR|br]]> | ||
<br> | <[[BR|br]]> | ||
[[YADI]] war ein grosser Erfolg. Das Ziel wurde erreicht. [[Images]] wurden zur Verfügung gestellt, die (fast) vollständig auf freier Software basierten, sowohl inhaltlich als auch bezüglich der benötigten Werkzeuge, in einer Weise, die für den Benutzer durchaus nachvollziehbar war. | [[YADI]] war ein grosser Erfolg. Das Ziel wurde erreicht. [[Images]] wurden zur Verfügung gestellt, die (fast) vollständig auf freier [[Software|Software]] basierten, sowohl inhaltlich als auch bezüglich der benötigten Werkzeuge, in einer Weise, die für den Benutzer durchaus nachvollziehbar war. | ||
<br> | <[[BR|br]]> | ||
Mit dem [[YADI]]-Skript war das automatische Imagebuilden zwar möglich, jedoch statt grundlegende Schwächen im CDK-Imagebau-Prozeß zu beseitigen, stellte man [[Skripte]] zum Imagebauen zur Verfügung. Es wurde kein übliches Buildsystem zur Verfügung gestellt, wie dies beispielsweise von [[Make]], oder ein neuerer Nachfolger wie [[Ant]],[[Cmake]] oder [[Maven]] könnten.<br> | Mit dem [[YADI]]-[[Skript|Skript]] war das automatische Imagebuilden zwar möglich, jedoch statt grundlegende Schwächen im [[CDK|CDK]]-Imagebau-Prozeß zu beseitigen, stellte man [[Skripte]] zum Imagebauen zur Verfügung. [[ES|Es]] wurde kein übliches Buildsystem zur Verfügung gestellt, wie dies beispielsweise von [[Make]], oder ein neuerer Nachfolger wie [[Ant]],[[Cmake]] oder [[Maven]] könnten.<[[BR|br]]> | ||
Newmake, verfügbar als alternativer [[Branch]] im CVS, versucht diese Schwächen zu beseitigen.<br> | Newmake, verfügbar als alternativer [[Branch]] im [[CVS|CVS]], versucht diese Schwächen zu beseitigen.<[[BR|br]]> | ||
<br> | <[[BR|br]]> | ||
Ein spezieller Dank an jedem, der Bugreports und Feedback geliefert hat. Insbesonderes gilt dies für dietmarw, der Newmake benutzt, um die [[images|dietmarW-Images]] zu erzeugen. | Ein spezieller Dank an jedem, der Bugreports und Feedback geliefert hat. Insbesonderes gilt dies für dietmarw, der Newmake benutzt, um die [[images|dietmarW-Images]] zu erzeugen. | ||
=Ziel= | =Ziel= | ||
Das Ziel des vorliegenden Artikels ist es, dem Leser grundlegendes Know-How zu vermitteln. Es ist nicht das Ziel, eine idiotensichere Schritt-für-Schritt Anweisung bereitzustellen, wie das bei sogenannten HOWTO's der Fall wäre.<br> | Das Ziel des vorliegenden Artikels ist [[ES|es]], dem Leser grundlegendes Know-How zu vermitteln. [[ES|Es]] ist nicht das Ziel, eine idiotensichere Schritt-für-Schritt Anweisung bereitzustellen, wie das bei sogenannten HOWTO's der Fall wäre.<[[BR|br]]> | ||
Kenntnisse im Umgang mit [[Wikipedia:Skriptsprache|Shellskripten]] wird für viele Teile, insbesondere für das [[Customization]]-Kapitel, aber nicht für [[Image]]/[[yadd|YADD]]-Herstellung in seiner einfachsten Art und Weise vorausgesetzt. | Kenntnisse im Umgang mit [[Wikipedia:Skriptsprache|Shellskripten]] wird für viele Teile, insbesondere für das [[Customization]]-Kapitel, aber nicht für [[Image]]/[[yadd|YADD]]-Herstellung in seiner einfachsten Art und Weise vorausgesetzt. | ||
<br> | <[[BR|br]]> | ||
<br> | <[[BR|br]]> | ||
Der vorliegende Artikel versucht nicht die innere Funktion der [[Makefiles]] und des Makeprozesses zu beschreiben. Hierfür wird der Leser auf diverse Quellen, und zu relevanten Threads im [[CDK]]-Forum des Tuxbox-Forums hingewiesen. Alle Optionen für ''configure'' werden auch nicht beschrieben, nur die Allgemeinsten und Wichtigsten. | Der vorliegende Artikel versucht nicht die innere Funktion der [[Makefiles]] und des Makeprozesses zu beschreiben. Hierfür wird der Leser auf diverse Quellen, und zu relevanten Threads im [[CDK]]-Forum des [[Tuxbox|Tuxbox]]-Forums hingewiesen. Alle Optionen für ''configure'' werden auch nicht beschrieben, nur die Allgemeinsten und Wichtigsten. | ||
= Wie schwierig ist es? = | = Wie schwierig ist [[ES|es]]? = | ||
Die Antwort könnte lauten: ''Es ist so schwerig wie man diesen Artikel zu lesen versteht.'' Für den Leser, der ohne Probleme den Inhalt dieses Artikels versteht, sollte es kein Probleme sein. Leser, für die das Meiste nur Kauderwelsch ist, sollten vielleicht besser bei fertigen Images bleiben. | Die Antwort könnte lauten: ''[[ES|Es]] ist so schwerig wie man diesen Artikel zu lesen versteht.'' Für den Leser, der ohne Probleme den Inhalt dieses Artikels versteht, sollte [[ES|es]] kein Probleme sein. Leser, für die das Meiste nur Kauderwelsch ist, sollten vielleicht besser bei fertigen [[Images|Images]] bleiben. | ||
= Images und YADD's bauen= | = [[Images|Images]] und [[Yadd|YADD]]'s bauen= | ||
== Targets == | == Targets == | ||
Es gibt neben zahlreichen untergeordneten Zielen (Targets), zwei hauptrangige Targets. Diese wären entweder | [[ES|Es]] gibt neben zahlreichen untergeordneten Zielen (Targets), zwei hauptrangige Targets. Diese wären entweder | ||
*[[YADD]] | *[[YADD]] | ||
oder | oder | ||
*[[Image]]. | *[[Image]]. | ||
Ein [[YADD]] besteht aus einigen Dateien, die die DBox anstatt aus dem [[Flash]] | Ein [[YADD]] besteht aus einigen Dateien, die die DBox anstatt aus dem [[Flash]] ü[[BER|ber]] den [[TFTP]]-Service lädt, sowie ein [[Filesystem|Filesystem]], das ü[[BER|ber]] einen [[NFS-Server]] der dBox zur Verfügung gestellt wird. | ||
<br> | <[[BR|br]]> | ||
Diese Betriebsart hat insbesondere während der Softwareentwicklung oder beim Erlernen des Systems viele Vorteile. <br> | Diese Betriebsart hat insbesondere während der Softwareentwicklung oder beim Erlernen des Systems viele Vorteile. <[[BR|br]]> | ||
Der Name "[[YADD]]" bedeutet übrigens "'''Y'''et '''A'''nother '''D'''Box '''D'''istribution" ("noch eine dBox Verteilung"). | Der Name "[[YADD]]" bedeutet übrigens "'''Y'''et '''A'''nother '''D'''Box '''D'''istribution" ("noch eine dBox Verteilung"). | ||
| Zeile 69: | Zeile 69: | ||
=== Erste Schritte und Überlegungen === | === Erste Schritte und Überlegungen === | ||
Eine Empfehlung für den angehenden "Image/YADD-Lehrling" wäre:<br> | Eine Empfehlung für den angehenden "[[Image|Image]]/[[Yadd|YADD]]-Lehrling" wäre:<[[BR|br]]> | ||
Baue zuerst ein [[YADD]] mit deiner Lieblings-[[GUI]], und lerne damit umzugehen.<br> | Baue zuerst ein [[YADD]] mit deiner Lieblings-[[GUI]], und lerne damit umzugehen.<[[BR|br]]> | ||
Nächster Schritt wäre dann, ein [[jffs2]]-Image mit der Lieblings-[[GUI]] zu erstellen. Erst danach sollte man sich überlegen weitere Sachen wie Patches, andere Tools, erweiterte configure-Optionen oder [[Newmake#Customization|Customization]]-Scripte einzupflegen. Dann wird sich auch sehr schnell herausstellen, ob das was man einbauen möchte in das eigene Image rein platztechnisch reinpasst. Dann steht man schnell vor der Entscheidung sich für ein angemesseneres Kompressionsformat zu entscheiden. Hier hat sich [[squashfs]] als das derzeit bewährteste System etabliert. | Nächster Schritt wäre dann, ein [[jffs2]]-[[Image|Image]] mit der Lieblings-[[GUI]] zu erstellen. Erst danach sollte man sich überlegen weitere Sachen wie Patches, andere [[Tools|Tools]], erweiterte configure-Optionen oder [[Newmake#Customization|Customization]]-Scripte einzupflegen. Dann wird sich auch sehr schnell herausstellen, ob das was man einbauen möchte in das eigene [[Image|Image]] rein platztechnisch reinpasst. Dann steht man schnell vor der Entscheidung sich für ein angemesseneres Kompressionsformat zu entscheiden. Hier hat sich [[squashfs]] als das derzeit bewährteste System etabliert. | ||
Meistens möchte man die folgenden Schritte kombinieren und/oder automatisieren. | Meistens möchte man die folgenden Schritte kombinieren und/oder automatisieren. | ||
<br> | <[[BR|br]]> | ||
In diesem Artikel bezeichnet "[[GUI]]" entweder | In diesem Artikel bezeichnet "[[GUI]]" entweder | ||
*[[Neutrino]] oder | *[[Neutrino]] oder | ||
| Zeile 82: | Zeile 82: | ||
*[[Lcars]] | *[[Lcars]] | ||
*[[Radiobox]]. | *[[Radiobox]]. | ||
<br> | <[[BR|br]]> | ||
Das "[[Filesystem]]" im Kontext eines kompletten [[Images]] bezeichnet das [[Dateisystem]], in dem das root-Verzeichnis liegt. Diese kann ein | Das "[[Filesystem]]" im Kontext eines kompletten [[Images]] bezeichnet das [[Dateisystem]], in dem das root-Verzeichnis liegt. Diese kann ein | ||
*[[cramfs]] (ein komprimiertes, Read-only filesystem für embedded Systeme) sein, | *[[cramfs]] (ein komprimiertes, Read-only [[Filesystem|filesystem]] für embedded Systeme) sein, | ||
*[[squashfs]] (ein weiterd komprimiertes read-only-Dateisystem, was leistungsfähiger als [[cramfs]] betrachtet wird) | *[[squashfs]] (ein weiterd komprimiertes read-only-[[Dateisystem|Dateisystem]], was leistungsfähiger als [[cramfs]] betrachtet wird) | ||
oder | oder | ||
*[[jffs2]] (ein "journalled" Read-Write-Filesystem). | *[[jffs2]] (ein "journalled" Read-Write-[[Filesystem|Filesystem]]). | ||
Ein "cramfs Komplett-Image" besteht aus einem Root-Dateisystem mit dem [[cramfs]] Dateisystem und einem kleineren [[jffs2]]-Filesystem, das nach '''/var''' gemounted wird. | Ein "[[Cramfs|cramfs]] Komplett-[[Image|Image]]" besteht aus einem Root-[[Dateisystem|Dateisystem]] mit dem [[cramfs]] [[Dateisystem|Dateisystem]] und einem kleineren [[jffs2]]-[[Filesystem|Filesystem]], das nach '''/var''' gemounted wird. | ||
<br> | <[[BR|br]]> | ||
Analog gilt dies auch für "'''squashfs Komplett-Images'''", während ein "'''jffs2 Komplett-Image'''" kein separates ''/var-Dateisystem'' enthält, weil jffs2 an sich beschreibbar (var) ist. | Analog gilt dies auch für "'''[[Squashfs|squashfs]] Komplett-[[Images|Images]]'''", während ein "'''[[Jffs2|jffs2]] Komplett-[[Image|Image]]'''" kein separates ''/var-[[Dateisystem|Dateisystem]]'' enthält, weil [[Jffs2|jffs2]] an sich beschreibbar (var) ist. | ||
<br> | <[[BR|br]]> | ||
Zusätzlich enthalten die Komplett-Images eine weitere Partition, die den [[u-boot]]-[[Bootloader]] enthalten. Diese Partition ist zwischen dBoxen mit einen und zwei Flashchips unterschiedlich. Dieses wird durch "'''1x'''" und "'''2x'''" angezeigt. Ein komplettes Image würde demnach so benannt werden: | Zusätzlich enthalten die Komplett-[[Images|Images]] eine weitere [[Partition|Partition]], die den [[u-boot]]-[[Bootloader]] enthalten. Diese [[Partition|Partition]] ist zwischen dBoxen mit einen und zwei Flashchips unterschiedlich. Dieses wird durch "'''1x'''" und "'''2x'''" angezeigt. Ein komplettes [[Image|Image]] würde demnach so benannt werden: | ||
[neutrino, enigma]-[cramfs, squashfs, jffs2].img[1, 2]x, | [neutrino, enigma]-[cramfs, squashfs, jffs2].img[1, 2]x, | ||
z.B. als fertiges Image: | z.B. als fertiges [[Image|Image]]: | ||
neutrino-jffs2.img2x. | [[Neutrino|neutrino]]-[[Jffs2|jffs2]].img2x. | ||
== Buildsystem Voraussetzungen == | == Buildsystem Voraussetzungen == | ||
Die Voraussetzungen auf dem Buildhost können in etwa so zusammengefasst werden: | Die Voraussetzungen auf dem Buildhost können in etwa so zusammengefasst werden: | ||
<br> | <[[BR|br]]> | ||
Ein modernes Unix/Linux System mit ca. 2 GB freiem Speicherplatz. Epfehlenswert ist es aber mehr Speicherplatz einzuplanen, da beispielsweise bei Verwendung von [[ccache]] einiges an Daten zwischengelagert wird und je öfter man kompiliert, es dann doch eng werden könnte. | Ein modernes [[Unix|Unix]]/[[Linux|Linux]] System mit ca. 2 GB freiem Speicherplatz. Epfehlenswert ist [[ES|es]] aber mehr Speicherplatz einzuplanen, da beispielsweise bei Verwendung von [[ccache]] einiges an Daten zwischengelagert wird und je öfter man kompiliert, [[ES|es]] dann doch eng werden könnte. | ||
Das [[DBox2 Software Projekt|Tuxbox Projekt]] hat keine favorisierte Buildumgebung. Fragen wie "geht es mit Redhat x.y?" lassen sich nicht genau beantworten. Der Grund hierfür ist, dass niemand sich wirklich dafür interessiert, die Eigenschaften der bestimmten Distributionen zu erkunden. Gewisse Anforderungen werden dagegen für Versionen der Werkzeuge, wie [[WP:autoconf|autoconf]], [[WP:automake|automake]], [[make]] usw. formuliert. Die meisten davon sind in den gängigsten Distributionen bereits enthalten bzw. können nachinstalliert werden. Die momentan erfordelichen Toolversionen sind in folgendender Tabelle zusammengefasst: | Das [[DBox2 Software Projekt|Tuxbox Projekt]] hat keine favorisierte Buildumgebung. Fragen wie "geht [[ES|es]] mit Redhat x.y?" lassen sich nicht genau beantworten. Der Grund hierfür ist, dass niemand sich wirklich dafür interessiert, die Eigenschaften der bestimmten Distributionen zu erkunden. Gewisse Anforderungen werden dagegen für Versionen der Werkzeuge, wie [[WP:autoconf|autoconf]], [[WP:automake|automake]], [[make]] usw. formuliert. Die meisten davon sind in den gängigsten Distributionen bereits enthalten bzw. können nachinstalliert werden. Die momentan erfordelichen Toolversionen sind in folgendender Tabelle zusammengefasst: | ||
<br> | <[[BR|br]]> | ||
{{Vorlage:GNU_Tools}} | {{Vorlage:GNU_Tools}} | ||
<br> | <[[BR|br]]> | ||
Der Buildprozess überprüft zu Beginn automatisch einige dieser Anforderungen. Wenn eines dieser Tools fehlt, oder wenn die Version zu alt zu sein scheint, ist es in der Regel einfacher, die erforderliche Version nachträglich zu installieren, entweder als kompiliertes Paket, z.B. im [[rpm]]-Format vom jeweiligem Distributor, oder sich direkt die Quellen zu besorgen, zu kompilieren und zu installieren, als zu versuchen oder herauszufinden, ob die oben genannten Anforderungen wirklich notwendig sind. | Der Buildprozess überprüft zu Beginn automatisch einige dieser Anforderungen. Wenn eines dieser [[Tools|Tools]] fehlt, oder wenn die Version zu alt zu sein scheint, ist [[ES|es]] in der Regel einfacher, die erforderliche Version nachträglich zu installieren, entweder als kompiliertes Paket, z.B. im [[rpm]]-Format vom jeweiligem Distributor, oder sich direkt die Quellen zu besorgen, zu kompilieren und zu installieren, als zu versuchen oder herauszufinden, ob die oben genannten Anforderungen wirklich notwendig sind. | ||
<br> | <[[BR|br]]> | ||
'''''Hinweis''':<br> | '''''Hinweis''':<[[BR|br]]> | ||
In anderen Anleitungen zum Buildvorgang wird gefordert, dass Tools wie [[fakeroot]], | In anderen [[Anleitungen|Anleitungen]] zum Buildvorgang wird gefordert, dass [[Tools|Tools]] wie [[fakeroot]], | ||
[[mksquashfs]], [[mkcramfs]], [[mkjffs2fs]] (oder [[mkfs.jffs2]]), vielleicht auch [[mklibs]] | [[mksquashfs]], [[mkcramfs]], [[mkjffs2fs]] (oder [[mkfs.jffs2]]), vielleicht auch [[mklibs]] | ||
oder [[ccache]], auf Ihrem System installiert sein müssen. In dieser Umgebung ist dies nicht | oder [[ccache]], auf Ihrem System installiert sein müssen. In dieser Umgebung ist dies nicht | ||
erfordelich, da einige entweder überhaupt nicht benötigt werden bzw. die Installation im | erfordelich, da einige entweder überhaupt nicht benötigt werden bzw. die [[Installation|Installation]] im | ||
Makeprozess selbst vorgenommen wird! | Makeprozess selbst vorgenommen wird! | ||
<br>'' | <[[BR|br]]>'' | ||
Builden auf einem Unix-non-Linux System sollte vermutlich auch möglich sein, so weit die erforderlichen [[GNU]] Werkzeuge vorhanden sind. Mit einem anderen [[make]] als [[GNU]] wird es fast sicher nicht funktionieren, da die GNU-Erweiterungen uneingeschränkt verwendet werden. | Builden auf einem [[Unix|Unix]]-non-[[Linux|Linux]] System sollte vermutlich auch möglich sein, so weit die erforderlichen [[GNU]] Werkzeuge vorhanden sind. Mit einem anderen [[make]] als [[GNU]] wird [[ES|es]] fast sicher nicht funktionieren, da die [[GNU|GNU]]-[[Erweiterungen|Erweiterungen]] uneingeschränkt verwendet werden. | ||
<br> | <[[BR|br]]> | ||
Es wird daher davon abgeraten eine Umbegebung z.B. mit [[Cygwin]] aufzubauen, da es höchstwahrscheinlich nicht funktionieren wird. In dieser Richtung wurde zwar Einiges für den Makeprozess eingebaut, jedoch dürfte der gegenwärtige Entwicklungsstand nicht den gegenwärtigen Anforderungen entsprechen, um aktuell auch damit arbeiten zu können. | [[ES|Es]] wird daher davon abgeraten eine Umbegebung z.B. mit [[Cygwin]] aufzubauen, da [[ES|es]] höchstwahrscheinlich nicht funktionieren wird. In dieser Richtung wurde zwar Einiges für den Makeprozess eingebaut, jedoch dürfte der gegenwärtige Entwicklungsstand nicht den gegenwärtigen Anforderungen entsprechen, um aktuell auch damit arbeiten zu können. | ||
<br> | <[[BR|br]]> | ||
Empfehlenswert ist allerdings eine Buildumgebung mittels [[VMWare]] aufzubauen. Hierfür gibt es auch eine "konfektionierte" Lösung von yiogol, der hierfür ein passendes [[VMWare-Image]] erstellt hat, dass im Prinzip alle notwendigen Zutaten enthält. | Empfehlenswert ist allerdings eine Buildumgebung mittels [[VMWare]] aufzubauen. Hierfür gibt [[ES|es]] auch eine "konfektionierte" Lösung von yiogol, der hierfür ein passendes [[VMWare-Image]] erstellt hat, dass im Prinzip alle notwendigen Zutaten enthält. | ||
== Auschecken == | == Auschecken == | ||
Die Tuxbox Quellen werden durch den Tuxbox [[CVS|CVS-Server]] bereitgestellt.<br> | Die [[Tuxbox|Tuxbox]] Quellen werden durch den [[Tuxbox|Tuxbox]] [[CVS|CVS-Server]] bereitgestellt.<[[BR|br]]> | ||
Regelmäßige Quellreleases sind niemals gemacht worden, und sind auch nicht für die Zukünft geplant. Für unsere Zwecke werden die Quellen anonym "ausgecheckt", was bedeutet, dass diese auf die eigene Festplatte kopiert werden, indem man zuerst auf einer (lokalen) Festplatte mit "ordentlich" freiem Platz ein leeres Verzeichnis erstellt, z.B. ''/tuxbox-cvs'' und in diesen Ordner wechselt, und diesen Befehl ausführt. | Regelmäßige Quellreleases sind niemals gemacht worden, und sind auch nicht für die Zukünft geplant. Für unsere Zwecke werden die Quellen anonym "ausgecheckt", was bedeutet, dass diese auf die eigene Festplatte kopiert werden, indem man zuerst auf einer (lokalen) Festplatte mit "ordentlich" freiem Platz ein leeres Verzeichnis erstellt, z.B. ''/[[Tuxbox|tuxbox]]-[[CVS|cvs]]'' und in diesen Ordner wechselt, und diesen Befehl ausführt. | ||
cvs -d anoncvs@cvs.tuxbox.org:/cvs/tuxbox -z3 co -f -r newmake -P . | [[CVS|cvs]] -d anoncvs@[[CVS|cvs]].[[Tuxbox|tuxbox]].org:/[[CVS|cvs]]/[[Tuxbox|tuxbox]] -z3 co -f -r newmake -P . | ||
Dieser Befehl checkt die Newmake Files aus. In Fällen, in denen keine Newmake Version vorhanden ist, wird die HEAD-Version ausgecheckt. | Dieser Befehl checkt die Newmake Files aus. In Fällen, in denen keine Newmake Version vorhanden ist, wird die HEAD-Version ausgecheckt. | ||
<br> | <[[BR|br]]> | ||
'''Hinweis:''' | '''Hinweis:''' | ||
''Im HEAD gibt es zwei Files:'' | ''Im HEAD gibt [[ES|es]] zwei Files:'' | ||
*cdk/root/etc/init.d/rcS | *[[CDK|cdk]]/root/etc/init.d/rcS | ||
''und'' | ''und'' | ||
*root/etc/init.d/rcS.insmod | *root/etc/init.d/rcS.insmod | ||
| Zeile 143: | Zeile 143: | ||
root/etc/init.d/rcS.m4 | root/etc/init.d/rcS.m4 | ||
''erzeugt werden.'' | ''erzeugt werden.'' | ||
''Um auf der sicheren Seite zu sein, ist es ratsam, diese beiden zu löschen''. | ''Um auf der sicheren Seite zu sein, ist [[ES|es]] ratsam, diese beiden zu löschen''. | ||
<br> | <[[BR|br]]> | ||
Nachdem die Daten ausgecheckt wurden, könnte kann man jetzt einige Patches auf die Quellen anwenden.<br> | Nachdem die Daten ausgecheckt wurden, könnte kann man jetzt einige Patches auf die Quellen anwenden.<[[BR|br]]> | ||
Wenn man aber zum ersten Mal kompiliert, ist es ratsam, vorerst keine Patches anzuwenden. Wenn Probleme auftreten, ist es viel einfacher (technisch sowohl als auch für jeden selbst) jemand zu helfen, der die "unveränderten CVS Quellen" verwendet. | Wenn man aber zum ersten Mal kompiliert, ist [[ES|es]] ratsam, vorerst keine Patches anzuwenden. Wenn Probleme auftreten, ist [[ES|es]] viel einfacher (technisch sowohl als auch für jeden selbst) jemand zu helfen, der die "unveränderten [[CVS|CVS]] Quellen" verwendet. | ||
== Konfiguration == | == Konfiguration == | ||
Jetzt müssen | Jetzt müssen einige Zwischenschritte erledigt werden, damit der Buildprozess auch erkennt, was und vorallem wie er [[ES|es]] machen soll. | ||
<br> | <[[BR|br]]> | ||
Man wechselt nun in das CDK-Unterverzeichnis | Man wechselt nun in das [[CDK|CDK]]-Unterverzeichnis | ||
cd cdk | cd [[CDK|cdk]] | ||
und gibt diesen Befehl ein (ohne Argumente). | und gibt diesen Befehl ein (ohne Argumente). | ||
./autogen.sh | ./autogen.sh | ||
Dieser erzeugt unter anderem ein [[Shellskript]] namens '''configure'''. | Dieser erzeugt unter anderem ein [[Shellskript]] namens '''configure'''. | ||
<br> | <[[BR|br]]> | ||
Wird ''autogen.sh'' ausgeführt, wird dabei eine Anzahl von Optionen übergeben, um das System für das Builden eines Images, YADD oder aller anderen gewünschten Ziele entsprechend den Benutzerwünschen vorzubereiten. | Wird ''autogen.sh'' ausgeführt, wird dabei eine Anzahl von Optionen übergeben, um das System für das Builden eines [[Images|Images]], [[Yadd|YADD]] oder aller anderen gewünschten Ziele entsprechend den Benutzerwünschen vorzubereiten. | ||
| Zeile 169: | Zeile 169: | ||
Für uns sind vorerst nur wenige Optionen interessant. Die Standardvorgaben reichen vorerst völlig aus.<br> | Für uns sind vorerst nur wenige Optionen interessant. Die Standardvorgaben reichen vorerst völlig aus.<[[BR|br]]> | ||
Eine typische Anwendung (Konfiguration), der mit z.B. den Pfadnamen oben kompatibel wäre, könnte so eingestellt werden: | Eine typische Anwendung (Konfiguration), der mit z.B. den Pfadnamen oben kompatibel wäre, könnte so eingestellt werden: | ||
./configure --with-cvsdir="/tuxbox-cvs" --prefix="/dbox2" --enable-maintainer-mode | ./configure --with-cvsdir="/[[Tuxbox|tuxbox]]-[[CVS|cvs]]" --prefix="/[[Dbox2|dbox2]]" --enable-maintainer-mode | ||
*''--with-cvsdir'' | *''--with-cvsdir'' | ||
sagt wo die Quellen zu finden sind, (darin sollte auch ein Unterverzeichnis ''.../cdk'' besitzen). In der Regel ist dies das Verzeichnis in das die Quelldaten gerade ausgecheckt wurden, während | sagt wo die Quellen zu finden sind, (darin sollte auch ein Unterverzeichnis ''.../[[CDK|cdk]]'' besitzen). In der Regel ist dies das Verzeichnis in das die Quelldaten gerade ausgecheckt wurden, während | ||
*''--prefix'' | *''--prefix'' | ||
bedeutet, dass eine Anzahl von wichtigen Verzeichnissen als Unterverzeichnisse des besagten Verzeichnisses erstellt werden sollen. Ihre Position kann durch andere Konfigurationsoptionen weiter beeinflußt werden. | bedeutet, dass eine Anzahl von wichtigen Verzeichnissen als Unterverzeichnisse des besagten Verzeichnisses erstellt werden sollen. Ihre Position kann durch andere Konfigurationsoptionen weiter beeinflußt werden. | ||
*''--enable-maintainer-mode'' | *''--enable-maintainer-mode'' | ||
ist, auch für Nichtmaintainers praktisch, da er den hergestellten Makefiles ermöglicht, sich automatisch neu zu erzeugen, sobald die Notwendigkeit entsteht, zum Beispiel nach einem Software-Update. | ist, auch für Nichtmaintainers praktisch, da er den hergestellten [[Makefiles|Makefiles]] ermöglicht, sich automatisch neu zu erzeugen, sobald die Notwendigkeit entsteht, zum Beispiel nach einem [[Software|Software]]-[[Update|Update]]. | ||
Es gibt sicher noch andere nützliche Optionen. Einige werden später noch besprochen. | [[ES|Es]] gibt sicher noch andere nützliche Optionen. Einige werden später noch besprochen. | ||
=== Fehlerausgaben === | === Fehlerausgaben === | ||
Überprüfe bitte die Ausgaben von ''autogen'' auf Fehler ("Error") und Warnungen.<br> | Überprüfe bitte die Ausgaben von ''autogen'' auf Fehler ("Error") und Warnungen.<[[BR|br]]> | ||
Hierbei können diese Warnungen ignoriert werden: | Hierbei können diese Warnungen ignoriert werden: | ||
| Zeile 197: | Zeile 197: | ||
... | ... | ||
configure: WARNING: using tuxbox mklibs | configure: WARNING: using [[Tuxbox|tuxbox]] [[Mklibs|mklibs]] | ||
checking for mkcramfs... no | checking for mkcramfs... no | ||
configure: WARNING: using tuxbox cramfs | configure: WARNING: using [[Tuxbox|tuxbox]] [[Cramfs|cramfs]] | ||
checking for mkjffs2... no | checking for mkjffs2... no | ||
checking for mkfs.jffs2... no | checking for [[Mkfs.jffs2|mkfs.jffs2]]... no | ||
configure: WARNING: using tuxbox mkfs.jffs2 | configure: WARNING: using [[Tuxbox|tuxbox]] [[Mkfs.jffs2|mkfs.jffs2]] | ||
checking for mksquashfs... no | checking for mksquashfs... no | ||
configure: WARNING: using tuxbox squashfs | configure: WARNING: using [[Tuxbox|tuxbox]] [[Squashfs|squashfs]] | ||
... | ... | ||
Dies sind nur Hinweise darauf, dass hier projekteigene Versionen einiger Tools verwendet werden. | Dies sind nur Hinweise darauf, dass hier projekteigene Versionen einiger [[Tools|Tools]] verwendet werden. | ||
'''''Beachte!''' | '''''Beachte!''' | ||
Wenn man diesen Artikel mit ähnlichen Beschreibungen aus vergangenen Zeiten | Wenn man diesen Artikel mit ähnlichen Beschreibungen aus vergangenen Zeiten | ||
vergleicht, bemerkt man, dass die Option '''--with-targetruleset=[standard,flash]''' nicht mehr | vergleicht, bemerkt man, dass die Option '''--with-targetruleset=[standard,flash]''' nicht mehr | ||
vorhanden ist. Bisher war es notwendig, bei der Konfiguration sich entweder auf Builds von [[YADDs]] | vorhanden ist. Bisher war [[ES|es]] notwendig, bei der Konfiguration sich entweder auf Builds von [[YADDs]] | ||
oder [[Images]] einzuschränken. Bei Newmake ist dieses nicht mehr notwendig. | oder [[Images]] einzuschränken. Bei Newmake ist dieses nicht mehr notwendig. | ||
<br>'' | <[[BR|br]]>'' | ||
<br> | <[[BR|br]]> | ||
[[Bild:Stop hand.png]] | [[Bild:Stop hand.png]] | ||
<div style="margin: 0; margin-top:10px; margin-right:0px; border: 3px solid #FF0000; padding: 0px 10px 1px 10px; background-color:#DEB0B0; align:right; "> | <div style="margin: 0; margin-top:10px; margin-right:0px; border: 3px solid #FF0000; padding: 0px 10px 1px 10px; background-color:#DEB0B0; align:right; "> | ||
| Zeile 225: | Zeile 225: | ||
== Kompilieren == | == Kompilieren == | ||
Die high-level make Targets, die für das Builden von Komplett-Images relevant sind, lauten: | Die high-level [[Make|make]] Targets, die für das Builden von Komplett-[[Images|Images]] relevant sind, lauten: | ||
*<pre><nowiki>flash-[neutrino, enigma, all]</nowiki></pre> | *<pre><nowiki>flash-</nowiki>[neutrino, enigma, all]</nowiki></pre> | ||
*<pre><nowiki>flash-[cramfs, squashfs, jffs2, all]</nowiki></pre> | *<pre><nowiki>flash-</nowiki>[cramfs, squashfs, jffs2, all]</nowiki></pre> | ||
*<pre><nowiki>[1x, 2x, alle]</nowiki></pre> | *<pre><nowiki></nowiki>[1x, 2x, alle]</nowiki></pre> | ||
Für YADD-Builds, sind diese: | Für [[Yadd|YADD]]-Builds, sind diese: | ||
*<pre><nowiki>yadd-[neutrino, enigma, all]</nowiki></pre> | *<pre><nowiki>yadd-</nowiki>[neutrino, enigma, all]</nowiki></pre> | ||
'''Beispiele:''' | '''Beispiele:''' | ||
make flash-neutrino-jffs2-all | [[Make|make]] [[Flash|flash]]-[[Neutrino|neutrino]]-[[Jffs2|jffs2]]-all | ||
erzeugt flashbare jffs2-only Images mit Neutrino, für 1x-Boxen und für 2x-Boxen (Dateinamen ''neutrino-jffs2.img1x'' und ''neutrino-jffs2.img2x''). | erzeugt flashbare [[Jffs2|jffs2]]-only [[Images|Images]] mit [[Neutrino|Neutrino]], für 1x-Boxen und für 2x-Boxen (Dateinamen ''[[Neutrino|neutrino]]-[[Jffs2|jffs2]].img1x'' und ''[[Neutrino|neutrino]]-[[Jffs2|jffs2]].img2x''). | ||
'''der Befehl:''' | '''der Befehl:''' | ||
make yadd-enigma | [[Make|make]] [[Yadd|yadd]]-[[Enigma|enigma]] | ||
erzeugt ein YADD, das Enigma enthält. | erzeugt ein [[Yadd|YADD]], das [[Enigma|Enigma]] enthält. | ||
=== Zeitaufwand === | === Zeitaufwand === | ||
Das Kompilieren kann bei so einem Projekt und je nach Konfiguration und Rechnerleistung schon einige Zeit in Anspruch nehmen.<br> | Das Kompilieren kann bei so einem Projekt und je nach Konfiguration und Rechnerleistung schon einige Zeit in Anspruch nehmen.<[[BR|br]]> | ||
Auf einem Athlon XP 1800 dauert ein Befehl wie '''make yadd-neutrino''' mit leeren Verzeichnissen etwa 1 und 1,5 Stunden. | Auf einem Athlon XP 1800 dauert ein Befehl wie '''[[Make|make]] [[Yadd|yadd]]-[[Neutrino|neutrino]]''' mit leeren Verzeichnissen etwa 1 und 1,5 Stunden. | ||
==== Verwendung von ccache ==== | ==== Verwendung von [[Ccache|ccache]] ==== | ||
Um den Vorgang insbesondere bei wiederholten Kompilieren und besonders auf langsameren Rechnern zu beschleunigen, steht die Option | Um den Vorgang insbesondere bei wiederholten Kompilieren und besonders auf langsameren Rechnern zu beschleunigen, steht die Option | ||
* --enable-ccache | * --enable-[[Ccache|ccache]] | ||
zur Verfügung, welche man mit in die Konfiguration einbinden kann. Erfahrungsgemäß wird so durchschnittlich ca. 1-2 Drittel der Zeit eingespart. | zur Verfügung, welche man mit in die Konfiguration einbinden kann. Erfahrungsgemäß wird so durchschnittlich ca. 1-2 Drittel der Zeit eingespart. | ||
Durch die Option '''--enable-ccache''' wird erreicht, sollte das Tool bereits in deiner Distribution installiert sein, dass [[ccache]] automatisch erkannt wird und in das Tuxbox-CDK eingebunden wird. Ist es nicht installiert, wird dies auch von configure angezeigt: | Durch die Option '''--enable-[[Ccache|ccache]]''' wird erreicht, sollte das Tool bereits in deiner Distribution installiert sein, dass [[ccache]] automatisch erkannt wird und in das [[Tuxbox|Tuxbox]]-[[CDK|CDK]] eingebunden wird. Ist [[ES|es]] nicht installiert, wird dies auch von configure angezeigt: | ||
... | ... | ||
---------------------------------------- | ---------------------------------------- | ||
ccache support: no | [[Ccache|ccache]] support: no | ||
ccache installdir: | [[Ccache|ccache]] installdir: | ||
ccache is not installed please run make ccache or install it and configure again | [[Ccache|ccache]] is not installed please run [[Make|make]] [[Ccache|ccache]] or install it and configure again | ||
---------------------------------------- | ---------------------------------------- | ||
... | ... | ||
Dann sollte man das Tool nachinstallieren oder mit dem Target | Dann sollte man das Tool nachinstallieren oder mit dem Target | ||
make ccache | [[Make|make]] [[Ccache|ccache]] | ||
in das CDK einbauen und configure wiederholen. | in das [[CDK|CDK]] einbauen und configure wiederholen. | ||
'''Hinweis''' | '''Hinweis''' | ||
<br> | <[[BR|br]]> | ||
''[[Ccache]] macht sich erst bemerkbar, nachdem der Buildvorgang mindestens einmal durchgelaufen ist!'' | ''[[Ccache]] macht sich erst bemerkbar, nachdem der Buildvorgang mindestens einmal durchgelaufen ist!'' | ||
Die Option ''--enable-ccache'' ist normalerweise völlig ausreichend. Es stehen aber noch weitere untergeordnete Sub-Optionen zur Verfügung, die in Ausnahmefällen verwendet werden können: | Die Option ''--enable-[[Ccache|ccache]]'' ist normalerweise völlig ausreichend. [[ES|Es]] stehen aber noch weitere untergeordnete Sub-Optionen zur Verfügung, die in Ausnahmefällen verwendet werden können: | ||
*--with-ccachedir=DIR | *--with-ccachedir=DIR | ||
Diese Option kann man verwenden, wenn man [[ccache]] beispielsweise nur als Binary abgelegt hat und den Pfad dazu bestimmen möchte. | Diese Option kann man verwenden, wenn man [[ccache]] beispielsweise nur als Binary abgelegt hat und den Pfad dazu bestimmen möchte. | ||
<br> | <[[BR|br]]> | ||
'''Hinweis''' | '''Hinweis''' | ||
<br> | <[[BR|br]]> | ||
''Die Option '''--with-ccachedir''' bewirkt auch das die mit '''make ccache''' installierte Version im CDK und/oder auch die evtl. im System installierte Version ignoriert wird!'' | ''Die Option '''--with-ccachedir''' bewirkt auch das die mit '''[[Make|make]] [[Ccache|ccache]]''' installierte Version im [[CDK|CDK]] und/oder auch die evtl. im System installierte Version ignoriert wird!'' | ||
*--with-maxcachesize=SIZE maximal | *--with-maxcachesize=SIZE maximal | ||
| Zeile 289: | Zeile 289: | ||
Hier kann man angeben, wieviele Dateien [[ccache]] cachen darf. | Hier kann man angeben, wieviele Dateien [[ccache]] cachen darf. | ||
--with-maxcachefiles=20000 | --with-maxcachefiles=20000 | ||
Hier würden es logischeweise 20000 sein. | Hier würden [[ES|es]] logischeweise 20000 sein. | ||
Die Wirksamkeit von [[ccache]] lässt sich mit dem Befehl | Die Wirksamkeit von [[ccache]] lässt sich mit dem Befehl | ||
ccache -s | [[Ccache|ccache]] -s | ||
prüfen. Als Ergebnis werden einige Statistiken | prüfen. Als Ergebnis werden einige Statistiken ü[[BER|ber]] das Cache-Verhalten von [[Ccache|ccache]] ausgegeben: | ||
cache directory /home/<USER>/.ccache | cache directory /home/<USER>/.[[Ccache|ccache]] | ||
cache hit 4 | cache hit 4 | ||
cache miss 191 | cache miss 191 | ||
called for link 17 | called for [[Link|link]] 17 | ||
multiple source files 4 | multiple source files 4 | ||
compile failed 17 | compile failed 17 | ||
preprocessor error 2 | preprocessor error 2 | ||
not a C/C++ file 5 | not a C/C++ file 5 | ||
autoconf compile/link 178 | autoconf compile/[[Link|link]] 178 | ||
no input file 15 | no input file 15 | ||
files in cache 382 | files in cache 382 | ||
| Zeile 312: | Zeile 312: | ||
'''Tipp''' | '''Tipp''' | ||
<br> | <[[BR|br]]> | ||
Um die benötigte Zeit genau zu ermitteln, kann man den Befehl '''time''' einbauen. | Um die benötigte Zeit genau zu ermitteln, kann man den Befehl '''time''' einbauen. | ||
time make yadd-neutrino | time [[Make|make]] [[Yadd|yadd]]-[[Neutrino|neutrino]] | ||
Am Ende des Bauvorganges werden damit die entsprechenden Zeitinformationen ausgegeben. | Am Ende des Bauvorganges werden damit die entsprechenden Zeitinformationen ausgegeben. | ||
| Zeile 320: | Zeile 320: | ||
=== Beispiele === | === Beispiele === | ||
Hier einige Beispiele mit denen man Images, Yadds oder einzelne Targets bauen kann. Diese Beispiele sollten so wie sie hier vorgegeben sind ohne Veränderung auf jedem Linux-System mit den bisher beschriebenen Voraussetzungen laufen. Da die Systeme trotzdem Unterschiede aufweisen können, kann man das aber nicht garantieren. | Hier einige Beispiele mit denen man [[Images|Images]], Yadds oder einzelne Targets bauen kann. Diese Beispiele sollten so wie sie hier vorgegeben sind ohne Veränderung auf jedem [[Linux|Linux]]-System mit den bisher beschriebenen Voraussetzungen laufen. Da die Systeme trotzdem [[Unterschiede|Unterschiede]] aufweisen können, kann man das aber nicht garantieren. | ||
==== neutrino-jffs2-Image ==== | ==== [[Neutrino|neutrino]]-[[Jffs2|jffs2]]-[[Image|Image]] ==== | ||
#! /bin/bash | #! /bin/bash | ||
# beispiel.sh | # beispiel.sh | ||
# Diese Script baut neutrino-jffs2 Images, jeweils 1x und 2x | # Diese Script baut [[Neutrino|neutrino]]-[[Jffs2|jffs2]] [[Images|Images]], jeweils 1x und 2x | ||
#---------------------------------------------- | #---------------------------------------------- | ||
USERDIR=/home/$(whoami) | USERDIR=/home/$(whoami) | ||
#---------------------------------------------- | #---------------------------------------------- | ||
LOGODIR=$USERDIR/Logos | LOGODIR=$USERDIR/Logos | ||
CP=$USERDIR/tuxbox-cvs | CP=$USERDIR/[[Tuxbox|tuxbox]]-[[CVS|cvs]] | ||
DB=$USERDIR/dbox2 | DB=$USERDIR/[[Dbox2|dbox2]] | ||
ARCHIVEDIR=$USERDIR/Archive | ARCHIVEDIR=$USERDIR/Archive | ||
export CVS_RSH=ssh | export CVS_RSH=[[SSH|ssh]] | ||
#----------------------------------------------- | #----------------------------------------------- | ||
cd "$CP" | cd "$CP" | ||
cvs -d anoncvs@cvs.tuxbox.org:/cvs/tuxbox -z3 co -f -r newmake -P . | [[CVS|cvs]] -d anoncvs@[[CVS|cvs]].[[Tuxbox|tuxbox]].org:/[[CVS|cvs]]/[[Tuxbox|tuxbox]] -z3 co -f -r newmake -P . | ||
cd cdk | cd [[CDK|cdk]] | ||
/bin/ln -sf $ARCHIVEDIR/ Archive | /bin/ln -sf $ARCHIVEDIR/ Archive | ||
./autogen.sh | ./autogen.sh | ||
./configure --prefix="$DB" --with-cvsdir="$CP" --enable-flashrules --enable-ccache --with-checkImage=rename --with-logosdir="$LOGODIR" | ./configure --prefix="$DB" --with-cvsdir="$CP" --enable-flashrules --enable-[[Ccache|ccache]] --with-[[CheckImage|checkImage]]=rename --with-logosdir="$LOGODIR" | ||
make flash-neutrino-jffs2-all | [[Make|make]] [[Flash|flash]]-[[Neutrino|neutrino]]-[[Jffs2|jffs2]]-all | ||
==== Neutrino YADD ==== | ==== [[Neutrino|Neutrino]] [[Yadd|YADD]] ==== | ||
#! /bin/bash | #! /bin/bash | ||
# beispiel.sh | # beispiel.sh | ||
# Diese Script baut ein Neutrino Yadd | # Diese Script baut ein [[Neutrino|Neutrino]] [[Yadd|Yadd]] | ||
#---------------------------------------------- | #---------------------------------------------- | ||
USERDIR=/home/$(whoami) | USERDIR=/home/$(whoami) | ||
#---------------------------------------------- | #---------------------------------------------- | ||
LOGODIR=/Logos | LOGODIR=/Logos | ||
CP=$USERDIR/tuxbox-cvs | CP=$USERDIR/[[Tuxbox|tuxbox]]-[[CVS|cvs]] | ||
DB=$USERDIR/dbox2 | DB=$USERDIR/[[Dbox2|dbox2]] | ||
ARCHIVEDIR=$USERDIR/Archive | ARCHIVEDIR=$USERDIR/Archive | ||
export CVS_RSH=ssh | export CVS_RSH=[[SSH|ssh]] | ||
#----------------------------------------------- | #----------------------------------------------- | ||
cd "$CP" | cd "$CP" | ||
cvs -d anoncvs@cvs.tuxbox.org:/cvs/tuxbox -z3 co -f -r newmake -P . | [[CVS|cvs]] -d anoncvs@[[CVS|cvs]].[[Tuxbox|tuxbox]].org:/[[CVS|cvs]]/[[Tuxbox|tuxbox]] -z3 co -f -r newmake -P . | ||
cd cdk | cd [[CDK|cdk]] | ||
/bin/ln -sf $ARCHIVEDIR/ Archive | /bin/ln -sf $ARCHIVEDIR/ Archive | ||
./autogen.sh | ./autogen.sh | ||
./configure --prefix="$DB" --with-cvsdir="$CP" --with-logosdir="$LOGODIR" --enable-ccache | ./configure --prefix="$DB" --with-cvsdir="$CP" --with-logosdir="$LOGODIR" --enable-[[Ccache|ccache]] | ||
make yadd-neutrino | [[Make|make]] [[Yadd|yadd]]-[[Neutrino|neutrino]] | ||
= Was kommt dann...? = | = Was kommt dann...? = | ||
== Booten von YADD == | == Booten von [[Yadd|YADD]] == | ||
Wenn ein YADD frisch erzeugt wurde, kann damit auch die Box booten. Näheres dazu auch im Artikel [[CDK booten]].<br> | Wenn ein [[Yadd|YADD]] frisch erzeugt wurde, kann damit auch die Box booten. Näheres dazu auch im Artikel [[CDK booten]].<[[BR|br]]> | ||
Newmake hält auch ein Make-Target für den serversupport bereit. | Newmake hält auch ein [[Make|Make]]-Target für den serversupport bereit. | ||
make serversupport | [[Make|make]] serversupport | ||
Dieses erzeugt einige Konfigurationsdateien für den Server der das YADD-Build nahtlos an das Server-Setup anknüpft. | Dieses erzeugt einige Konfigurationsdateien für den [[Server|Server]] der das [[Yadd|YADD]]-Build nahtlos an das [[Server|Server]]-Setup anknüpft. | ||
== Flashen des Images == | == [[Flashen|Flashen]] des [[Images|Images]] == | ||
Wenn ein Image gebaut wurde, ist der logische nächste Schritt das Einspielen des Images in den Flash der Box. Hierfür ist entweder, das interaktive Flashen innerhalb der GUI (Expertenfunktionen) zu benutzen, oder der ''dboxflasher'' zu verwenden. Der dboxflasher wird durch das Make-Target | Wenn ein [[Image|Image]] gebaut wurde, ist der logische nächste Schritt das Einspielen des [[Images|Images]] in den [[Flash|Flash]] der Box. Hierfür ist entweder, das interaktive [[Flashen|Flashen]] innerhalb der [[GUI|GUI]] (Expertenfunktionen) zu benutzen, oder der ''dboxflasher'' zu verwenden. Der dboxflasher wird durch das [[Make|Make]]-Target | ||
make serversupport | [[Make|make]] serversupport | ||
erzeugt. Andere Möglichkeiten des Flashens werden [[Installation|hier]] beschrieben. | erzeugt. Andere Möglichkeiten des Flashens werden [[Installation|hier]] beschrieben. | ||
| Zeile 386: | Zeile 386: | ||
== Inkrementelle Builds == | == Inkrementelle Builds == | ||
Im allgemeinen ist man nicht an einem einmaligen Build der Software interessiert. Verbesserungen an den Quellen werden in das CVS täglich eingecheckt. Oft möchte man die Software durch eigene Programmierung verbessern oder Patches anwenden. Es ist dabei wünschenswert, dass genau nur die Teile neu erzeugt wird, die neu erzeugt werden sollen, nicht mehr und nicht weniger. Newmake geht einen direkten Weg in diese Richtung. | Im allgemeinen ist man nicht an einem einmaligen Build der [[Software|Software]] interessiert. Verbesserungen an den Quellen werden in das [[CVS|CVS]] täglich eingecheckt. Oft möchte man die [[Software|Software]] durch eigene Programmierung verbessern oder Patches anwenden. [[ES|Es]] ist dabei wünschenswert, dass genau nur die Teile neu erzeugt wird, die neu erzeugt werden sollen, nicht mehr und nicht weniger. Newmake geht einen direkten Weg in diese Richtung. | ||
<br> | <[[BR|br]]> | ||
Um ein Target neu zu bauen, benutze den Befehl | Um ein Target neu zu bauen, benutze den Befehl | ||
make [target] | [[Make|make]] [target] | ||
und make wird es, falls notwendig, neu erzeugen. | und [[Make|make]] wird [[ES|es]], falls notwendig, neu erzeugen. | ||
Es kann auch passieren, dass make zusätzlich einen vollständig anderen Bestandteil neu erzeugt! Dies ist dann der Fall, wenn das jeweilige Target von anderen Teilen abhängt, die sich geändert haben. | [[ES|Es]] kann auch passieren, dass [[Make|make]] zusätzlich einen vollständig anderen Bestandteil neu erzeugt! Dies ist dann der Fall, wenn das jeweilige Target von anderen Teilen abhängt, die sich geändert haben. | ||
<br> | <[[BR|br]]> | ||
In einige Situationen kann es auch wünschenswert sein, ein erneutes Bauen einer Komponente zu erzwingen. Einige Komponenten werden in einem Distributionsfile zum Verzeichnis cdk/Archive heruntergeladen, und wenn das Build stattfindet, ausgepackt, evtl. Patches angewendet, konfiguriert, kompiliert, installiert und die Quellen dann wieder gelöscht.<br> | In einige Situationen kann [[ES|es]] auch wünschenswert sein, ein erneutes Bauen einer Komponente zu erzwingen. Einige Komponenten werden in einem Distributionsfile zum Verzeichnis [[CDK|cdk]]/Archive heruntergeladen, und wenn das Build stattfindet, ausgepackt, evtl. Patches angewendet, konfiguriert, kompiliert, installiert und die Quellen dann wieder gelöscht.<[[BR|br]]> | ||
Alles findet automatisch statt. Die Installation eines bestimmten Pakets wird durch das Anlegen einer Markerdatei im Verzeichnis ''cdk/.deps'' vermerkt. | Alles findet automatisch statt. Die [[Installation|Installation]] eines bestimmten Pakets wird durch das Anlegen einer Markerdatei im Verzeichnis ''[[CDK|cdk]]/.deps'' vermerkt. | ||
<br> | <[[BR|br]]> | ||
Falls gewünscht, kann solch eine Markiererdatei entfernt werden, um das Neuerzeugen der entsprechenden Komponetne zu erzwingen. Es gibt hierfür auch entsprechende Targets, die "''Cleaning Targets''". | Falls gewünscht, kann solch eine Markiererdatei entfernt werden, um das Neuerzeugen der entsprechenden Komponetne zu erzwingen. [[ES|Es]] gibt hierfür auch entsprechende Targets, die "''Cleaning Targets''". | ||
== Cleaning targets == | == Cleaning targets == | ||
Es gibt mehrere unterschiedliche Aufräum-Targets: | [[ES|Es]] gibt mehrere unterschiedliche Aufräum-Targets: | ||
<br> | <[[BR|br]]> | ||
make distclean | [[Make|make]] distclean | ||
Das drastischste Reinigungs-Target, (fast) alles löschend, was nicht vom CVS ausgecheckt wurde. | Das drastischste Reinigungs-Target, (fast) alles löschend, was nicht vom [[CVS|CVS]] ausgecheckt wurde. | ||
Dieses ist eher selten notwendig. | Dieses ist eher selten notwendig. | ||
<br> | <[[BR|br]]> | ||
make mostlyclean | [[Make|make]] mostlyclean | ||
Ein intelligenteres Target ist ''mostlyclean''. Es säubert die Verzeichnisse, die Tuxboxquellen enthalten, lässt aber die Kompilationsumgebung und alle ''Auspacken-kompilieren-installieren-löschen-Komponente'' unberührt. | Ein intelligenteres Target ist ''mostlyclean''. [[ES|Es]] säubert die Verzeichnisse, die Tuxboxquellen enthalten, lässt aber die Kompilationsumgebung und alle ''Auspacken-kompilieren-installieren-löschen-Komponente'' unberührt. | ||
<br> | <[[BR|br]]> | ||
Auch das cdkroot Verzeichnis, (d.h. die Yadd-Installation), sowie die TFTP-Files (Kernel und u-boot) werden nicht angefasst. | Auch das cdkroot Verzeichnis, (d.h. die [[Yadd|Yadd]]-[[Installation|Installation]]), sowie die [[Tftp|TFTP]]-Files ([[Kernel|Kernel]] und [[U-boot|u-boot]]) werden nicht angefasst. | ||
<br> | <[[BR|br]]> | ||
make depsclean | [[Make|make]] depsclean | ||
Löscht alle Markerdateien im /cdk/.deps Verzeichnis und zwingt so zum Neukompliieren aller [[Auspacken-kompilieren-installieren-löschen-Komponenten]]. | Löscht alle Markerdateien im /[[CDK|cdk]]/.deps Verzeichnis und zwingt so zum Neukompliieren aller [[Auspacken-kompilieren-installieren-löschen-Komponenten]]. | ||
<br> | <[[BR|br]]> | ||
Dies ist selten sinnvoll: Diese hängen von ihren Quellen und vielleicht von einem Patchfile ab, und der Makefile kennt diese Abhängigkeiten. | Dies ist selten sinnvoll: Diese hängen von ihren Quellen und vielleicht von einem Patchfile ab, und der Makefile kennt diese Abhängigkeiten. | ||
<br> | <[[BR|br]]> | ||
make clean | [[Make|make]] clean | ||
Kombiniert ''mostlyclean'', ''depsclean'', und ''flash-clean''. Versucht auch soviel wie möglich im cdkroot-Verzeichnis zu löschen, das nicht während des Bootstrapdurchlaufes installiert war. So wird | Kombiniert ''mostlyclean'', ''depsclean'', und ''[[Flash|flash]]-clean''. Versucht auch soviel wie möglich im cdkroot-Verzeichnis zu löschen, das nicht während des Bootstrapdurchlaufes installiert war. So wird | ||
versucht, die Umgebung in einem Zustand zu bringen, wo die Buildumgebung gerade kompiliert worden ist, z.B. mit ''make bootstrap''. | versucht, die Umgebung in einem Zustand zu bringen, wo die Buildumgebung gerade kompiliert worden ist, z.B. mit ''[[Make|make]] bootstrap''. | ||
<br> | <[[BR|br]]> | ||
make flash-semiclean | [[Make|make]] [[Flash|flash]]-semiclean | ||
Dieses Target löscht die meisten Verzeichnisse in $(flashprefix), mit Ausnahme der Boot-Partitionen und der Kernelbauverzeichnisse.<br> | Dieses Target löscht die meisten Verzeichnisse in $(flashprefix), mit Ausnahme der Boot-Partitionen und der Kernelbauverzeichnisse.<[[BR|br]]> | ||
Dieses ist oft sinnvoll, da diese Bestandteile verhältnismässig sich selten ändern. | Dieses ist oft sinnvoll, da diese Bestandteile verhältnismässig sich selten ändern. | ||
<br> | <[[BR|br]]> | ||
make flash-mostlyclean | [[Make|make]] [[Flash|flash]]-mostlyclean | ||
Zusätzlich zum ''flash-semiclean'' löscht dieses Target auch Bootfiles und die Kernbauverzeichnisse. Vollimages werden unberührt gelassen. | Zusätzlich zum ''[[Flash|flash]]-semiclean'' löscht dieses Target auch Bootfiles und die Kernbauverzeichnisse. Vollimages werden unberührt gelassen. | ||
<br> | <[[BR|br]]> | ||
make flash-clean | [[Make|make]] [[Flash|flash]]-clean | ||
Dieses Target löscht Alles in $(flashprefix). | Dieses Target löscht Alles in $(flashprefix). | ||
<br> | <[[BR|br]]> | ||
Einige Quellverzeichnisse können mit einem Befehl wie | Einige Quellverzeichnisse können mit einem Befehl wie | ||
make -C /tuxbox-cvs/apps/tuxbox/neutrino clean | [[Make|make]] -C /[[Tuxbox|tuxbox]]-[[CVS|cvs]]/apps/[[Tuxbox|tuxbox]]/[[Neutrino|neutrino]] clean | ||
gesäubert werden. | gesäubert werden. | ||
== Aktualisierung des CVS-Quellcodes == | == Aktualisierung des [[CVS|CVS]]-Quellcodes == | ||
Um die Quellen mit neueren Checkins zu aktualisieren, verwende diesen Befehl für das toplevel CVS Verzeichnis (oder von einem anderen Verzeichnis, wenn Ihr wisst, was ihr tut;-). Mögliche Fehler werden in das logfile cvs.log geschrieben. | Um die Quellen mit neueren Checkins zu aktualisieren, verwende diesen Befehl für das toplevel [[CVS|CVS]] Verzeichnis (oder von einem anderen Verzeichnis, wenn Ihr wisst, was ihr tut;-). Mögliche Fehler werden in das logfile [[CVS|cvs]].log geschrieben. | ||
cvs up -f -r newmake -dP > cvs.log 2>&1 | [[CVS|cvs]] up -f -r newmake -dP > [[CVS|cvs]].log 2>&1 | ||
'''Tipp''' | '''Tipp''' | ||
<br> | <[[BR|br]]> | ||
Um mit dem CVS arbeiten zu können nimmt man für gewöhnlich die Konsole für Eingaben. Es gibt aber auch verschiedene Frontendwerkzeuge wie z.B. [http://www.crossvc.com CrossVC] oder [http://cervisia.kde.org/ Cervisia] um nur einige zu nennen, die einen recht komfortablen Umgang mit den CVS-Daten ermöglichen.<br> [[Bild:Crossvc.jpg|CrossVC als CVS Frontendlösung]] [[Bild:Cervisia.jpg|Cervisia als CVS Frontendlösung]]<br> | Um mit dem [[CVS|CVS]] arbeiten zu können nimmt man für gewöhnlich die Konsole für Eingaben. [[ES|Es]] gibt aber auch verschiedene Frontendwerkzeuge wie z.B. [http://www.crossvc.com CrossVC] oder [http://cervisia.kde.org/ Cervisia] um nur einige zu nennen, die einen recht komfortablen Umgang mit den [[CVS|CVS]]-Daten ermöglichen.<[[BR|br]]> [[Bild:Crossvc.jpg|CrossVC als CVS Frontendlösung]] [[Bild:Cervisia.jpg|Cervisia als CVS Frontendlösung]]<[[BR|br]]> | ||
Auch einige IDE's wie z.B. [[WP:Anjuta|Anjuta]] <br> [[Bild:anjuta.jpg|Anjuta als IDE mit CVS-Anbindung]]<br> bieten solche CVS-Schnittstellen an. | Auch einige [[IDE|IDE]]'s wie z.B. [[WP:Anjuta|Anjuta]] <[[BR|br]]> [[Bild:anjuta.jpg|Anjuta als IDE mit CVS-Anbindung]]<[[BR|br]]> bieten solche [[CVS|CVS]]-Schnittstellen an. | ||
== Customization == | == [[Customization|Customization]] == | ||
Bisher lief immer alles darauf hinaus Images oder Yadds zu bauen, die aus unveränderten CVS-Quellen gebaut wurden.<br> | Bisher lief immer alles darauf hinaus [[Images|Images]] oder Yadds zu bauen, die aus unveränderten [[CVS|CVS]]-Quellen gebaut wurden.<[[BR|br]]> | ||
Images und die Yadds können aber auch angepasst ("customized") werden, ohne die Makefiles zu ändern. | [[Images|Images]] und die Yadds können aber auch angepasst ("customized") werden, ohne die [[Makefiles|Makefiles]] zu ändern. | ||
<br> | <[[BR|br]]> | ||
Hier gibt es verschiedene Möglichkeiten. | Hier gibt [[ES|es]] verschiedene Möglichkeiten. | ||
=== Konfigurationsoptionen === | === Konfigurationsoptionen === | ||
hier einige nützliche Optionen:<br> | hier einige nützliche Optionen:<[[BR|br]]> | ||
Hiermit kann ein Verzeichniss angegeben werden, welches die Ucodes enthält, die im Image enthalten sein sollen. | Hiermit kann ein Verzeichniss angegeben werden, welches die [[Ucodes|Ucodes]] enthält, die im [[Image|Image]] enthalten sein sollen. | ||
--with-ucodesdir=[DIR] | --with-ucodesdir=[DIR] | ||
'''Hinweis:'''<br> | '''Hinweis:'''<[[BR|br]]> | ||
<font color="#FF0000" size="4"><strong>Ein Image, dass ucodes enthält, darf | <font color="#FF0000" size="4"><strong>Ein [[Image|Image]], dass [[Ucodes|ucodes]] enthält, darf | ||
nicht verbreitet werden!</strong> </font> | nicht verbreitet werden!</strong> </font> | ||
<br> | <[[BR|br]]> | ||
<br> | <[[BR|br]]> | ||
Mit der Option | Mit der Option | ||
--with-logosdir=[DIR] | --with-logosdir=[DIR] | ||
kann ein Verzeichniss angegeben werden, das boot-logos (logo-lcd und logo-fb) enthält, die im Image enthalten sein sollen. | kann ein Verzeichniss angegeben werden, das boot-logos (logo-[[LCD|lcd]] und logo-fb) enthält, die im [[Image|Image]] enthalten sein sollen. | ||
<br> | <[[BR|br]]> | ||
<br> | <[[BR|br]]> | ||
Diese Option | Diese Option | ||
--with-defaultlocale=[LOCALE] | --with-defaultlocale=[LOCALE] | ||
| Zeile 479: | Zeile 479: | ||
=== Ändern der Partitionierung === | === Ändern der Partitionierung === | ||
Die Rootpartitionsgröße für cramfs und squashfs Images kann mit der Configure-Option | Die Rootpartitionsgröße für [[Cramfs|cramfs]] und [[Squashfs|squashfs]] [[Images|Images]] kann mit der Configure-Option | ||
--with-rootpartitionsize=[SIZE] | --with-rootpartitionsize=[SIZE] | ||
angegeben werden. | angegeben werden. | ||
<br> | <[[BR|br]]> | ||
Die Größe der var-Partition wird automatisch berechnet, wobei man den restlichen Flashspeicher nutzt, der nicht durch die anderen Partitionen benutzt wird. Die Standardgröße ist 0x660000. | Die Größe der var-[[Partition|Partition]] wird automatisch berechnet, wobei man den restlichen Flashspeicher nutzt, der nicht durch die anderen Partitionen benutzt wird. Die Standardgröße ist 0x660000. | ||
Diese Zahl sollte eine Multiple der Erasesize, momentan 0x20000 sein. Dies wird allerdings ignoriert falls es wie bei der jffs2-Imageerstellung unsinnig wäre. | Diese Zahl sollte eine Multiple der Erasesize, momentan 0x20000 sein. Dies wird allerdings ignoriert falls [[ES|es]] wie bei der [[Jffs2|jffs2]]-Imageerstellung unsinnig wäre. | ||
| Zeile 490: | Zeile 490: | ||
=== Variablen === | === Variablen === | ||
==== Pfade ==== | ==== Pfade ==== | ||
Es sind noch weitere Benutzeranpassungen möglich. Dafür ist es aber notwendig, etwas Wissen | [[ES|Es]] sind noch weitere Benutzeranpassungen möglich. Dafür ist [[ES|es]] aber notwendig, etwas [[Wissen|Wissen]] ü[[BER|ber]] die innere Funktionsweise der [[Makefiles|Makefiles]] zu haben.<[[BR|br]]> | ||
In der Folge bezeichnet | In der Folge bezeichnet | ||
$(flashprefix) | $(flashprefix) | ||
den Wert der Makefile Variablen '''flashprefix''' (mit Konfiguration wie oben '''/dbox2/cdkflash''') | den Wert der Makefile Variablen '''flashprefix''' (mit Konfiguration wie oben '''/[[Dbox2|dbox2]]/cdkflash''') | ||
$(targetprefix) | $(targetprefix) | ||
bezeichnet den Wert der Makefile Variablen '''targetprefix''' (mit Konfiguration wie oben '''/dbox2/cdkroot'''), und | bezeichnet den Wert der Makefile Variablen '''targetprefix''' (mit Konfiguration wie oben '''/[[Dbox2|dbox2]]/cdkroot'''), und | ||
$(buildprefix) | $(buildprefix) | ||
bezeichnet den Wert der Makefile Variablen '''buildprefix''' (mit der Konfiguration oben '''/tuxbox-cvs/cdk'''). | bezeichnet den Wert der Makefile Variablen '''buildprefix''' (mit der Konfiguration oben '''/[[Tuxbox|tuxbox]]-[[CVS|cvs]]/[[CDK|cdk]]'''). | ||
<br> | <[[BR|br]]> | ||
<br> | <[[BR|br]]> | ||
Um z.B. ein '''neutrino-cramfs.img2x''' zu erzeugen, werden die folgenden Verzeichnisse erstellt:<br> | Um z.B. ein '''[[Neutrino|neutrino]]-[[Cramfs|cramfs]].img2x''' zu erzeugen, werden die folgenden Verzeichnisse erstellt:<[[BR|br]]> | ||
*'''$(flashprefix)/root''' (enthält Filesystem- und GUI-unabhängige Bestandteile) | *'''$(flashprefix)/root''' (enthält [[Filesystem|Filesystem]]- und [[GUI|GUI]]-unabhängige Bestandteile) | ||
*'''$(flashprefix)/root-cramfs''' (enthält den Kernel, für Root-Filesystem auf cramfs konfiguriert, zusammen mit seinen Treibern) und | *'''$(flashprefix)/root-[[Cramfs|cramfs]]''' (enthält den [[Kernel|Kernel]], für Root-[[Filesystem|Filesystem]] auf [[Cramfs|cramfs]] konfiguriert, zusammen mit seinen Treibern) und | ||
*'''$(flashprefix)/root-neutrino''' (enthält die Neutrinoinstallation). | *'''$(flashprefix)/root-[[Neutrino|neutrino]]''' (enthält die Neutrinoinstallation). | ||
<br> | <[[BR|br]]> | ||
Aus diesen drei Verzeichnissen, werden das Rootfilesystemverzeichniss | Aus diesen drei Verzeichnissen, werden das Rootfilesystemverzeichniss | ||
*'''$(flashprefix)/root-neutrino-cramfs''' und das | *'''$(flashprefix)/root-[[Neutrino|neutrino]]-[[Cramfs|cramfs]]''' und das | ||
var-filesystemverzeichnis | var-filesystemverzeichnis | ||
*'''$(flashprefix)/var-neutrino''' gebaut. | *'''$(flashprefix)/var-[[Neutrino|neutrino]]''' gebaut. | ||
<br> | <[[BR|br]]> | ||
Hiermit ist es möglich, einen Befehl wie | Hiermit ist [[ES|es]] möglich, einen Befehl wie | ||
make $(flashprefix)/root-neutrino-jffs2 | [[Make|make]] $(flashprefix)/root-[[Neutrino|neutrino]]-[[Jffs2|jffs2]] | ||
bzw. wenn man sich im Verzeichnis ''./tuxbox-cvs/cdk'' befindet, den Befehl | bzw. wenn man sich im Verzeichnis ''./[[Tuxbox|tuxbox]]-[[CVS|cvs]]/[[CDK|cdk]]'' befindet, den Befehl | ||
make root-neutrino-jffs2 | [[Make|make]] root-[[Neutrino|neutrino]]-[[Jffs2|jffs2]] | ||
einzugeben, wobei man bei erster VAriante natürlich '''$(flashprefix)''' selbst durch den realen Pfad ersetzen muss, da '''$(flashprefix)''' nur eine make-Variable ist, welche in unserem Beispiel den Pfad zu '''./dbox2/cdkflash''' darstellt.<br> | einzugeben, wobei man bei erster VAriante natürlich '''$(flashprefix)''' selbst durch den realen Pfad ersetzen muss, da '''$(flashprefix)''' nur eine [[Make|make]]-Variable ist, welche in unserem Beispiel den Pfad zu '''./[[Dbox2|dbox2]]/cdkflash''' darstellt.<[[BR|br]]> | ||
Man kann so manuell gewünschten Änderungen an '''$(flashprefix)/root-neutrino-jffs2''' vornehmen, und dann, mit dem Befehl | Man kann so manuell gewünschten Änderungen an '''$(flashprefix)/root-[[Neutrino|neutrino]]-[[Jffs2|jffs2]]''' vornehmen, und dann, mit dem Befehl | ||
make flash-neutrino-jffs2-2x | [[Make|make]] [[Flash|flash]]-[[Neutrino|neutrino]]-[[Jffs2|jffs2]]-2x | ||
den Imagebau abschließen, um ein Image zu erstellen, das diese manuellen Änderungen enthält. | den Imagebau abschließen, um ein [[Image|Image]] zu erstellen, das diese manuellen Änderungen enthält. | ||
<br> | <[[BR|br]]> | ||
Dieses kann zwar für den einmaligen Imagebau sinnvoll sein, jedoch in vielen Fällen dürfte eine automatisierte und systematischere Methode erforderlich sein. | Dieses kann zwar für den einmaligen Imagebau sinnvoll sein, jedoch in vielen Fällen dürfte eine automatisierte und systematischere Methode erforderlich sein. | ||
=== Customization-Scripte === | === [[Customization|Customization]]-Scripte === | ||
Sofern vorhanden und ausführbar werden innerhalb der wichtigsten Targets sogenannte ''Customization-Scripte'' aufgerufen. Hiermit lassen sich beispielsweise Änderungen im Dateisystem der fertigen Yadds oder Images erledigen. Im einfachsten Falle kann man sich damit z.B. eigene Tools, Scripte oder Plugins an die gewünschte Position im Dateisystem kopieren, um nur eine Anwendungsmöglichkeit zu nennen. | Sofern vorhanden und ausführbar werden innerhalb der wichtigsten Targets sogenannte ''[[Customization|Customization]]-Scripte'' aufgerufen. Hiermit lassen sich beispielsweise Änderungen im [[Dateisystem|Dateisystem]] der fertigen Yadds oder [[Images|Images]] erledigen. Im einfachsten Falle kann man sich damit z.B. eigene [[Tools|Tools]], Scripte oder [[Plugins|Plugins]] an die gewünschte Position im [[Dateisystem|Dateisystem]] kopieren, um nur eine Anwendungsmöglichkeit zu nennen. | ||
Das bzw. die Scripte müssen im '''customizationsdir''' liegen. | Das bzw. die Scripte müssen im '''customizationsdir''' liegen. | ||
Dies ist bei Bedarf mit der Option | Dies ist bei Bedarf mit der Option | ||
--with-customizationsdir=[DIR] | --with-customizationsdir=[DIR] | ||
einstellbar. Standardverzeichnis ist '''./cdk'''. | einstellbar. Standardverzeichnis ist '''./[[CDK|cdk]]'''. | ||
<br> | <[[BR|br]]> | ||
Auf diese Scripte werden zwei Argumente zur Laufzeit übergeben: | Auf diese Scripte werden zwei Argumente zur Laufzeit übergeben: | ||
<br> | <[[BR|br]]> | ||
Für Imagetargets sind dies | Für Imagetargets sind dies | ||
*$(flashprefix) | *$(flashprefix) | ||
| Zeile 540: | Zeile 540: | ||
und | und | ||
*$(buildprefix) | *$(buildprefix) | ||
<br> | <[[BR|br]]> | ||
<br> | <[[BR|br]]> | ||
Die Bezeichnung "Script" ist etwas irreführend, da sie eigentlich wie normale Programme mit zwei Argumenten ausgeführt werden. Anstelle eines Shell-Scripts könnte dies z.B. ein kompiliertes C Programme, oder ein Perl-Script sein.<br> | Die Bezeichnung "Script" ist etwas irreführend, da sie eigentlich wie normale Programme mit zwei Argumenten ausgeführt werden. Anstelle eines [[Shell|Shell]]-Scripts könnte dies z.B. ein kompiliertes C Programme, oder ein [[Perl|Perl]]-Script sein.<[[BR|br]]> | ||
Der Name eines Customization Scriptes besteht in der Regel aus dem Namen eines Targetverzeichnisses bzw. in einigen Fällen einem Target und dem angefügtem *'''-local.sh'''.<br> | Der Name eines [[Customization|Customization]] Scriptes besteht in der Regel aus dem Namen eines Targetverzeichnisses bzw. in einigen Fällen einem Target und dem angefügtem *'''-local.sh'''.<[[BR|br]]> | ||
==== Für Flash-Targets ==== | ==== Für [[Flash|Flash]]-Targets ==== | ||
Der Name der Customization Scripte für Images besteht aus den wie oben benannten Verzeichnissen in ''flashprefix'', | Der Name der [[Customization|Customization]] Scripte für [[Images|Images]] besteht aus den wie oben benannten Verzeichnissen in ''flashprefix'', | ||
*root | *root | ||
<br> | <[[BR|br]]> | ||
dem Namen der jeweilige Benutzeroberfläche, als "[[GUI]]" in Klammern bezeichnet, also | dem Namen der jeweilige Benutzeroberfläche, als "[[GUI]]" in Klammern bezeichnet, also | ||
*neutrino | *[[Neutrino|neutrino]] | ||
*enigma | *[[Enigma|enigma]] | ||
*lcars | *[[Lcars|lcars]] | ||
*radiobox | *[[Radiobox|radiobox]] | ||
<br> | <[[BR|br]]> | ||
"[[FS]]" zeigt an welches Filesystem gemeint ist. | "[[FS]]" zeigt an welches [[Filesystem|Filesystem]] gemeint ist. | ||
*cramfs | *[[Cramfs|cramfs]] | ||
*squashfs | *[[Squashfs|squashfs]] | ||
*jffs2 | *[[Jffs2|jffs2]] | ||
<br> | <[[BR|br]]> | ||
so wäre die Bezeichnung der jeweiligen Scripte so aufgebaut: | so wäre die Bezeichnung der jeweiligen Scripte so aufgebaut: | ||
*root-local.sh | *root-local.sh | ||
| Zeile 568: | Zeile 568: | ||
*root-[FS]-local.sh | *root-[FS]-local.sh | ||
*var-[GUI]-local.sh | *var-[GUI]-local.sh | ||
<br> | <[[BR|br]]> | ||
'''Beispiele:''' | '''Beispiele:''' | ||
root-local.sh | root-local.sh | ||
root-neutrino-local.sh | root-[[Neutrino|neutrino]]-local.sh | ||
root-neutrino-squashfs-local.sh | root-[[Neutrino|neutrino]]-[[Squashfs|squashfs]]-local.sh | ||
root-squashfs-local.sh | root-[[Squashfs|squashfs]]-local.sh | ||
var-neutrino-local.sh | var-[[Neutrino|neutrino]]-local.sh | ||
==== Für Yadd-Targets ==== | ==== Für [[Yadd|Yadd]]-Targets ==== | ||
Für Yadds ist das Prinzip ähnlich, nur dass es hier quasi nur einen Ordner gibt. Dafür stellvertretend steht dann | Für Yadds ist das Prinzip ähnlich, nur dass [[ES|es]] hier quasi nur einen Ordner gibt. Dafür stellvertretend steht dann | ||
*yadd.<br> | *[[Yadd|yadd]].<[[BR|br]]> | ||
Das "[[GUI]]" in Klammern bezeichnet auch hier die jeweilig betroffene Benutzeroberflche, also | Das "[[GUI]]" in Klammern bezeichnet auch hier die jeweilig betroffene Benutzeroberflche, also | ||
*neutrino | *[[Neutrino|neutrino]] | ||
*enigma | *[[Enigma|enigma]] | ||
*lcars | *[[Lcars|lcars]] | ||
*radiobox | *[[Radiobox|radiobox]] | ||
<br> | <[[BR|br]]> | ||
so wäre die Bezeichnung der jeweiligen Scripte so aufgebaut. | so wäre die Bezeichnung der jeweiligen Scripte so aufgebaut. | ||
*yadd-[GUI]-local.sh | *[[Yadd|yadd]]-[GUI]-local.sh | ||
'''Beispiel:''' | '''Beispiel:''' | ||
yadd-neutrino-local.sh | [[Yadd|yadd]]-[[Neutrino|neutrino]]-local.sh | ||
==== Andere Customization Scripte ==== | ==== Andere [[Customization|Customization]] Scripte ==== | ||
Die bisher benannten Customization Scripte für Flash- u. Yadd-Targets sind die gebräuchlichsten. Diese werden allerdings gewissermaßen nur an die bestehenden Targets angehängt, anders als es bei den anderen, von denen es in Newmake noch jede Menge mehr gibt, bei denen dies als Ersatz der eigentlichen Targets dienen.<br> | Die bisher benannten [[Customization|Customization]] Scripte für [[Flash|Flash]]- u. [[Yadd|Yadd]]-Targets sind die gebräuchlichsten. Diese werden allerdings gewissermaßen nur an die bestehenden Targets angehängt, anders als [[ES|es]] bei den anderen, von denen [[ES|es]] in Newmake noch jede Menge mehr gibt, bei denen dies als Ersatz der eigentlichen Targets dienen.<[[BR|br]]> | ||
Im Prinzip ginge dies auf so gut wie alle Targets anzuwenden. Möchte man z.B. ein Contrib-Tool "customizen", etwa [[hdparm]], kann man ein Script erstellen: | Im Prinzip ginge dies auf so gut wie alle Targets anzuwenden. Möchte man z.B. ein Contrib-Tool "customizen", etwa [[hdparm]], kann man ein Script erstellen: | ||
*hdparm-local.sh | *hdparm-local.sh | ||
Führt man dann das Target: | Führt man dann das Target: | ||
make hdparm | [[Make|make]] hdparm | ||
aus, wird dann das ausgeführt was im Customization Script angelgt wurde. Die Aktionen im Original-Makefile werden übersprungen. | aus, wird dann das ausgeführt was im [[Customization|Customization]] Script angelgt wurde. Die Aktionen im Original-Makefile werden übersprungen. | ||
<br><br> | <[[BR|br]]><[[BR|br]]> | ||
Auch diese Funktion ist recht interessant und dürfte recht oft Anwendung finden:<br> | Auch diese Funktion ist recht interessant und dürfte recht oft Anwendung finden:<[[BR|br]]> | ||
Während des make-Durchlaufs werden einige Targets ausgeführt, welche die '''/.version'''-Files bei [[YADD]] | Während des [[Make|make]]-Durchlaufs werden einige Targets ausgeführt, welche die '''/.version'''-Files bei [[YADD]] | ||
*'''version''' | *'''version''' | ||
bzw. | bzw. | ||
*'''flash-version''' | *'''[[Flash|flash]]-version''' | ||
im [[Image]] erstellt. | im [[Image]] erstellt. | ||
<br> | <[[BR|br]]> | ||
Sofern eines dieser Scripte; | Sofern eines dieser Scripte; | ||
*'''version-local.sh''' | *'''version-local.sh''' | ||
*'''flash-version-local.sh''' | *'''[[Flash|flash]]-version-local.sh''' | ||
vorhanden und ausführbar ist, wird es als Ersatz statt des originalen Targets ausgeführt, welches mit | vorhanden und ausführbar ist, wird [[ES|es]] als Ersatz statt des originalen Targets ausgeführt, welches mit | ||
make version | [[Make|make]] version | ||
bzw. | bzw. | ||
make flash-version | [[Make|make]] [[Flash|flash]]-version | ||
angestoßen wird. | angestoßen wird. | ||
| Zeile 624: | Zeile 624: | ||
Beispiel: | Beispiel: | ||
In einem jffs2-Image wird dies gewünscht: | In einem [[Jffs2|jffs2]]-[[Image|Image]] wird dies gewünscht: | ||
1. Eigene /etc/hosts benutzen, | 1. Eigene /etc/hosts benutzen, | ||
2. Eigene neutrino.conf, bouquets.xml, services.xml benutzen | 2. Eigene [[Neutrino|neutrino]].conf, [[Bouquets|bouquets]].[[XML|xml]], services.[[XML|xml]] benutzen | ||
3. einschließlich lirc-Komponenten, zusammen mit eigenen lirc Konfigurations-Dateien. | 3. einschließlich [[Lirc|lirc]]-Komponenten, zusammen mit eigenen [[Lirc|lirc]] Konfigurations-Dateien. | ||
1. und 3. sind Erweiterungen, die nach '''$(flashprefix)/root''' kommen sollten, während 2. Neutrino-regeln sind, welche nach sollten '''$(flashprefix)/root-neutrino-jffs2''' gehöhren. <br> | 1. und 3. sind [[Erweiterungen|Erweiterungen]], die nach '''$(flashprefix)/root''' kommen sollten, während 2. [[Neutrino|Neutrino]]-regeln sind, welche nach sollten '''$(flashprefix)/root-[[Neutrino|neutrino]]-[[Jffs2|jffs2]]''' gehöhren. <[[BR|br]]> | ||
Um 1. und 3. zu erreichen, wird das Script '''root-local.sh''' erstellt, z.B.: | Um 1. und 3. zu erreichen, wird das Script '''root-local.sh''' erstellt, z.B.: | ||
| Zeile 640: | Zeile 640: | ||
myfiles=/home/somewhere/dbox/myfiles | myfiles=/home/somewhere/dbox/myfiles | ||
cp -f $myfiles/etc/hosts $newroot/etc | cp -f $myfiles/etc/hosts $newroot/etc | ||
make flashlirc | [[Make|make]] flashlirc | ||
cp -fr $myfiles/var/tuxbox/config/lirc $newroot/var/tuxbox/config | cp -fr $myfiles/var/[[Tuxbox|tuxbox]]/config/[[Lirc|lirc]] $newroot/var/[[Tuxbox|tuxbox]]/config | ||
Das Script für 2. heist '''root-neutrino-local.sh''', was dem verherigen sehr ähnlich ist: | Das Script für 2. heist '''root-[[Neutrino|neutrino]]-local.sh''', was dem verherigen sehr ähnlich ist: | ||
#!/bin/sh | #!/bin/sh | ||
# root-neutrino-local.sh | # root-[[Neutrino|neutrino]]-local.sh | ||
flashprefix=$1 | flashprefix=$1 | ||
buildprefix=$2 | buildprefix=$2 | ||
newroot=$flashprefix/root-neutrino | newroot=$flashprefix/root-[[Neutrino|neutrino]] | ||
myfiles=/home/somewhere/dbox/myfiles | myfiles=/home/somewhere/dbox/myfiles | ||
cp $myfiles/var/tuxbox/config/neutrino.conf $newroot/var/tuxbox/config | cp $myfiles/var/[[Tuxbox|tuxbox]]/config/[[Neutrino|neutrino]].conf $newroot/var/[[Tuxbox|tuxbox]]/config | ||
cp $myfiles/var/tuxbox/config/zapit/bouquets.xml $newroot/var/tuxbox/config/zapit | cp $myfiles/var/[[Tuxbox|tuxbox]]/config/[[Zapit|zapit]]/[[Bouquets|bouquets]].[[XML|xml]] $newroot/var/[[Tuxbox|tuxbox]]/config/[[Zapit|zapit]] | ||
cp $myfiles/var/tuxbox/config/zapit/services.xml $newroot/var/tuxbox/config/zapit | cp $myfiles/var/[[Tuxbox|tuxbox]]/config/[[Zapit|zapit]]/services.[[XML|xml]] $newroot/var/[[Tuxbox|tuxbox]]/config/[[Zapit|zapit]] | ||
'''Bitte beachten:''' | '''Bitte beachten:''' | ||
| Zeile 661: | Zeile 661: | ||
= Einige "best practices" = | = Einige "best practices" = | ||
In diesem Abschnitt befinden sich einige Richtlinien, die zwar nicht zwingend "notwendig" sind, um korrekte Ergebnisse zu erzeilen, jedoch werden sie langfristig helfen, bessere, zuverlässigere und pflegbare Software zu erstellen. Dies betrifft Customizations, sowie zukünftige Änderungen am Makefile und deren Bestandteile selbst. | In diesem Abschnitt befinden sich einige Richtlinien, die zwar nicht zwingend "notwendig" sind, um korrekte Ergebnisse zu erzeilen, jedoch werden sie langfristig helfen, bessere, zuverlässigere und pflegbare [[Software|Software]] zu erstellen. Dies betrifft Customizations, sowie zukünftige Änderungen am Makefile und deren Bestandteile selbst. | ||
<br> | <[[BR|br]]> | ||
Wenn man diese Richtlinien nicht mag, kann man sie ignorieren, zumindest wenn man Customization Scripte für den eigenen Bedarf schreibt. | Wenn man diese Richtlinien nicht mag, kann man sie ignorieren, zumindest wenn man [[Customization|Customization]] Scripte für den eigenen Bedarf schreibt. | ||
== Idempotens == | == Idempotens == | ||
Es ist fast immer eine gute Idee zu versuchen, ein Installationsscript [[Wikipedia:Idempotent|idempotent]] zu schreiben. Dies bedeutet, dass das mehrmalige Ausführen den gleichen Effekt hat wie das einmalige Ausführen. | [[ES|Es]] ist fast immer eine gute Idee zu versuchen, ein Installationsscript [[Wikipedia:Idempotent|idempotent]] zu schreiben. Dies bedeutet, dass das mehrmalige Ausführen den gleichen Effekt hat wie das einmalige Ausführen. | ||
Benutze "make install". | Benutze "[[Make|make]] install". | ||
<br> | <[[BR|br]]> | ||
In der Vergangenheit hat das Tuxbox Makefile die Komponenten zuerst in ''$(targetprefix)'' installiert, und dann die Imageverzeichnisse durch Kopieren der einzelnen Files aus der ''$(targetprefix)'' Hierarchie erstellt. Dieses ist keine sehr gute Softwaretechnik. | In der Vergangenheit hat das [[Tuxbox|Tuxbox]] Makefile die Komponenten zuerst in ''$(targetprefix)'' installiert, und dann die Imageverzeichnisse durch Kopieren der einzelnen Files aus der ''$(targetprefix)'' Hierarchie erstellt. Dieses ist keine sehr gute Softwaretechnik. | ||
<br> | <[[BR|br]]> | ||
Zuerst gehört das Know-How bzgl. Installation des Paketes in das Makefile des Pakets, und soll nicht in einem einzigem großen Makefile sitzen, das einfach einzelne Files rüberkopiert. Wenn dieses Paket sich ändert, z.B. man ein Konfigurations-File hinzufügt oder löscht, wird es auch notwendig, das globale Makefile zu ändern. | Zuerst gehört das Know-How bzgl. [[Installation|Installation]] des Paketes in das Makefile des Pakets, und soll nicht in einem einzigem großen Makefile sitzen, das einfach einzelne Files rüberkopiert. Wenn dieses Paket sich ändert, z.B. man ein Konfigurations-File hinzufügt oder löscht, wird [[ES|es]] auch notwendig, das globale Makefile zu ändern. | ||
<br> | <[[BR|br]]> | ||
<br> | <[[BR|br]]> | ||
Es ist häufig der Fall, dass das Makefile, das zu einem Paket gehört, include-Files, (statische) Bibliotheken, Info-Files etc. installiert, die nicht auf einem enbedded System mit beschränktem Speicher erwünscht sind. Die korrekte Lösung zu diesem (wirklichen!) Problem wäre, das Makefile des betreffenden Pakets zu ändern, entweder, um ein flashinstall-Target zu schreiben, oder das Makefile mit einem Parameter wie ''installsize=[full,flash]'' zu versehen. | [[ES|Es]] ist häufig der Fall, dass das Makefile, das zu einem Paket gehört, include-Files, (statische) Bibliotheken, Info-Files etc. installiert, die nicht auf einem enbedded System mit beschränktem Speicher erwünscht sind. Die korrekte Lösung zu diesem (wirklichen!) Problem wäre, das Makefile des betreffenden Pakets zu ändern, entweder, um ein flashinstall-Target zu schreiben, oder das Makefile mit einem Parameter wie ''installsize=[full,flash]'' zu versehen. | ||
<br> | <[[BR|br]]> | ||
Wenn dies nicht durchführbar ist, ist es durchaus sinnvoller, daß nach make -C ... install das Löschen unerwünschter Files besser ist, als das kopieren einzelner Files. | Wenn dies nicht durchführbar ist, ist [[ES|es]] durchaus sinnvoller, daß nach [[Make|make]] -C ... install das Löschen unerwünschter Files besser ist, als das kopieren einzelner Files. | ||
<br> | <[[BR|br]]> | ||
Zu erwähnen ist auch, daß in dem Schritt, der die Verzeichnisse ''$(flashprefix)/root-gui-filesystem'' erzeugt, das include-verzeichnis, sowie alle statischen Bibliotheken gelöscht werden und dynamische Bibliotheken von unbenutzten Symbolen gestrippt werden. | Zu erwähnen ist auch, daß in dem Schritt, der die Verzeichnisse ''$(flashprefix)/root-[[GUI|gui]]-[[Filesystem|filesystem]]'' erzeugt, das include-verzeichnis, sowie alle statischen Bibliotheken gelöscht werden und dynamische Bibliotheken von unbenutzten Symbolen gestrippt werden. | ||
| Zeile 686: | Zeile 686: | ||
== Antworten auf einige Fragen == | == Antworten auf einige Fragen == | ||
=== Falls das Build nicht gelingt === | === Falls das Build nicht gelingt === | ||
Es gibt kein Standardverfahren was zu tun wäre, wenn das Build misslingt. Es wird versucht, hier einige Richtlinien zu geben und diese zu lesen bevor man im Forum postet. | [[ES|Es]] gibt kein Standardverfahren was zu tun wäre, wenn das Build misslingt. [[ES|Es]] wird versucht, hier einige Richtlinien zu geben und diese zu lesen bevor man im Forum postet. | ||
<br><br> | <[[BR|br]]><[[BR|br]]> | ||
Zuerst, überprüft man den Output der ersten zwei Schritte, '''autogen.sh''' und '''configure''' auf Fehler und Warnungen. Jede Warnung oder Fehler, außer den fünf Warnungen, die oben genannt wurden, zeigen ein Problem an, dass ein Build wahrscheinlich unmöglich macht. | Zuerst, überprüft man den Output der ersten zwei Schritte, '''autogen.sh''' und '''configure''' auf Fehler und Warnungen. Jede Warnung oder Fehler, außer den fünf Warnungen, die oben genannt wurden, zeigen ein Problem an, dass ein Build wahrscheinlich unmöglich macht. | ||
<br><br> | <[[BR|br]]><[[BR|br]]> | ||
Wenn ein Build abbricht, kann es die Umgebung in einem [[Wikipedia:Inkonsistent|inkonsistenten]] Zustand versetzen. Dies gilt insbesondere für die Verzeichnisse in '''$(flashprefix)'''. Wenn der Bau solch eines Make-Targets abbricht, besteht das Verzeichnis, ist entsprechend seiner Änderungszeit aktuell, und ein folgender make Befehl behandelt ihn wie fertig und okay. | Wenn ein Build abbricht, kann [[ES|es]] die Umgebung in einem [[Wikipedia:Inkonsistent|inkonsistenten]] Zustand versetzen. Dies gilt insbesondere für die Verzeichnisse in '''$(flashprefix)'''. Wenn der Bau solch eines [[Make|Make]]-Targets abbricht, besteht das Verzeichnis, ist entsprechend seiner Änderungszeit aktuell, und ein folgender [[Make|make]] Befehl behandelt ihn wie fertig und okay. | ||
<br><br> | <[[BR|br]]><[[BR|br]]> | ||
Selbstverständlich wird ein fehlerhaftes Build das Ergebniss sein. Wenn ein Build eines Unterverzeichnisses von '''$(flashprefix)''' in die | Selbstverständlich wird ein fehlerhaftes Build das Ergebniss sein. Wenn ein Build eines Unterverzeichnisses von '''$(flashprefix)''' in die [[BR|Br]]üche geht, '''dann lösche man [[ES|es]]''', bevor ein anderer [[Make|Make]] Befehl ausgeführt wird. | ||
<br><br> | <[[BR|br]]><[[BR|br]]> | ||
Bei "es funktionierte gestern"-Problemen, ist vermutlich die Umgebung in solch einem Zustand. Ein mehr-oder-weniger drastischer Reinigungsbefehl (siehe oben) ist hierbei oft schneller als eine Problemsuche. | Bei "[[ES|es]] funktionierte gestern"-Problemen, ist vermutlich die Umgebung in solch einem Zustand. Ein mehr-oder-weniger drastischer Reinigungsbefehl (siehe oben) ist hierbei oft schneller als eine Problemsuche. | ||
<br><br> | <[[BR|br]]><[[BR|br]]> | ||
Wenn man Hilfe benötigt, siehe unten!. | Wenn man [[Hilfe|Hilfe]] benötigt, siehe unten!. | ||
=== Nach dem Flashen: "Kein System" auf dem LCD/Was ist diese "bad magic byte" Zeugs? === | === Nach dem [[Flashen|Flashen]]: "Kein System" auf dem [[LCD|LCD]]/Was ist diese "bad magic byte" Zeugs? === | ||
Diese Frage kommt hoffentlich nicht... Die kurze Antwort ist: Man weiß es nicht. Wir wissen es nicht. Aber, wenn Ihr diesen Artikel so weit gelesen habt, erwartet bitte keine "kurze Antworten", sondern "gute Antworten". O.K. Das Thema ist ausführlich hier besprochen worden. <br> | Diese Frage kommt hoffentlich nicht... Die kurze Antwort ist: Man weiß [[ES|es]] nicht. Wir [[Wissen|wissen]] [[ES|es]] nicht. Aber, wenn Ihr diesen Artikel so weit gelesen habt, erwartet bitte keine "kurze Antworten", sondern "gute Antworten". O.K. Das Thema ist ausführlich hier besprochen worden. <[[BR|br]]> | ||
Kurz gesagt, das Image "ist" in Ordnung, es ist nur dass irgendwelche Firmware in der dBox es zurückweisen wird, weil es einige "schlechte magische Bytes" auf bestimmten Adressen finden wird. | Kurz gesagt, das [[Image|Image]] "ist" in Ordnung, [[ES|es]] ist nur dass irgendwelche [[Firmware|Firmware]] in der dBox [[ES|es]] zurückweisen wird, weil [[ES|es]] einige "schlechte magische Bytes" auf bestimmten Adressen finden wird. | ||
<br><br> | <[[BR|br]]><[[BR|br]]> | ||
Das Programm [[checkImage]] aus dem CVS, zu finden im Verzeichnis '''./hostapps/checkImage''' ermittelt diese "schlechten Bytes", aber ändert nichts daran, um diese zu beheben. Die Erfahrung zeigt, daß Images, die [[checkImage]] für gut findet, wirklich laufen. Cramfs-, oder squashfs Images, | Das Programm [[checkImage]] aus dem [[CVS|CVS]], zu finden im Verzeichnis '''./hostapps/[[CheckImage|checkImage]]''' ermittelt diese "schlechten Bytes", aber ändert nichts daran, um diese zu beheben. Die Erfahrung zeigt, daß [[Images|Images]], die [[checkImage]] für gut findet, wirklich laufen. [[Cramfs|Cramfs]]-, oder [[Squashfs|squashfs]] [[Images|Images]], worü[[BER|ber]] sich [[CheckImage|checkImage]] beschwert, laufen im allgemeinen nicht, in einigen Ausnahmefällen läufen sie aber doch. | ||
<br><br> | <[[BR|br]]><[[BR|br]]> | ||
Auch bei jffs2-Images ist dies manchmal der Fall, dass sich [[checkImage]] beschwert, die Images laufen, aber eben nicht immer. Mit diesen empirischen Beobachtungen ist man nun sich selbst überlassen. | Auch bei [[Jffs2|jffs2]]-[[Images|Images]] ist dies manchmal der Fall, dass sich [[checkImage]] beschwert, die [[Images|Images]] laufen, aber eben nicht immer. Mit diesen empirischen Beobachtungen ist man nun sich selbst überlassen. | ||
<br><br> | <[[BR|br]]><[[BR|br]]> | ||
Newmake weiß, wie dieses Programm aufgerufen werden kann, um die erzeugten Images automatisch zu überprüfen. Die Konfigurationsoption | Newmake weiß, wie dieses Programm aufgerufen werden kann, um die erzeugten [[Images|Images]] automatisch zu überprüfen. Die Konfigurationsoption | ||
--with-checkImage=[none,rename,warn] | --with-[[CheckImage|checkImage]]=[none,rename,warn] | ||
wird hierfür verwendet. Falls '''warn''' gewählt ist, wird für jedes Image, das den Test nicht besteht, eine leere Datei erzeugt, am Namen wird ''"_bad"'' angehängt. Wenn '''rename''' gewählt wird, wird das fragliche Imagefile nur umbenannt indem ''"_bad"'' angehängt wird. | wird hierfür verwendet. Falls '''warn''' gewählt ist, wird für jedes [[Image|Image]], das den Test nicht besteht, eine leere Datei erzeugt, am Namen wird ''"_bad"'' angehängt. Wenn '''rename''' gewählt wird, wird das fragliche Imagefile nur umbenannt indem ''"_bad"'' angehängt wird. | ||
<br><br> | <[[BR|br]]><[[BR|br]]> | ||
Es muss erwähnt werden, daß die "schlechten magischen Bytes" in einem (oder mehreren!) der Partitionsteile sitzt, und werden nicht durch den abschließenden Schritt erzeugt (die *.img1x und/oder *.img2x Files bauen). Es ist auch möglich, checkImage auf die Partitionsfiles anzuwenden *.jffs2, *.cramfs | [[ES|Es]] muss erwähnt werden, daß die "schlechten magischen Bytes" in einem (oder mehreren!) der Partitionsteile sitzt, und werden nicht durch den abschließenden Schritt erzeugt (die *.img1x und/oder *.img2x Files bauen). [[ES|Es]] ist auch möglich, [[CheckImage|checkImage]] auf die Partitionsfiles anzuwenden *.[[Jffs2|jffs2]], *.[[Cramfs|cramfs]] | ||
*.squashfs | *.[[Squashfs|squashfs]] | ||
*.flfs1x | *.flfs1x | ||
*.flfs2x | *.flfs2x | ||
Schließlich hat checkImage eine Debugoption, die nützlich sein kann. | Schließlich hat [[CheckImage|checkImage]] eine Debugoption, die nützlich sein kann. | ||
== Ich habe ein Fehler gefunden! == | == Ich habe ein Fehler gefunden! == | ||
Bugs, Unklarheiten, Verbesserungsvorschläge, etc. der Software sollten vorzugsweise im [http://tuxbox-forum.dreambox-fan.de/forum/viewforum.php?f=7 Cross Development Kit - Forum] des Tuxbox-Boards gepostet werden. | Bugs, Unklarheiten, Verbesserungsvorschläge, etc. der [[Software|Software]] sollten vorzugsweise im [http://tuxbox-forum.dreambox-fan.de/forum/viewforum.php?f=7 Cross Development Kit - Forum] des [[Tuxbox|Tuxbox]]-Boards gepostet werden. | ||
== Ich benötige Hilfe! == | == Ich benötige [[Hilfe|Hilfe]]! == | ||
Supportanfragen können im [http://tuxbox-forum.dreambox-fan.de/forum/viewforum.php?f=7 Cross Development Kit - Forum] des Tuxbox-Boards gepostet werden. Postings in deutsch oder englisch sind willkommen. Bitte nicht vergessen, die benutzten Konfigurationsoptionen zu erwähnen. | Supportanfragen können im [http://tuxbox-forum.dreambox-fan.de/forum/viewforum.php?f=7 Cross Development Kit - Forum] des [[Tuxbox|Tuxbox]]-Boards gepostet werden. Postings in deutsch oder englisch sind willkommen. Bitte nicht vergessen, die benutzten Konfigurationsoptionen zu erwähnen. | ||
=Anhang= | =Anhang= | ||
==Einige nützliche Customization Script Snippets== | ==Einige nützliche [[Customization|Customization]] Script Snippets== | ||
In diesem Anhang werden einige nützliche Customization Scripte gezeigt. Zwei Scripte sind bereits oben gezeigt worden. | In diesem Anhang werden einige nützliche [[Customization|Customization]] Scripte gezeigt. Zwei Scripte sind bereits oben gezeigt worden. | ||
<br><br> | <[[BR|br]]><[[BR|br]]> | ||
'''Warnung''' | '''Warnung''' | ||
Auch falls die Beispiele in einigen Fällen benutzbar sind, werden die Scripte als Beispiele, nicht als Lösungen zu den realen Problemen gezeigt. Aus diesem Grund sind die Beispiele hier als Codefragmente, nicht als downloadbare Dateien, veröffentlicht. Bitte nicht verwenden, es sei denn es ist ungefährlich und Ihr versteht, wie sie funktionieren. Es ist grundlegende Script-Erfahrung erfordelich. | Auch falls die Beispiele in einigen Fällen benutzbar sind, werden die Scripte als Beispiele, nicht als Lösungen zu den realen Problemen gezeigt. Aus diesem Grund sind die Beispiele hier als Codefragmente, nicht als downloadbare Dateien, veröffentlicht. Bitte nicht verwenden, [[ES|es]] sei denn [[ES|es]] ist ungefährlich und Ihr versteht, wie sie funktionieren. [[ES|Es]] ist grundlegende Script-Erfahrung erfordelich. | ||
===Games und Languages nuker=== | ===Games und Languages nuker=== | ||
Dieses Script löscht alle Spiele (definiert als plugins mit type=1 in ihrer Konfigurationsdatei), sowie unerwünschte Sprachfiles (Neutrino angenommen). Das File sollte von '''root-neutrino-$filesystem-local.sh''' aufgerufen werden. | Dieses Script löscht alle [[Spiele|Spiele]] (definiert als [[Plugins|plugins]] mit type=1 in ihrer Konfigurationsdatei), sowie unerwünschte Sprachfiles ([[Neutrino|Neutrino]] angenommen). Das File sollte von '''root-[[Neutrino|neutrino]]-$[[Filesystem|filesystem]]-local.sh''' aufgerufen werden. | ||
#!/bin/sh | #!/bin/sh | ||
# Nukes all game plugins, as well as all locale files not listed in LANGUAGES | # Nukes all game [[Plugins|plugins]], as well as all [[Locale|locale]] files not listed in LANGUAGES | ||
newroot=$1/root-neutrino-jffs2 | newroot=$1/root-[[Neutrino|neutrino]]-[[Jffs2|jffs2]] | ||
LANGUAGES="deutsch english" | LANGUAGES="deutsch english" | ||
for f in $newroot/lib/tuxbox/plugins/*.cfg; do | for f in $newroot/lib/[[Tuxbox|tuxbox]]/[[Plugins|plugins]]/*.cfg; do | ||
grep 'type=1' $f>/dev/null && rm -f $newroot/lib/tuxbox/plugins/`basename $f .cfg`.* | grep 'type=1' $f>/dev/null && rm -f $newroot/lib/[[Tuxbox|tuxbox]]/[[Plugins|plugins]]/`basename $f .cfg`.* | ||
done | done | ||
for f in $newroot/share/tuxbox/neutrino/locale/*; do | for f in $newroot/share/[[Tuxbox|tuxbox]]/[[Neutrino|neutrino]]/[[Locale|locale]]/*; do | ||
(echo $LANGUAGES | grep -v `basename $f .locale` >/dev/null) && rm -f $f | (echo $LANGUAGES | grep -v `basename $f .[[Locale|locale]]` >/dev/null) && rm -f $f | ||
done | done | ||
| Zeile 756: | Zeile 756: | ||
=== /.version anpassen === | === /.version anpassen === | ||
Euere eigene ''/.version''-File herzustellen (anggezeigt von Neutrino durch dBox -> Services -> Image-Version und cdkVcInfo beim Booten) ist sicher ein allgemeiner Wunsch. | Euere eigene ''/.version''-File herzustellen (anggezeigt von [[Neutrino|Neutrino]] durch dBox -> Services -> [[Image|Image]]-Version und cdkVcInfo beim Booten) ist sicher ein allgemeiner Wunsch. | ||
*flash-version-local.sh | *[[Flash|flash]]-version-local.sh | ||
#/bin/sh | #/bin/sh | ||
| Zeile 764: | Zeile 764: | ||
if [ $0 = $CDIR/flash-version-local.sh ] ; then | if [ $0 = $CDIR/flash-version-local.sh ] ; then | ||
outfile=$FLASHDIR/root/.version | outfile=$FLASHDIR/root/.version | ||
type="Image" | type="[[Image|Image]]" | ||
else | else | ||
outfile=$TARGETDIR/.version | outfile=$TARGETDIR/.version | ||
type="Yadd" | type="[[Yadd|Yadd]]" | ||
fi; | fi; | ||
echo Creating $outfile ... | echo Creating $outfile ... | ||
echo "version=`./mkversion -snapshot -version 200`" > $outfile | echo "version=`./mkversion -[[Snapshot|snapshot]] -version 200`" > $outfile | ||
echo "creator=$USER" >> $outfile | echo "creator=$USER" >> $outfile | ||
echo "imagename=$USER-$type" >> $outfile | echo "imagename=$USER-$type" >> $outfile | ||
echo "homepage=http://www.your-website.de" >> $outfile | echo "homepage=[[HTTP|http]]://www.your-website.de" >> $outfile | ||
| Zeile 790: | Zeile 790: | ||
while expr $# > 0 ; do | while expr $# > 0 ; do | ||
case "$1" in | case "$1" in | ||
-release) | -[[Release|release]]) | ||
releasetype=0 | releasetype=0 | ||
;; | ;; | ||
-snapshot) | -[[Snapshot|snapshot]]) | ||
releasetype=1 | releasetype=1 | ||
;; | ;; | ||
| Zeile 810: | Zeile 810: | ||
=== Archivierung der Images === | === Archivierung der [[Images|Images]] === | ||
Es ist eigentlich die Aufgabe des Buildprozesses, flashbare Images zu erzeugen, und nicht sie zu archivieren. Jedoch kann die Customization leicht dazu "missbraucht" werden, um irgendeine Art der Archivierung zu ermöglichen, wie das folgende Beispiel zeigt: | [[ES|Es]] ist eigentlich die Aufgabe des Buildprozesses, flashbare [[Images|Images]] zu erzeugen, und nicht sie zu archivieren. Jedoch kann die [[Customization|Customization]] leicht dazu "missbraucht" werden, um irgendeine Art der Archivierung zu ermöglichen, wie das folgende Beispiel zeigt: | ||
#!/bin/sh | #!/bin/sh | ||
| Zeile 824: | Zeile 824: | ||
Das Script sollte einen oder mehr der Namen | Das Script sollte einen oder mehr der Namen | ||
[neutrino, enigma]-[cramfs, squashfs,jffs2].[img1x, img2x] | [neutrino, enigma]-[cramfs, squashfs,jffs2].[img1x, img2x] | ||
haben. Es benennt die Files entsprechend dem Tagesdatum um. | haben. [[ES|Es]] benennt die Files entsprechend dem Tagesdatum um. | ||
| Zeile 835: | Zeile 835: | ||
*[http://www.gnu.org/prep/standards/ GNU Coding standards] | *[http://www.gnu.org/prep/standards/ GNU Coding standards] | ||
*[http://cvsbook.red-bean.com/ Open Source Development with CVS, 3rd Edition] | *[http://cvsbook.red-bean.com/ Open Source Development with CVS, 3rd Edition] | ||
*Barf's Homepage: [http://bengt-martensson.de/dbox2/ Barfs [[Newmake]]-Dokumentation] | *Barf's Homepage: [http://bengt-martensson.de/dbox2/ Barfs ][[Newmake]]-Dokumentation] | ||
*[[WikiBooksde:Linux-Kompendium: Shellprogrammierung|Linux-Kompendium: Shellprogrammierung bei Wikibooks]] | *[[WikiBooksde:Linux-Kompendium: Shellprogrammierung|Linux-Kompendium: Shellprogrammierung bei Wikibooks]] | ||
Version vom 12. Juni 2008, 09:34 Uhr
Allgemeines
Newmake ist eine Überarbeitung des alten "make" Prozesses, inzwischen auch als Oldmake bezeichnet, und wurde durch Barf ins Leben gerufen. Neben einer deutlich strukturierteren Basis, bietet es unter anderem auch den Vorteil, dass es auch ohne ohne großes Verständnis für den Buildprozess gelingen kann, Flashimages und YADDs unter Linux zu erstellen. Basierend auf Newmake gibt es inzwischen auch eine auf Scripts basierende Quasi-Frontendlösung, mit der sich Flashimages oder YADDs benutzerdefiniert erstellen lassen, das sogenannte yBuild.<br> Dieser Artikel basiert zum größtem Teil auf die deutsche Version von Barfs Newmake-Dokumentation, die er uns freundlicheweise zur Verfügung gestellt hat. Eine detaillierte Beschreibung (auch der make targets) unter anderem auch in englischer Sprache befindet sich auf Barf's Homepage.<br>
Dieser Artikel behandelt Newmake aus Sicht des Benutzers (nicht Entwickler). Es behandelt die Image- u. YADD-Herstellung sowie einfache Beipiele für Benutzeranpassungen ("Customization"). <br>
Zur Geschichte
Vor einigen Jahren war die Imageherstellung für die Tuxbox so etwas wie "Schwarze Kunst". Die Makefile-Unterstützung war, insbesondere für andere Images als cramfs-Images, ziehmlich lückenhaft. Die CVS Werkzeuge waren schlecht, oder unvollständig. Noch schlimmer, einige Teile wurden absichtlich geheim gehalten. Vorallem das Werkzeug, jetzt als mkflfs bekannt, welches inzwischen aber im CVS-Verzeichnis .../hostapps/mkflfs zu finden ist, wurde zurückgehalten.
Laut eines Forumsbeitrags aus dieser Zeit, waren die meisten Entwickler nicht in der Lage, eigene Images herzustellen. Die "Gilde der Imagehersteller" wurde geboren. Aus dieser Zeit dürften die "AlexW-Images" ein Begriff sein. Hauptsächlich bestanden diese aus reinen CVS-Sources mit einigen mehr-oder-weniger geheim gehaltenen "Fixes", (vermutlich) notwendig für das Herstellen eines funktionierenden Images aus dem CVS-Quellcode. <br> <br> Im August 2003, wurde es für das GNU DBox2 Software-Projekt in zunehmendem Maße peinlich, mkflfs geheim zu halten und der Quellcode für mkflfs wurde ins CVS eingecheckt. Auch die Funktionalität der Makefiles wurde stufenweise verbessert. Noch war viel zu wünschen übrig: Funktionalität, Pflegbarkeit, gesundes Software-Design... <br> Ein Image aus reinen CVS-Dateien zu bauen, war nicht wirklich möglich. <br> <br> 2004 wurde das YADI ("Yet Another DBox Image") Projekt geboren. <br> Sein Ziel war es, das "Imagebauen" zu automatisieren und zu vereinfachen. Zu diesem Zweck wurden eine Anzahl von Scripten und Patches gesammelt und/oder geschrieben. Zusätzlich wurden flashfertige Images zur Verfügung gestellt. <br> <br> YADI war ein grosser Erfolg. Das Ziel wurde erreicht. Images wurden zur Verfügung gestellt, die (fast) vollständig auf freier Software basierten, sowohl inhaltlich als auch bezüglich der benötigten Werkzeuge, in einer Weise, die für den Benutzer durchaus nachvollziehbar war. <br> Mit dem YADI-Skript war das automatische Imagebuilden zwar möglich, jedoch statt grundlegende Schwächen im CDK-Imagebau-Prozeß zu beseitigen, stellte man Skripte zum Imagebauen zur Verfügung. Es wurde kein übliches Buildsystem zur Verfügung gestellt, wie dies beispielsweise von Make, oder ein neuerer Nachfolger wie Ant,Cmake oder Maven könnten.<br> Newmake, verfügbar als alternativer Branch im CVS, versucht diese Schwächen zu beseitigen.<br> <br> Ein spezieller Dank an jedem, der Bugreports und Feedback geliefert hat. Insbesonderes gilt dies für dietmarw, der Newmake benutzt, um die dietmarW-Images zu erzeugen.
Ziel
Das Ziel des vorliegenden Artikels ist es, dem Leser grundlegendes Know-How zu vermitteln. Es ist nicht das Ziel, eine idiotensichere Schritt-für-Schritt Anweisung bereitzustellen, wie das bei sogenannten HOWTO's der Fall wäre.<br> Kenntnisse im Umgang mit Shellskripten wird für viele Teile, insbesondere für das Customization-Kapitel, aber nicht für Image/YADD-Herstellung in seiner einfachsten Art und Weise vorausgesetzt. <br> <br> Der vorliegende Artikel versucht nicht die innere Funktion der Makefiles und des Makeprozesses zu beschreiben. Hierfür wird der Leser auf diverse Quellen, und zu relevanten Threads im CDK-Forum des Tuxbox-Forums hingewiesen. Alle Optionen für configure werden auch nicht beschrieben, nur die Allgemeinsten und Wichtigsten.
Wie schwierig ist es?
Die Antwort könnte lauten: Es ist so schwerig wie man diesen Artikel zu lesen versteht. Für den Leser, der ohne Probleme den Inhalt dieses Artikels versteht, sollte es kein Probleme sein. Leser, für die das Meiste nur Kauderwelsch ist, sollten vielleicht besser bei fertigen Images bleiben.
Images und YADD's bauen
Targets
Es gibt neben zahlreichen untergeordneten Zielen (Targets), zwei hauptrangige Targets. Diese wären entweder
oder
Ein YADD besteht aus einigen Dateien, die die DBox anstatt aus dem Flash über den TFTP-Service lädt, sowie ein Filesystem, das über einen NFS-Server der dBox zur Verfügung gestellt wird. <br> Diese Betriebsart hat insbesondere während der Softwareentwicklung oder beim Erlernen des Systems viele Vorteile. <br> Der Name "YADD" bedeutet übrigens "Yet Another DBox Distribution" ("noch eine dBox Verteilung").
Erste Schritte und Überlegungen
Eine Empfehlung für den angehenden "Image/YADD-Lehrling" wäre:<br> Baue zuerst ein YADD mit deiner Lieblings-GUI, und lerne damit umzugehen.<br> Nächster Schritt wäre dann, ein jffs2-Image mit der Lieblings-GUI zu erstellen. Erst danach sollte man sich überlegen weitere Sachen wie Patches, andere Tools, erweiterte configure-Optionen oder Customization-Scripte einzupflegen. Dann wird sich auch sehr schnell herausstellen, ob das was man einbauen möchte in das eigene Image rein platztechnisch reinpasst. Dann steht man schnell vor der Entscheidung sich für ein angemesseneres Kompressionsformat zu entscheiden. Hier hat sich squashfs als das derzeit bewährteste System etabliert.
Meistens möchte man die folgenden Schritte kombinieren und/oder automatisieren. <br> In diesem Artikel bezeichnet "GUI" entweder
<br> Das "Filesystem" im Kontext eines kompletten Images bezeichnet das Dateisystem, in dem das root-Verzeichnis liegt. Diese kann ein
- cramfs (ein komprimiertes, Read-only filesystem für embedded Systeme) sein,
- squashfs (ein weiterd komprimiertes read-only-Dateisystem, was leistungsfähiger als cramfs betrachtet wird)
oder
- jffs2 (ein "journalled" Read-Write-Filesystem).
Ein "cramfs Komplett-Image" besteht aus einem Root-Dateisystem mit dem cramfs Dateisystem und einem kleineren jffs2-Filesystem, das nach /var gemounted wird. <br> Analog gilt dies auch für "squashfs Komplett-Images", während ein "jffs2 Komplett-Image" kein separates /var-Dateisystem enthält, weil jffs2 an sich beschreibbar (var) ist. <br> Zusätzlich enthalten die Komplett-Images eine weitere Partition, die den u-boot-Bootloader enthalten. Diese Partition ist zwischen dBoxen mit einen und zwei Flashchips unterschiedlich. Dieses wird durch "1x" und "2x" angezeigt. Ein komplettes Image würde demnach so benannt werden:
[neutrino, enigma]-[cramfs, squashfs, jffs2].img[1, 2]x,
z.B. als fertiges Image:
neutrino-jffs2.img2x.
Buildsystem Voraussetzungen
Die Voraussetzungen auf dem Buildhost können in etwa so zusammengefasst werden: <br> Ein modernes Unix/Linux System mit ca. 2 GB freiem Speicherplatz. Epfehlenswert ist es aber mehr Speicherplatz einzuplanen, da beispielsweise bei Verwendung von ccache einiges an Daten zwischengelagert wird und je öfter man kompiliert, es dann doch eng werden könnte.
Das Tuxbox Projekt hat keine favorisierte Buildumgebung. Fragen wie "geht es mit Redhat x.y?" lassen sich nicht genau beantworten. Der Grund hierfür ist, dass niemand sich wirklich dafür interessiert, die Eigenschaften der bestimmten Distributionen zu erkunden. Gewisse Anforderungen werden dagegen für Versionen der Werkzeuge, wie autoconf, automake, make usw. formuliert. Die meisten davon sind in den gängigsten Distributionen bereits enthalten bzw. können nachinstalliert werden. Die momentan erfordelichen Toolversionen sind in folgendender Tabelle zusammengefasst: <br>
| Tool | Version | |
| cvs | ||
| autoconf | 2.57a | |
| automake | 1.8 | |
| libtool | 1.4.2 | |
| gettext | 0.12.1 | |
| make | 3.80 | |
| makeinfo | Texinfo | |
| tar | ||
| bunzip2 | bzip2 | |
| gunzip | gzip | |
| patch | ||
| infocmp | ncurses | |
| gcc | = 2.95 or >= 3.0 | |
| g++ | = 2.95 or >= 3.0 | |
| flex | ||
| bison | ||
| pkg-config | ||
| wget |
<br> Der Buildprozess überprüft zu Beginn automatisch einige dieser Anforderungen. Wenn eines dieser Tools fehlt, oder wenn die Version zu alt zu sein scheint, ist es in der Regel einfacher, die erforderliche Version nachträglich zu installieren, entweder als kompiliertes Paket, z.B. im rpm-Format vom jeweiligem Distributor, oder sich direkt die Quellen zu besorgen, zu kompilieren und zu installieren, als zu versuchen oder herauszufinden, ob die oben genannten Anforderungen wirklich notwendig sind. <br> Hinweis:<br> In anderen Anleitungen zum Buildvorgang wird gefordert, dass Tools wie fakeroot, mksquashfs, mkcramfs, mkjffs2fs (oder mkfs.jffs2), vielleicht auch mklibs oder ccache, auf Ihrem System installiert sein müssen. In dieser Umgebung ist dies nicht erfordelich, da einige entweder überhaupt nicht benötigt werden bzw. die Installation im Makeprozess selbst vorgenommen wird! <br> Builden auf einem Unix-non-Linux System sollte vermutlich auch möglich sein, so weit die erforderlichen GNU Werkzeuge vorhanden sind. Mit einem anderen make als GNU wird es fast sicher nicht funktionieren, da die GNU-Erweiterungen uneingeschränkt verwendet werden. <br> Es wird daher davon abgeraten eine Umbegebung z.B. mit Cygwin aufzubauen, da es höchstwahrscheinlich nicht funktionieren wird. In dieser Richtung wurde zwar Einiges für den Makeprozess eingebaut, jedoch dürfte der gegenwärtige Entwicklungsstand nicht den gegenwärtigen Anforderungen entsprechen, um aktuell auch damit arbeiten zu können. <br> Empfehlenswert ist allerdings eine Buildumgebung mittels VMWare aufzubauen. Hierfür gibt es auch eine "konfektionierte" Lösung von yiogol, der hierfür ein passendes VMWare-Image erstellt hat, dass im Prinzip alle notwendigen Zutaten enthält.
Auschecken
Die Tuxbox Quellen werden durch den Tuxbox CVS-Server bereitgestellt.<br> Regelmäßige Quellreleases sind niemals gemacht worden, und sind auch nicht für die Zukünft geplant. Für unsere Zwecke werden die Quellen anonym "ausgecheckt", was bedeutet, dass diese auf die eigene Festplatte kopiert werden, indem man zuerst auf einer (lokalen) Festplatte mit "ordentlich" freiem Platz ein leeres Verzeichnis erstellt, z.B. /tuxbox-cvs und in diesen Ordner wechselt, und diesen Befehl ausführt.
cvs -d anoncvs@cvs.tuxbox.org:/cvs/tuxbox -z3 co -f -r newmake -P .
Dieser Befehl checkt die Newmake Files aus. In Fällen, in denen keine Newmake Version vorhanden ist, wird die HEAD-Version ausgecheckt. <br> Hinweis: Im HEAD gibt es zwei Files:
- cdk/root/etc/init.d/rcS
und
- root/etc/init.d/rcS.insmod
Im Newmake werden diese nicht benötigt da sie mittels
root/etc/init.d/rcS.m4
erzeugt werden. Um auf der sicheren Seite zu sein, ist es ratsam, diese beiden zu löschen. <br> Nachdem die Daten ausgecheckt wurden, könnte kann man jetzt einige Patches auf die Quellen anwenden.<br> Wenn man aber zum ersten Mal kompiliert, ist es ratsam, vorerst keine Patches anzuwenden. Wenn Probleme auftreten, ist es viel einfacher (technisch sowohl als auch für jeden selbst) jemand zu helfen, der die "unveränderten CVS Quellen" verwendet.
Konfiguration
Jetzt müssen einige Zwischenschritte erledigt werden, damit der Buildprozess auch erkennt, was und vorallem wie er es machen soll. <br> Man wechselt nun in das CDK-Unterverzeichnis
cd cdk
und gibt diesen Befehl ein (ohne Argumente).
./autogen.sh
Dieser erzeugt unter anderem ein Shellskript namens configure. <br> Wird autogen.sh ausgeführt, wird dabei eine Anzahl von Optionen übergeben, um das System für das Builden eines Images, YADD oder aller anderen gewünschten Ziele entsprechend den Benutzerwünschen vorzubereiten.
Optionen
Für eine komplette Liste von Optionen, benutze den Befehl
./configure --help
Hier einige Ausgaben:
- Program names:
--program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names
- System types:
--build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST]
Optional Features:
--enable-uclibc enable rules for creating uclibc linked targets --enable-kernel26 set up the CDK to use the 2.6 kernel (experimental) --enable-maintainer-mode enable make rules and dependencies not useful
(and sometimes confusing) to the casual installer
--disable-flashrules disable rules for creating flash targets - build cdk instead --enable-german-keymaps include loadkey and German keymaps in yadds and images --enable-ide include ide/mmc and ext2/ext3 drivers in yadds and images --disable-ext3 exclude ext2/ext3 drivers in yadds and images --enable-xfs include xfs drivers in yadds and images --enable-mmc include mmc drivers in yadds and images - you need to activate a filesystem --disable-drive-gui disables neutrino gui-setup for ide hdd mmc administration - uses utillinux fdisk instead of busybox --enable-nfsserver enable the dBox NFS server --enable-automount enable automount daemon --disable-gui-mount disable GUI mount functionality --enable-sambaserver enable the dBox samba server --enable-upnp include upnp support - depends on audioplayer --enable-flac include Neutrino flac audio support - depends on audioplayer --disable-audioplayer include Neutrino audioplayer/internetradio --disable-pictureviewer include Neutrino pictureviewer --disable-movieplayer include Neutrino movieplayer --disable-radiotext include Neutrino Radiotext support --disable-fx2plugins disable fx2-plugins (games) for gui's --enable-aformat enable aformat - dbox2-only --enable-cdkVcInfo include cdkVcInfo in yadds and images --enable-clock enable clock --enable-dboxshot enable dboxshot --enable-dropbear enable dropbear --enable-dvbsnoop enable dvbsnoop --disable-dvbsub disable dvbsub --enable-esd enable esound --enable-fbshot enable fbshot --enable-gdbserver enable gdbserver --enable-getrc enable getrc --enable-hddtemp include hddtemp in yadds and images - depends on IDE support --enable-input enable the tool named input --enable-ipkg include ipkg in yadds and images --enable-lcshot enable lcshot - dbox2-only --enable-lirc include lirc in yadds and images - dbox2-only --enable-msgbox enable msgbox --enable-openvpn include OpenVPN in yadds and images and build tun kernel module --disable-rtc disable rtc hardware support - dbox2-only --enable-satfind enable satfind --enable-shellexec enable shellexec --enable-sqlite enable sqlite --enable-strace enable strace --enable-sysinfo enable sysinfo --enable-tuxcal enable tuxcal --disable-tuxcom disable tuxcom --disable-tuxmail disable tuxmail --disable-tuxtxt disable tuxtxt completely --disable-internal-tuxtxt disable internal Tuxtxt cache, use only external Tuxtxt plugin instead -enable-tuxwetter enable tuxwetter --enable-ccache enable ccache supported compiling --enable-freesatepg enable UK FreeSat EPG --enable-movieplayer2 enable experimental neutrino movieplayer2 --enable-dreambox-serial-console enable serial console on dream
Optional Packages:
--with-toolchain=PATH, do not build a toolchain but use the one at PATH --with-boxtype valid values: dbox2,tripledragon,dreambox,ipbox,generic --with-boxmodel valid for dreambox: dm500, dm500plus, dm600pvr, dm56x0, dm7000, dm7020, dm7025) valid for ipbox: ip200, ip250, ip350, ip400 --with-targetruleset=NAME OBSOLETE, use --[enable|disable]-flashrules instead --with-assume-kernelsources-old Do not recompile due to new kernel sources --with-filesystems comma seperated list of filesystems to be used, first disk filesystem will be used as default for /hdd entry in /etc/fstab allowed values: nfs (always enabled in yadd), cifs, smbfs, lufs (ftpfs), xfs (not kernel2.4/uClibc), ext2, ext3, extfs (ext2/3), vfat, reiserfs --with-rootpartitionsize=SIZE size of the root partition --with-flashfstype=FS_TYPE type of flash root filesystem partition for the yadd kernel (squashfs+lzma/squashfs) --with-defaultlocale=LOCALE default locale --with-targetprefix=DIR prefix for target files [PREFIX/cdkroot] --with-hostprefix=DIR prefix for host files [PREFIX/cdk] --with-bootprefix=DIR prefix for boot files [PREFIX/tftpboot] --with-flashprefix=DIR prefix for flash files [PREFIX/cdkflash] (only used for flash building) --with-serversupport=DIR prefix for server file templates [PREFIX/serversupport] --with-ucodesdir=DIR optional directory containing ucodes (dbox2 only) [NONE] --with-logosdir=DIR optional directory containing logos [[CVS/]logos] --with-customizationsdir=DIR optional directory containing customization scripts CVS --with-updatehttpprefix=URL optional URL containing the URL of a directory with update images "disable" completely disables internet update code [NONE] --with-busybox-conf=M4_FILE personalized optional m4 busybox configuration file [config/busybox.config.m4] --with-kernel-conf=FILE optional personalized linux kernel config file [config/dbox2_kernel-KERNEL_VERSION.config.m4] [[#--with-checkImage=[none,rename,warn]|--with-checkImage=[none,rename,warn]]] How/if to invoke checkImage [none] --with-cvsdir=DIR where to find the cvs --with-appsdir=DIR apps dir from cvs [[CVS/]apps/] --with-bootdir=DIR boot dir from cvs [[CVS/]boot/] --with-driverdir=DIR driver dir from cvs [[CVS/]driver] --with-hostappsdir=DIR hostapps dir from cvs [[CVS/]hostapps] --with-gnuserver=ADDRESS the gnu server for gnu-stuff (without ftp://) --with-defaultserver=ADDRESS the server that is taken if no server is given/works (without http://) --with-maxcachesize=SIZE maximal ccachesize for ccache --with-maxcachefiles=COUNT maximal count of cachefiles for ccache --with-webif=NAME dreambox webif [standard,expert] --with-epg=NAME dreambox epg [standard,private] --with-mhw-epg enable capture of mhw epg (default off) --with-flashtool=NAME dreambox flashtool [standard,expert] --with-ext-flashtool=NAME dreambox ext-flashtool [yes,no] --with-enigma-debug=NAME dreambox enigma-debug [yes,no]
Für uns sind vorerst nur wenige Optionen interessant. Die Standardvorgaben reichen vorerst völlig aus.<br> Eine typische Anwendung (Konfiguration), der mit z.B. den Pfadnamen oben kompatibel wäre, könnte so eingestellt werden:
./configure --with-cvsdir="/tuxbox-cvs" --prefix="/dbox2" --enable-maintainer-mode
- --with-cvsdir
sagt wo die Quellen zu finden sind, (darin sollte auch ein Unterverzeichnis .../cdk besitzen). In der Regel ist dies das Verzeichnis in das die Quelldaten gerade ausgecheckt wurden, während
- --prefix
bedeutet, dass eine Anzahl von wichtigen Verzeichnissen als Unterverzeichnisse des besagten Verzeichnisses erstellt werden sollen. Ihre Position kann durch andere Konfigurationsoptionen weiter beeinflußt werden.
- --enable-maintainer-mode
ist, auch für Nichtmaintainers praktisch, da er den hergestellten Makefiles ermöglicht, sich automatisch neu zu erzeugen, sobald die Notwendigkeit entsteht, zum Beispiel nach einem Software-Update.
Es gibt sicher noch andere nützliche Optionen. Einige werden später noch besprochen.
Fehlerausgaben
Überprüfe bitte die Ausgaben von autogen auf Fehler ("Error") und Warnungen.<br> Hierbei können diese Warnungen ignoriert werden:
/usr/local/share/aclocal/pkg.m4:5: warning: underquoted definition of PKG_CHECK_MODULES from autogen.sh
ebenso folgende Warnungen von configure:
... configure: WARNING: using tuxbox mklibs checking for mkcramfs... no configure: WARNING: using tuxbox cramfs checking for mkjffs2... no checking for mkfs.jffs2... no configure: WARNING: using tuxbox mkfs.jffs2 checking for mksquashfs... no configure: WARNING: using tuxbox squashfs ...
Dies sind nur Hinweise darauf, dass hier projekteigene Versionen einiger Tools verwendet werden.
Beachte!
Wenn man diesen Artikel mit ähnlichen Beschreibungen aus vergangenen Zeiten
vergleicht, bemerkt man, dass die Option --with-targetruleset=[standard,flash] nicht mehr
vorhanden ist. Bisher war es notwendig, bei der Konfiguration sich entweder auf Builds von YADDs
oder Images einzuschränken. Bei Newmake ist dieses nicht mehr notwendig.
<br>
<br>
Versuche niemals, als root zu bauen!
Kompilieren
Die high-level make Targets, die für das Builden von Komplett-Images relevant sind, lauten:
flash-[neutrino, enigma, all]</nowiki>
flash-[cramfs, squashfs, jffs2, all]</nowiki>
[1x, 2x, alle]</nowiki>
Für YADD-Builds, sind diese:
yadd-[neutrino, enigma, all]</nowiki>
Beispiele:
make flash-neutrino-jffs2-all
erzeugt flashbare jffs2-only Images mit Neutrino, für 1x-Boxen und für 2x-Boxen (Dateinamen neutrino-jffs2.img1x und neutrino-jffs2.img2x).
der Befehl:
make yadd-enigma
erzeugt ein YADD, das Enigma enthält.
Zeitaufwand
Das Kompilieren kann bei so einem Projekt und je nach Konfiguration und Rechnerleistung schon einige Zeit in Anspruch nehmen.<br> Auf einem Athlon XP 1800 dauert ein Befehl wie make yadd-neutrino mit leeren Verzeichnissen etwa 1 und 1,5 Stunden.
Verwendung von ccache
Um den Vorgang insbesondere bei wiederholten Kompilieren und besonders auf langsameren Rechnern zu beschleunigen, steht die Option
- --enable-ccache
zur Verfügung, welche man mit in die Konfiguration einbinden kann. Erfahrungsgemäß wird so durchschnittlich ca. 1-2 Drittel der Zeit eingespart.
Durch die Option --enable-ccache wird erreicht, sollte das Tool bereits in deiner Distribution installiert sein, dass ccache automatisch erkannt wird und in das Tuxbox-CDK eingebunden wird. Ist es nicht installiert, wird dies auch von configure angezeigt:
... ---------------------------------------- ccache support: no ccache installdir: ccache is not installed please run make ccache or install it and configure again ---------------------------------------- ...
Dann sollte man das Tool nachinstallieren oder mit dem Target
make ccache
in das CDK einbauen und configure wiederholen.
Hinweis <br> Ccache macht sich erst bemerkbar, nachdem der Buildvorgang mindestens einmal durchgelaufen ist!
Die Option --enable-ccache ist normalerweise völlig ausreichend. Es stehen aber noch weitere untergeordnete Sub-Optionen zur Verfügung, die in Ausnahmefällen verwendet werden können:
- --with-ccachedir=DIR
Diese Option kann man verwenden, wenn man ccache beispielsweise nur als Binary abgelegt hat und den Pfad dazu bestimmen möchte. <br> Hinweis <br> Die Option --with-ccachedir bewirkt auch das die mit make ccache installierte Version im CDK und/oder auch die evtl. im System installierte Version ignoriert wird!
- --with-maxcachesize=SIZE maximal
Hier gibt man an, wieviel Speicher ccache verwenden darf in GB z.B: für 2GB
--with-maxcachesize=2
- --with-maxcachefiles=COUNT
Hier kann man angeben, wieviele Dateien ccache cachen darf.
--with-maxcachefiles=20000
Hier würden es logischeweise 20000 sein.
Die Wirksamkeit von ccache lässt sich mit dem Befehl
ccache -s
prüfen. Als Ergebnis werden einige Statistiken über das Cache-Verhalten von ccache ausgegeben:
cache directory /home/<USER>/.ccache cache hit 4 cache miss 191 called for link 17 multiple source files 4 compile failed 17 preprocessor error 2 not a C/C++ file 5 autoconf compile/link 178 no input file 15 files in cache 382 cache size 7.1 Mbytes max cache size 976.6 Mbytes
Tipp
<br>
Um die benötigte Zeit genau zu ermitteln, kann man den Befehl time einbauen.
time make yadd-neutrino
Am Ende des Bauvorganges werden damit die entsprechenden Zeitinformationen ausgegeben.
Beispiele
Hier einige Beispiele mit denen man Images, Yadds oder einzelne Targets bauen kann. Diese Beispiele sollten so wie sie hier vorgegeben sind ohne Veränderung auf jedem Linux-System mit den bisher beschriebenen Voraussetzungen laufen. Da die Systeme trotzdem Unterschiede aufweisen können, kann man das aber nicht garantieren.
neutrino-jffs2-Image
#! /bin/bash # beispiel.sh # Diese Script baut neutrino-jffs2 Images, jeweils 1x und 2x #---------------------------------------------- USERDIR=/home/$(whoami) #---------------------------------------------- LOGODIR=$USERDIR/Logos CP=$USERDIR/tuxbox-cvs DB=$USERDIR/dbox2 ARCHIVEDIR=$USERDIR/Archive export CVS_RSH=ssh #----------------------------------------------- cd "$CP" cvs -d anoncvs@cvs.tuxbox.org:/cvs/tuxbox -z3 co -f -r newmake -P . cd cdk /bin/ln -sf $ARCHIVEDIR/ Archive ./autogen.sh ./configure --prefix="$DB" --with-cvsdir="$CP" --enable-flashrules --enable-ccache --with-checkImage=rename --with-logosdir="$LOGODIR" make flash-neutrino-jffs2-all
Neutrino YADD
#! /bin/bash # beispiel.sh # Diese Script baut ein Neutrino Yadd #---------------------------------------------- USERDIR=/home/$(whoami) #---------------------------------------------- LOGODIR=/Logos CP=$USERDIR/tuxbox-cvs DB=$USERDIR/dbox2 ARCHIVEDIR=$USERDIR/Archive export CVS_RSH=ssh #----------------------------------------------- cd "$CP" cvs -d anoncvs@cvs.tuxbox.org:/cvs/tuxbox -z3 co -f -r newmake -P . cd cdk /bin/ln -sf $ARCHIVEDIR/ Archive ./autogen.sh ./configure --prefix="$DB" --with-cvsdir="$CP" --with-logosdir="$LOGODIR" --enable-ccache make yadd-neutrino
Was kommt dann...?
Booten von YADD
Wenn ein YADD frisch erzeugt wurde, kann damit auch die Box booten. Näheres dazu auch im Artikel CDK booten.<br> Newmake hält auch ein Make-Target für den serversupport bereit.
make serversupport
Dieses erzeugt einige Konfigurationsdateien für den Server der das YADD-Build nahtlos an das Server-Setup anknüpft.
Flashen des Images
Wenn ein Image gebaut wurde, ist der logische nächste Schritt das Einspielen des Images in den Flash der Box. Hierfür ist entweder, das interaktive Flashen innerhalb der GUI (Expertenfunktionen) zu benutzen, oder der dboxflasher zu verwenden. Der dboxflasher wird durch das Make-Target
make serversupport
erzeugt. Andere Möglichkeiten des Flashens werden hier beschrieben.
Inkrementelle Builds
Im allgemeinen ist man nicht an einem einmaligen Build der Software interessiert. Verbesserungen an den Quellen werden in das CVS täglich eingecheckt. Oft möchte man die Software durch eigene Programmierung verbessern oder Patches anwenden. Es ist dabei wünschenswert, dass genau nur die Teile neu erzeugt wird, die neu erzeugt werden sollen, nicht mehr und nicht weniger. Newmake geht einen direkten Weg in diese Richtung. <br> Um ein Target neu zu bauen, benutze den Befehl
make [target]
und make wird es, falls notwendig, neu erzeugen.
Es kann auch passieren, dass make zusätzlich einen vollständig anderen Bestandteil neu erzeugt! Dies ist dann der Fall, wenn das jeweilige Target von anderen Teilen abhängt, die sich geändert haben. <br> In einige Situationen kann es auch wünschenswert sein, ein erneutes Bauen einer Komponente zu erzwingen. Einige Komponenten werden in einem Distributionsfile zum Verzeichnis cdk/Archive heruntergeladen, und wenn das Build stattfindet, ausgepackt, evtl. Patches angewendet, konfiguriert, kompiliert, installiert und die Quellen dann wieder gelöscht.<br> Alles findet automatisch statt. Die Installation eines bestimmten Pakets wird durch das Anlegen einer Markerdatei im Verzeichnis cdk/.deps vermerkt. <br> Falls gewünscht, kann solch eine Markiererdatei entfernt werden, um das Neuerzeugen der entsprechenden Komponetne zu erzwingen. Es gibt hierfür auch entsprechende Targets, die "Cleaning Targets".
Cleaning targets
Es gibt mehrere unterschiedliche Aufräum-Targets: <br>
make distclean
Das drastischste Reinigungs-Target, (fast) alles löschend, was nicht vom CVS ausgecheckt wurde. Dieses ist eher selten notwendig. <br>
make mostlyclean
Ein intelligenteres Target ist mostlyclean. Es säubert die Verzeichnisse, die Tuxboxquellen enthalten, lässt aber die Kompilationsumgebung und alle Auspacken-kompilieren-installieren-löschen-Komponente unberührt. <br> Auch das cdkroot Verzeichnis, (d.h. die Yadd-Installation), sowie die TFTP-Files (Kernel und u-boot) werden nicht angefasst. <br>
make depsclean
Löscht alle Markerdateien im /cdk/.deps Verzeichnis und zwingt so zum Neukompliieren aller Auspacken-kompilieren-installieren-löschen-Komponenten. <br> Dies ist selten sinnvoll: Diese hängen von ihren Quellen und vielleicht von einem Patchfile ab, und der Makefile kennt diese Abhängigkeiten. <br>
make clean
Kombiniert mostlyclean, depsclean, und flash-clean. Versucht auch soviel wie möglich im cdkroot-Verzeichnis zu löschen, das nicht während des Bootstrapdurchlaufes installiert war. So wird versucht, die Umgebung in einem Zustand zu bringen, wo die Buildumgebung gerade kompiliert worden ist, z.B. mit make bootstrap. <br>
make flash-semiclean
Dieses Target löscht die meisten Verzeichnisse in $(flashprefix), mit Ausnahme der Boot-Partitionen und der Kernelbauverzeichnisse.<br> Dieses ist oft sinnvoll, da diese Bestandteile verhältnismässig sich selten ändern. <br>
make flash-mostlyclean
Zusätzlich zum flash-semiclean löscht dieses Target auch Bootfiles und die Kernbauverzeichnisse. Vollimages werden unberührt gelassen. <br>
make flash-clean
Dieses Target löscht Alles in $(flashprefix). <br> Einige Quellverzeichnisse können mit einem Befehl wie
make -C /tuxbox-cvs/apps/tuxbox/neutrino clean
gesäubert werden.
Aktualisierung des CVS-Quellcodes
Um die Quellen mit neueren Checkins zu aktualisieren, verwende diesen Befehl für das toplevel CVS Verzeichnis (oder von einem anderen Verzeichnis, wenn Ihr wisst, was ihr tut;-). Mögliche Fehler werden in das logfile cvs.log geschrieben.
cvs up -f -r newmake -dP > cvs.log 2>&1
Tipp
<br>
Um mit dem CVS arbeiten zu können nimmt man für gewöhnlich die Konsole für Eingaben. Es gibt aber auch verschiedene Frontendwerkzeuge wie z.B. CrossVC oder Cervisia um nur einige zu nennen, die einen recht komfortablen Umgang mit den CVS-Daten ermöglichen.<br>
<br>
Auch einige IDE's wie z.B. Anjuta <br>
<br> bieten solche CVS-Schnittstellen an.
Customization
Bisher lief immer alles darauf hinaus Images oder Yadds zu bauen, die aus unveränderten CVS-Quellen gebaut wurden.<br> Images und die Yadds können aber auch angepasst ("customized") werden, ohne die Makefiles zu ändern. <br> Hier gibt es verschiedene Möglichkeiten.
Konfigurationsoptionen
hier einige nützliche Optionen:<br> Hiermit kann ein Verzeichniss angegeben werden, welches die Ucodes enthält, die im Image enthalten sein sollen.
--with-ucodesdir=[DIR]
Hinweis:<br>
Ein Image, dass ucodes enthält, darf nicht verbreitet werden!
--with-logosdir=[DIR]
kann ein Verzeichniss angegeben werden, das boot-logos (logo-lcd und logo-fb) enthält, die im Image enthalten sein sollen. <br> <br> Diese Option
--with-defaultlocale=[LOCALE]
sorgt dafür, dass die gewünschte Sprache schon beim bauen eingestellt wird.
Ändern der Partitionierung
Die Rootpartitionsgröße für cramfs und squashfs Images kann mit der Configure-Option
--with-rootpartitionsize=[SIZE]
angegeben werden. <br> Die Größe der var-Partition wird automatisch berechnet, wobei man den restlichen Flashspeicher nutzt, der nicht durch die anderen Partitionen benutzt wird. Die Standardgröße ist 0x660000. Diese Zahl sollte eine Multiple der Erasesize, momentan 0x20000 sein. Dies wird allerdings ignoriert falls es wie bei der jffs2-Imageerstellung unsinnig wäre.
Variablen
Pfade
Es sind noch weitere Benutzeranpassungen möglich. Dafür ist es aber notwendig, etwas Wissen über die innere Funktionsweise der Makefiles zu haben.<br> In der Folge bezeichnet
$(flashprefix)
den Wert der Makefile Variablen flashprefix (mit Konfiguration wie oben /dbox2/cdkflash)
$(targetprefix)
bezeichnet den Wert der Makefile Variablen targetprefix (mit Konfiguration wie oben /dbox2/cdkroot), und
$(buildprefix)
bezeichnet den Wert der Makefile Variablen buildprefix (mit der Konfiguration oben /tuxbox-cvs/cdk). <br> <br> Um z.B. ein neutrino-cramfs.img2x zu erzeugen, werden die folgenden Verzeichnisse erstellt:<br>
- $(flashprefix)/root (enthält Filesystem- und GUI-unabhängige Bestandteile)
- $(flashprefix)/root-cramfs (enthält den Kernel, für Root-Filesystem auf cramfs konfiguriert, zusammen mit seinen Treibern) und
- $(flashprefix)/root-neutrino (enthält die Neutrinoinstallation).
<br> Aus diesen drei Verzeichnissen, werden das Rootfilesystemverzeichniss
var-filesystemverzeichnis
- $(flashprefix)/var-neutrino gebaut.
<br> Hiermit ist es möglich, einen Befehl wie
make $(flashprefix)/root-neutrino-jffs2
bzw. wenn man sich im Verzeichnis ./tuxbox-cvs/cdk befindet, den Befehl
make root-neutrino-jffs2
einzugeben, wobei man bei erster VAriante natürlich $(flashprefix) selbst durch den realen Pfad ersetzen muss, da $(flashprefix) nur eine make-Variable ist, welche in unserem Beispiel den Pfad zu ./dbox2/cdkflash darstellt.<br> Man kann so manuell gewünschten Änderungen an $(flashprefix)/root-neutrino-jffs2 vornehmen, und dann, mit dem Befehl
make flash-neutrino-jffs2-2x
den Imagebau abschließen, um ein Image zu erstellen, das diese manuellen Änderungen enthält. <br> Dieses kann zwar für den einmaligen Imagebau sinnvoll sein, jedoch in vielen Fällen dürfte eine automatisierte und systematischere Methode erforderlich sein.
Customization-Scripte
Sofern vorhanden und ausführbar werden innerhalb der wichtigsten Targets sogenannte Customization-Scripte aufgerufen. Hiermit lassen sich beispielsweise Änderungen im Dateisystem der fertigen Yadds oder Images erledigen. Im einfachsten Falle kann man sich damit z.B. eigene Tools, Scripte oder Plugins an die gewünschte Position im Dateisystem kopieren, um nur eine Anwendungsmöglichkeit zu nennen. Das bzw. die Scripte müssen im customizationsdir liegen. Dies ist bei Bedarf mit der Option
--with-customizationsdir=[DIR]
einstellbar. Standardverzeichnis ist ./cdk. <br> Auf diese Scripte werden zwei Argumente zur Laufzeit übergeben: <br> Für Imagetargets sind dies
- $(flashprefix)
und
- $(buildprefix)
für Yaddtargets sind diese
- $(targetprefix)
und
- $(buildprefix)
<br> <br> Die Bezeichnung "Script" ist etwas irreführend, da sie eigentlich wie normale Programme mit zwei Argumenten ausgeführt werden. Anstelle eines Shell-Scripts könnte dies z.B. ein kompiliertes C Programme, oder ein Perl-Script sein.<br> Der Name eines Customization Scriptes besteht in der Regel aus dem Namen eines Targetverzeichnisses bzw. in einigen Fällen einem Target und dem angefügtem *-local.sh.<br>
Für Flash-Targets
Der Name der Customization Scripte für Images besteht aus den wie oben benannten Verzeichnissen in flashprefix,
- root
<br> dem Namen der jeweilige Benutzeroberfläche, als "GUI" in Klammern bezeichnet, also
<br> "FS" zeigt an welches Filesystem gemeint ist.
<br> so wäre die Bezeichnung der jeweiligen Scripte so aufgebaut:
- root-local.sh
- root-[GUI]-local.sh
- root-[GUI]-[FS]-local.sh
- root-[FS]-local.sh
- var-[GUI]-local.sh
<br> Beispiele:
root-local.sh root-neutrino-local.sh root-neutrino-squashfs-local.sh root-squashfs-local.sh var-neutrino-local.sh
Für Yadd-Targets
Für Yadds ist das Prinzip ähnlich, nur dass es hier quasi nur einen Ordner gibt. Dafür stellvertretend steht dann
Das "GUI" in Klammern bezeichnet auch hier die jeweilig betroffene Benutzeroberflche, also
<br> so wäre die Bezeichnung der jeweiligen Scripte so aufgebaut.
- yadd-[GUI]-local.sh
Beispiel:
yadd-neutrino-local.sh
Andere Customization Scripte
Die bisher benannten Customization Scripte für Flash- u. Yadd-Targets sind die gebräuchlichsten. Diese werden allerdings gewissermaßen nur an die bestehenden Targets angehängt, anders als es bei den anderen, von denen es in Newmake noch jede Menge mehr gibt, bei denen dies als Ersatz der eigentlichen Targets dienen.<br> Im Prinzip ginge dies auf so gut wie alle Targets anzuwenden. Möchte man z.B. ein Contrib-Tool "customizen", etwa hdparm, kann man ein Script erstellen:
- hdparm-local.sh
Führt man dann das Target:
make hdparm
aus, wird dann das ausgeführt was im Customization Script angelgt wurde. Die Aktionen im Original-Makefile werden übersprungen. <br><br> Auch diese Funktion ist recht interessant und dürfte recht oft Anwendung finden:<br> Während des make-Durchlaufs werden einige Targets ausgeführt, welche die /.version-Files bei YADD
- version
bzw.
- flash-version
im Image erstellt. <br> Sofern eines dieser Scripte;
- version-local.sh
- flash-version-local.sh
vorhanden und ausführbar ist, wird es als Ersatz statt des originalen Targets ausgeführt, welches mit
make version
bzw.
make flash-version
angestoßen wird.
weitere Beispiele für Custiomization
Das Custiomizationscripting soll durch das folgende Beispiel noch mehr veranschaulicht werden. Beispiel:
In einem jffs2-Image wird dies gewünscht:
1. Eigene /etc/hosts benutzen, 2. Eigene neutrino.conf, bouquets.xml, services.xml benutzen 3. einschließlich lirc-Komponenten, zusammen mit eigenen lirc Konfigurations-Dateien.
1. und 3. sind Erweiterungen, die nach $(flashprefix)/root kommen sollten, während 2. Neutrino-regeln sind, welche nach sollten $(flashprefix)/root-neutrino-jffs2 gehöhren. <br> Um 1. und 3. zu erreichen, wird das Script root-local.sh erstellt, z.B.:
#!/bin/sh # root-local.sh flashprefix=$1 buildprefix=$2 newroot=$flashprefix/root myfiles=/home/somewhere/dbox/myfiles cp -f $myfiles/etc/hosts $newroot/etc make flashlirc cp -fr $myfiles/var/tuxbox/config/lirc $newroot/var/tuxbox/config
Das Script für 2. heist root-neutrino-local.sh, was dem verherigen sehr ähnlich ist:
#!/bin/sh # root-neutrino-local.sh flashprefix=$1 buildprefix=$2 newroot=$flashprefix/root-neutrino myfiles=/home/somewhere/dbox/myfiles cp $myfiles/var/tuxbox/config/neutrino.conf $newroot/var/tuxbox/config cp $myfiles/var/tuxbox/config/zapit/bouquets.xml $newroot/var/tuxbox/config/zapit cp $myfiles/var/tuxbox/config/zapit/services.xml $newroot/var/tuxbox/config/zapit
Bitte beachten: Diese Scripte sollen als Beispiele dienen und können vermutlich nicht ohne Anpassung verwendet werden.
Einige "best practices"
In diesem Abschnitt befinden sich einige Richtlinien, die zwar nicht zwingend "notwendig" sind, um korrekte Ergebnisse zu erzeilen, jedoch werden sie langfristig helfen, bessere, zuverlässigere und pflegbare Software zu erstellen. Dies betrifft Customizations, sowie zukünftige Änderungen am Makefile und deren Bestandteile selbst. <br> Wenn man diese Richtlinien nicht mag, kann man sie ignorieren, zumindest wenn man Customization Scripte für den eigenen Bedarf schreibt.
Idempotens
Es ist fast immer eine gute Idee zu versuchen, ein Installationsscript idempotent zu schreiben. Dies bedeutet, dass das mehrmalige Ausführen den gleichen Effekt hat wie das einmalige Ausführen. Benutze "make install". <br> In der Vergangenheit hat das Tuxbox Makefile die Komponenten zuerst in $(targetprefix) installiert, und dann die Imageverzeichnisse durch Kopieren der einzelnen Files aus der $(targetprefix) Hierarchie erstellt. Dieses ist keine sehr gute Softwaretechnik. <br> Zuerst gehört das Know-How bzgl. Installation des Paketes in das Makefile des Pakets, und soll nicht in einem einzigem großen Makefile sitzen, das einfach einzelne Files rüberkopiert. Wenn dieses Paket sich ändert, z.B. man ein Konfigurations-File hinzufügt oder löscht, wird es auch notwendig, das globale Makefile zu ändern. <br> <br> Es ist häufig der Fall, dass das Makefile, das zu einem Paket gehört, include-Files, (statische) Bibliotheken, Info-Files etc. installiert, die nicht auf einem enbedded System mit beschränktem Speicher erwünscht sind. Die korrekte Lösung zu diesem (wirklichen!) Problem wäre, das Makefile des betreffenden Pakets zu ändern, entweder, um ein flashinstall-Target zu schreiben, oder das Makefile mit einem Parameter wie installsize=[full,flash] zu versehen. <br> Wenn dies nicht durchführbar ist, ist es durchaus sinnvoller, daß nach make -C ... install das Löschen unerwünschter Files besser ist, als das kopieren einzelner Files. <br> Zu erwähnen ist auch, daß in dem Schritt, der die Verzeichnisse $(flashprefix)/root-gui-filesystem erzeugt, das include-verzeichnis, sowie alle statischen Bibliotheken gelöscht werden und dynamische Bibliotheken von unbenutzten Symbolen gestrippt werden.
Antworten auf einige Fragen
Falls das Build nicht gelingt
Es gibt kein Standardverfahren was zu tun wäre, wenn das Build misslingt. Es wird versucht, hier einige Richtlinien zu geben und diese zu lesen bevor man im Forum postet. <br><br> Zuerst, überprüft man den Output der ersten zwei Schritte, autogen.sh und configure auf Fehler und Warnungen. Jede Warnung oder Fehler, außer den fünf Warnungen, die oben genannt wurden, zeigen ein Problem an, dass ein Build wahrscheinlich unmöglich macht. <br><br> Wenn ein Build abbricht, kann es die Umgebung in einem inkonsistenten Zustand versetzen. Dies gilt insbesondere für die Verzeichnisse in $(flashprefix). Wenn der Bau solch eines Make-Targets abbricht, besteht das Verzeichnis, ist entsprechend seiner Änderungszeit aktuell, und ein folgender make Befehl behandelt ihn wie fertig und okay. <br><br> Selbstverständlich wird ein fehlerhaftes Build das Ergebniss sein. Wenn ein Build eines Unterverzeichnisses von $(flashprefix) in die Brüche geht, dann lösche man es, bevor ein anderer Make Befehl ausgeführt wird. <br><br> Bei "es funktionierte gestern"-Problemen, ist vermutlich die Umgebung in solch einem Zustand. Ein mehr-oder-weniger drastischer Reinigungsbefehl (siehe oben) ist hierbei oft schneller als eine Problemsuche. <br><br> Wenn man Hilfe benötigt, siehe unten!.
Nach dem Flashen: "Kein System" auf dem LCD/Was ist diese "bad magic byte" Zeugs?
Diese Frage kommt hoffentlich nicht... Die kurze Antwort ist: Man weiß es nicht. Wir wissen es nicht. Aber, wenn Ihr diesen Artikel so weit gelesen habt, erwartet bitte keine "kurze Antworten", sondern "gute Antworten". O.K. Das Thema ist ausführlich hier besprochen worden. <br> Kurz gesagt, das Image "ist" in Ordnung, es ist nur dass irgendwelche Firmware in der dBox es zurückweisen wird, weil es einige "schlechte magische Bytes" auf bestimmten Adressen finden wird. <br><br> Das Programm checkImage aus dem CVS, zu finden im Verzeichnis ./hostapps/checkImage ermittelt diese "schlechten Bytes", aber ändert nichts daran, um diese zu beheben. Die Erfahrung zeigt, daß Images, die checkImage für gut findet, wirklich laufen. Cramfs-, oder squashfs Images, worüber sich checkImage beschwert, laufen im allgemeinen nicht, in einigen Ausnahmefällen läufen sie aber doch. <br><br> Auch bei jffs2-Images ist dies manchmal der Fall, dass sich checkImage beschwert, die Images laufen, aber eben nicht immer. Mit diesen empirischen Beobachtungen ist man nun sich selbst überlassen. <br><br> Newmake weiß, wie dieses Programm aufgerufen werden kann, um die erzeugten Images automatisch zu überprüfen. Die Konfigurationsoption
--with-checkImage=[none,rename,warn]
wird hierfür verwendet. Falls warn gewählt ist, wird für jedes Image, das den Test nicht besteht, eine leere Datei erzeugt, am Namen wird "_bad" angehängt. Wenn rename gewählt wird, wird das fragliche Imagefile nur umbenannt indem "_bad" angehängt wird. <br><br> Es muss erwähnt werden, daß die "schlechten magischen Bytes" in einem (oder mehreren!) der Partitionsteile sitzt, und werden nicht durch den abschließenden Schritt erzeugt (die *.img1x und/oder *.img2x Files bauen). Es ist auch möglich, checkImage auf die Partitionsfiles anzuwenden *.jffs2, *.cramfs
- .squashfs
- .flfs1x
- .flfs2x
Schließlich hat checkImage eine Debugoption, die nützlich sein kann.
Ich habe ein Fehler gefunden!
Bugs, Unklarheiten, Verbesserungsvorschläge, etc. der Software sollten vorzugsweise im Cross Development Kit - Forum des Tuxbox-Boards gepostet werden.
Ich benötige Hilfe!
Supportanfragen können im Cross Development Kit - Forum des Tuxbox-Boards gepostet werden. Postings in deutsch oder englisch sind willkommen. Bitte nicht vergessen, die benutzten Konfigurationsoptionen zu erwähnen.
Anhang
Einige nützliche Customization Script Snippets
In diesem Anhang werden einige nützliche Customization Scripte gezeigt. Zwei Scripte sind bereits oben gezeigt worden. <br><br>
Warnung Auch falls die Beispiele in einigen Fällen benutzbar sind, werden die Scripte als Beispiele, nicht als Lösungen zu den realen Problemen gezeigt. Aus diesem Grund sind die Beispiele hier als Codefragmente, nicht als downloadbare Dateien, veröffentlicht. Bitte nicht verwenden, es sei denn es ist ungefährlich und Ihr versteht, wie sie funktionieren. Es ist grundlegende Script-Erfahrung erfordelich.
Games und Languages nuker
Dieses Script löscht alle Spiele (definiert als plugins mit type=1 in ihrer Konfigurationsdatei), sowie unerwünschte Sprachfiles (Neutrino angenommen). Das File sollte von root-neutrino-$filesystem-local.sh aufgerufen werden.
#!/bin/sh # Nukes all game plugins, as well as all locale files not listed in LANGUAGES newroot=$1/root-neutrino-jffs2 LANGUAGES="deutsch english" for f in $newroot/lib/tuxbox/plugins/*.cfg; do grep 'type=1' $f>/dev/null && rm -f $newroot/lib/tuxbox/plugins/`basename $f .cfg`.* done for f in $newroot/share/tuxbox/neutrino/locale/*; do (echo $LANGUAGES | grep -v `basename $f .locale` >/dev/null) && rm -f $f done
/.version anpassen
Euere eigene /.version-File herzustellen (anggezeigt von Neutrino durch dBox -> Services -> Image-Version und cdkVcInfo beim Booten) ist sicher ein allgemeiner Wunsch.
- flash-version-local.sh
#/bin/sh USER=$(whoami) if [ $0 = $CDIR/flash-version-local.sh ] ; then outfile=$FLASHDIR/root/.version type="Image" else outfile=$TARGETDIR/.version type="Yadd" fi; echo Creating $outfile ... echo "version=`./mkversion -snapshot -version 200`" > $outfile echo "creator=$USER" >> $outfile echo "imagename=$USER-$type" >> $outfile echo "homepage=http://www.your-website.de" >> $outfile
mkversion
Das benannte Script mkversion erzeugt die etwas kryptische Versionszeichenkette:
#!/bin/sh
releasetype=3
versionnumber=000
year=`date +%Y`
month=`date +%m`
day=`date +%d`
hour=`date +%H`
minute=`date +%M`
while expr $# > 0 ; do
case "$1" in
-release)
releasetype=0
;;
-snapshot)
releasetype=1
;;
-internal)
releasetype=2
;;
-version)
versionnumber=$2
shift
;;
esac
shift
done
echo $releasetype$versionnumber$year$month$day$hour$minute
Archivierung der Images
Es ist eigentlich die Aufgabe des Buildprozesses, flashbare Images zu erzeugen, und nicht sie zu archivieren. Jedoch kann die Customization leicht dazu "missbraucht" werden, um irgendeine Art der Archivierung zu ermöglichen, wie das folgende Beispiel zeigt:
#!/bin/sh flashprefix=$1 imagefile=`basename $0|sed -e s/-local.sh//` imagefilebase=`echo $imagefile|sed -e s/\.img.x//` extension=`echo $imagefile|sed -e s/[-a-z0-9]*\.//` newfilename="barf-"$imagefilebase-`date --iso-8601`.$extension echo Copying $flashprefix/$imagefile to $flashprefix/$newfilename... cp $flashprefix/$imagefile $flashprefix/$newfilename
Das Script sollte einen oder mehr der Namen
[neutrino, enigma]-[cramfs, squashfs,jffs2].[img1x, img2x]
haben. Es benennt die Files entsprechend dem Tagesdatum um.
Weblinks
- GNU Make manual
- Autoconf manual
- Automake manual
- GNU Autoconf, Automake, and Libtool
- GNU Coding standards
- Open Source Development with CVS, 3rd Edition
- Barf's Homepage: Barfs Newmake-Dokumentation]
- Linux-Kompendium: Shellprogrammierung bei Wikibooks
Grundlagen - Installation - Debug-Mode - Hardware - CDK/Development
LCars - Neutrino - Enigma - Plugins - Spiele - Software - Tools - Howto - FAQ - Images
Hauptseite - News - Alle Artikel - Bewertungen - Gewünschte Seiten - Index - Neue Artikel - Impressum - Team
Hilfeportal - Seite bearbeiten - Bilder - Links - Tabellen - Textgestaltung