Benutzer-Werkzeuge

Webseiten-Werkzeuge


project:snapcast:snapclient:lcd4linux

lcd4linux

Statisch gelinkt bauen

Da lcd4linux aktuell nicht in den Paketquellen von Alpine Linux enthalten ist und der Prozess zum Bauen eines Alpine-Paketes (siehe https://wiki.alpinelinux.org/wiki/Creating_an_Alpine_package) auch nicht „mal eben schnell“ zu durchlaufen ist, wurde es kurzerhand wie im Folgenden beschrieben statisch gelinkt auf einem anderen System gebaut und von dort auf den Snapclient kopiert und dort dem Overlay hinzugefügt.
Voraussetzung: ein 32-bittiges x86-Linux, im Beispiel ein Debian 6.0 i386 in einem chroot, Details weichen bei anderen Versionen oder Distributionen natürlich ab.

  1. Paketquellen aktualisieren: apt-get update
  2. Benötigte Pakete zum Bauen installieren apt-get install build-essential autoconf automake libgd2-noxpm-dev
  3. Bibliotheken für lcd4linux installieren: apt-get build-dep lcd4linux
  4. Quellen für lcd4linux herunterladen: apt-get source lcd4linux
  5. Ins Quellen-Verzeichnis wechseln: cd lcd4linux-<version>
  6. Skripte zum bauen erstellen: ./bootstrap
  7. Nun folgen ein paar verkettete Befehle, einfach, damit es zügig geht:
    make clean &&
    CFLAGS="-static -m32 -mcpu=i486" ./configure --enable-static --disable-shared '--with-drivers=all,!EFN,!SamsungSPF,!HD44780-I2C,!LEDMatrix,!X11' '--with-plugins=all,!dbus,!hddtemp,!imon,!kvv,!mpris_dbus,!pop3' &&
    make -j8 CCLD='$(CC) -all-static' &&
    strip lcd4linux
    1. make clean räumt eventuelle Reste von frühreren Bauvorgängen auf
    2. CFLAGS=…
      1. weist den Compiler an, statische Binaries zu bauen (-static))
      2. 32bit-Code zu erzeugen (-m32)
      3. keine Instruktionen die ein 486er nicht auch könnte zu benutzen (-mcpu=i486)
    3. ./configure … erstellt das Makefile anhand der Parameter und Systemkonfiguration
      1. statische Bibliotheken bauen (–enable-static)
      2. keine dynamischen Bibliotheken bauen (–disable-shared)
      3. alle Treiber zu bauen außer denen, die mit !<Treiber> angegeben sind, da diese unerfüllbare Abhängigkeiten haben oder sonstwie Probleme bereiten beim statischen Linken ('–with-drivers=all,!EFN,!SamsungSPF,!HD44780-I2C,!LEDMatrix,!X11')
      4. alle Plugins bauen außer denen, die mit !<Plugin> angegeben sind, da diese unerfüllbare Abhängigkeiten haben oder sonstwie Probleme bereiten beim statischen Linken ('–with-plugins=all,!dbus,!hddtemp,!imon,!kvv,!mpris_dbus,!pop3')
    4. make … compiliert alle Quelldateien und linkt anschließend das Programm
      1. benutze bis zu 8 Kerne gleichzeitig beim Compilieren (-j8)
      2. linke alle Programm rein statisch, normalerweise sollte das ./configure einstellen, aber hier scheint das nicht vorgesehen zu sein, deswegen dieser „Trick“ (CCLD='$(CC) -all-static')
    5. strip lcd4linux Entferne nicht benötigte Daten aus dem fertigen Program (vor allem Debug-Informationen)
  8. Hat alles geklappt (keine Fehler), sollte ein ldd lcd4linux folgende Ausgabe erzeugen:
    not a dynamic executable
    1. Zum Vergleich: Wäre lcd4linux dynamisch gelinkt, würde die Ausgabe so oder so ähnlich aussehen:
              linux-gate.so.1 =>  (0xf7f98000)
              libncurses.so.5 => /lib/libncurses.so.5 (0xf7f4c000)
              libX11.so.6 => /usr/lib/libX11.so.6 (0xf7e2f000)
              libgd.so.2 => /usr/lib/libgd.so.2 (0xf7ded000)
      ...
              /lib/ld-linux.so.2 (0xf7f9a000)
              libXau.so.6 => /usr/lib/libXau.so.6 (0xf7530000)
              libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xf752b000)
  9. Nun kann man lcd4linux auf einen snapclient kopieren: scp lcd4linux root@lounge.snapcast.shack:/usr/local/bin/lcd4linux
  10. Fertig!

OpenRC-Initscript

Damit lcd4linux als Service automatisch gestartet werden kann, braucht es noch ein einfaches OpenRC-Initscript:

cat > /etc/init.d/lcd4linux <<< EOF
#!/sbin/openrc-run

CONFIG=/etc/lcd4linux.conf
PID=/var/run/lcd4linux.pid

depend() {
        after lm_sensors modules hwdrivers networking
}

checkconfig() {
        if [ ! -f ${CONFIG} ]; then
                eerror "Configuration file ${CONFIG} not found"
                return 1
        fi
}

start() {
        checkconfig || return 1

        ebegin "Starting lcd4linux"
        start-stop-daemon --start --quiet --background --pidfile ${PID} \
                --exec /usr/local/bin/lcd4linux -- -f ${CONFIG} -v
        eend ${?}
}

stop() {
        ebegin "Stopping lcd4linux"
        start-stop-daemon --stop --pidfile ${PID}
        eend ${?}
}
EOF

Nun einfach mit rc-update add lcd4linux default lcd4linux dem Default-Runlevel hinzufügen und, wenn man nicht neustarten möchte, noch starten mit rc-service lcd4linux start

20x4-Zeichen-Display am Parallelport

Einige Snapclients haben ein 20×4 Zeichen umfassendes, HD44780-kompatibles Text-LCD am Parallelport angeschlossen. Die für die verwendete Verdrahtung nötige Konfig ist wie folgt:

Display HD44780-20x4 {
    Driver 'HD44780'
    Model 'generic'
    Port '/dev/parport0'
    Size '20x4'
    Icons '4'
    Wire {
        RW      'GND'
        RS      'AUTOFD'
        ENABLE  'STROBE'
        ENABLE2 'GND'
        GPO     'GND'
    }
}
project/snapcast/snapclient/lcd4linux.txt · Zuletzt geändert: 2021-09-13 16:52 von neos