PND-Datei/Tipps und Tricks

Aus PandoraWiki

Wechseln zu: Navigation, Suche

Es gibt beim Erstellen von PNDs einige wiederkehrende Probleme/Aufgaben, von denen hier möglichst viele beschrieben werden.

Inhaltsverzeichnis

Startscript verwenden

Manchmal muss man, bevor das Progrmm gestartet wird, einige Dinge erledigen, z. B. dem Programm vorgaukeln der [[PND#Appdata|Appdata-Ordner] wäre das Homeverzeichnis, damit es nichts in den RAM schreibt. Nachher muss man es natürlich wieder rückgängig machen. Solche Dinge erledigt man, indem man in der PXML.xml-Datei im <exec>-Block ein Script angibt, statt dem Programm selbst, welches dann die benötigten Dinge erledigt, das Programm startet, und nachher falls nötigt auch Dinge wieder rückgängig macht. Die Grundlegende Struktur so eines Scripts ist die Folgende:

#!/bin/sh
 
# Zeugs einrichten, was auch immer
 
./my_app
 
# Zeugs falls nötigt wieder rückgängig machen, was auch immer

"./my_app" ist das Programm selbst, das muss natürlich angepasst werden. Wenn die ausführbare Datei des Programms in der PND im Ordner "bin" ist und "start" heisst, wäre diese Linie "./bin/start", beim obigen Beispiel liegt die ausführbare Datei im Stammverzeichnis der PND und heisst "my_app".

Schreibzugriffe auf den NAND vermeiden, indem man $HOME setzt

Viele Linuxprogramme erstellen einen Ordner im Homeverzeichnis des Benutzers, in dem sie ihre Konfiguration und ähnliches speichern. Auf der Pandora ist das unerwünscht, weil der NAND sehr knapp bemessen ist, die Daten müssen in den Appdata-Ordner. Oft kann man Programmen vorgaukeln, ein bestimmter Ordner wäre das Homeverzeichnis, indem man die $HOME Umgebungsvariable verändert.

export HOME=`pwd`
## ODER
export HOME=$(pwd)

Damit wird das Homeverzeichnis auf das aktuelle Arbeitsverzeichnis gestellt, die beiden Möglichkeiten sind nur unterschiedliche Schreibweisen. Das kann z. B. im oben beschriebenen Startscript verwendet werden.

Dateien in der PND beschreibbar machen

Dateien PNDs sind grundsätzlich nur lesbar. Wenn man trotzdem z. B. eine Konfigurationsdatei, die schreibbar sein muss, beilegen will, macht man das am einfachsten, indem man die Datei unter einem anderen Namen beilegt und sie beim ersten Start an den richtigen Ort kopiert - und wenn eine neue Datei in der PND angelegt wird, wird das automatisch auf den Appdata-Ordner umgeleitet, in dem sie dann auch schreibbar ist. Auch ein Kandidat für das Startscript.

# Methode 1: überprüfen ob die Datei existiert, sonst kopieren:
if [ ! -f app.conf ] ; then
    cp default.conf app.conf
fi
 
# Methode 2: Verkürzt, aber eigentlich genau das selbe wie 1:
[ -f app.conf ] || cp default.conf app.conf
 
# Methode 3: In jedem Fall den "cp" Befehl aufrufen, um die Datei zu kopieren, aber ein Argument "--no-clobber" verhindert, dass "cp" irgendwelche Dateien überschreibt.
cp --no-clobber default.conf app.conf


Beschreibbare Ordner

Wenn man einen beschreibbaren Ordner braucht, kann man ihn einfach erstellen:

# Zuerst: Das folgende geht zwar, produziert aber nach dem ersten Start einen Fehler. Also NICHT VERWENDEN.
mkdir saved_data
 
# Mit "-p" stört sich "mkdir" nicht an bereits existierenden Ordnern
mkdir -p saved_data
 
# Zusätzlicher Vorteil davon ist, dass man so sogar mehrere Ordner ineinander erstellen kann:
mkdir -p saved_data/foo saved_data/bar/with/deep/sub/dirs

Laden von Programmbibliotheken (shared libraries)

Wenn ein Programm Libs benötigt, die nicht in der Standard Firmware enthalten sind, müssen sie der PND beigelegt werden. Damit das System diese auch findet, muss man ihm sagen, welche Verzeichnisse es durchsuchen soll. Das wird durch anpassen der "LD_LIBRARY_PATH" Umgebungsvariable erreicht:

export LD_LIBRARY_PATH=`pwd`       # Libs aus dem Stammverzeichnis der PND laden
export LD_LIBRARY_PATH=`pwd`/libs  # Libs aus dem "libs/" Ordner in der PND laden

Benutzer nach einer Datei fragen

Wenn man den Benutzer nach einem Pfad fragen muss (z. B. wenn ein Emulator keine GUI hat, um die ROMs auszuwählen), geht das ganz einfach mit zenity. Beachte die ", die dafür sorgen, dass das auch bei Dateien mit Leerzeichen im Namen funktioniert.

DATEI="$(zenity --file-selection --title='Wähle eine Datei')" # Den Pfad in der Variable "DATEI" speichern
./my_app "$DATEI" # "my_app" im aktuellen Arbeitsverzeichnis mit dem Pfad als Parameter starten

Einen Pfad speichern

Wenn bei jedem Start nach einem Pfad gefragt wird, ist es für den Benutzer praktisch, wenn die Auswahl vom letzten Mal gemerkt wird:

SAVEDIR=./dir.saved    # Der Name der Datei, in die der Pfad gespeichert wird.
 
# Versuche die Datei auszugeben und in der Variable "DIR" zu speichern, Fehler werden nach /dev/null umgeleitet, so dass die Variable leer ist, wenn die Datei nicht existiert.
DIR=`cat $SAVEDIR 2> /dev/null`
 
# Das aktuelle Arbeitsverzeichnis in "PNDDIR" speichern, damit wir es später wiederherstellen können.
PNDDIR=`pwd`
 
# Überprüfen, ob der Ordner vom letzten Mal noch existiert.
if [ -d "$DIR" ] ; then
    # Er existiert, setze ihn als Arbeitsverzeichnis
    cd "$DIR"
else
    # Er existiert nicht, gehe stattdessen nach /media,
    # wenn es das auch nicht gibt nach /
    cd /media 2> /dev/null || cd /
fi
 
# Einen Dateiauswahldialog in unseren aktuellen Arbeitsverzeichnis
# öffnen, also wenn das Verzeichnis noch existiert, das vom letzten
# Mal.
FILE=`zenity --file-selection --title="Select a file"`
 
# Wenn es einen Fehler gab oder der Benutzer abgebrochen hat, Script beenden
[ $? -eq 0 ] || exit 1;
 
# Zurück in das ursprüngliche Arbeitsverzeichnis, den Ort wo die PND
# gemountet ist.
cd $PNDDIR
 
# Pfad für das nächste Mal speichern
dirname "$FILE" > $SAVEDIR
 
# "my_app" im Stammverzeichnis der PND mit der Datei als Argument starten
./my_app "$FILE"

Dateiinhalt überprüfen

Wenn das Programm eine bekannte Datei vom Benutzer braucht, die nicht mit dem Programm mitgegeben werden kann, z. B. eine BIOS für Emulatoren, ist es eine gute Idee zu überprüfen, ob die Datei auch wirklich die ist, die man haben will. Ein weg dies zu tun, ist eine Prüfsumme der Datei zu generieren und zu überprüfen ob die vom Benutzer ausgewählte Datei die selbe Prüfsumme hat. Eine oft verwendete Art von Prüfsumme ist die md5-Prüfsumme, welche im Beispiel verwendet wird. Man muss zuerst mit dem Befehl "md5sum Pfad/zu/datei/dateiname" die Prüfsumme der richtigen Datei ermitteln und die Ausgabe (etwas wie "0dd42921818914a6b10e0696a6b523e3 dateiname") und diese in einer Datei "dateiname.md5" speichern.

DATEI=bios.img       # Der Name der Datei, die man überprüfen will
 
# Überprüfen, ob die Datei schon existiert
if [ ! -f ./$DATEI ] ; then
    # Existiert nicht, also den Benutzer nach ihr fragen
    cp "`zenity --file-selection --title="Wähle die ${DATEI}-Datei"`" $DATEI
    if [ $? != 0 ] ; then
        # Benutzer hat abgrochen oder es gab sonst einen Fehler, Fehlermeldung und Script beenden
        zenity --error --text="Sorry, funktioniert nicht ohne die $DATEI"
        exit 1
    fi
 
    # Prüfsummen vergleichen, wenn sie nicht übereinstimmen mit zenity fragen, ob
    # der Benutzer es trotzdem versuchen will
    md5sum -c dateiname.md5 || zenity --question \
        --text="$DATEI scheint nicht die korrekte Version zu sein - trotzdem damit versuchen?"
 
    if [ $? != 0 ] ; then
        # Prüfsummen stimmten nicht überein und der Benutzer wollte es nicht trotzdem versuchen,
        # also  die kopierte Datei löschen und beenden
        rm -f $DATEI
        exit 1
    fi
fi
 
# "my_app" im Stammverzeichnis der PND mit der Datei als Argument starten
./my_emu "$BIOS"
Persönliche Werkzeuge