17. November 2023
Linux Flatpaks II: Byg en Flatpak
Med del I i mente, så dykker vi nu dybere ned i Flatpaks. Vi bygger en simpel Flatpak, så… Hvordan gør vi lige det? (er det nu, jeg skal sige, at det ved jeg heller ikke? **Cue end-credits**). Nej, pjat ;-) … Vi starter blødt ud, og bygger så mere og mere på i del III og IV.
Installation af Flatpak
Installationsproceduren ift. Flatpak-værktøjerne er forskellig fra Linux-distribution til distribution. Canonical har f.eks valgt, at Ubuntu, som er en af de mest populære Linux-distributioner, skal bruge deres eget distributionsformat Snaps, fra og med Ubuntu 24.04. Det betyder, at man skal installere Flatpak-komponenter selv. En ærgerlig løsning, for det er et af de steder, jeg gerne ville se noget standardisering. Linux-distributionen Fedora har allerede Flatpak-funktionalitet integreret.
Jeg bruger Ubuntu, og vi vil selv bestemme, vil vi, så du kan installere Flatpaks terminalværktøj ved at gå til https://flathub.org/da/setup og find din Linux-distribution. Dernæst følger du bare guiden derinde. Vil du gerne skyde genvej kan du tilføje flatpak-builder allerede nu, og bruger du Ubuntu eller Debian, så skriv:
$ apt install flatpak flatpak-builder
(dollartegnet viser blot, at vi befinder os i terminalen, så det skal ikke med).
Får du at vide, at Flatpak allerede er installeret, så behøver du ikke gøre ydeligere. Du kan teste om din Flatpak installation virker ved at skrive:
$ flatpak search blender
og så skulle du gerne se en række resultater. Hvis du af en eller anden grund ikke kan se nogle Flatpaks, så kan det være, du mangler at koble Flatpak på et repository. De fleste associerer Flatpak-repo’et Flathub med Flatpak, så det kobler vi os på. Det bliver vildere senere i guideføljetonen her (del IV), da skal vi selv prøve at lave vores eget lokale Flathub (dundundun… lidt af en cliffhanger, hva’?!).
Flatpak-repos virker i øvrigt akkurat ligesom git, så du kan tilføje Flathub med:
$ flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
Grafiske frontends til Flatpaks
Et kort lille ophold i guiden, fordi… Jeg vil gerne lige anbefale nogle udvidelser til funktionaliteten i din distributions Software Center.
Gnome Software Center
Som beskrevet i starten, så har mange distroer baseret på Gnomes skrivebordsmiljø allerede Flatpak og dens Software Center-udvidelser installeret, men hvis det ikke tilfældet for din, så kan det tilføjes.
$ sudo apt install gnome-software-plugin-flatpak
Om alt går vel, så når du derefter åbner Gnome Software Center, og klikker på en app, vil du i øverste højre hjørne se, at der står “Flathub (Flatpak)” i dropdown-menuen. Bruger du Ubuntu ligesom jeg, så kan du med fordel installere Gnome Software Center i stedet for Canonicals variant.
KDE Discover
Bruger du KDE som dit skrivebordsmiljø, så er det muligt, du skal installere et tillægsmodul til “Discover”, som er KDEs Software Center. Men test om du kan åbne en Flatpak inden du forsøger. For det kan være, at funktionaliteten allerede er installeret, afhængig af hvilken Linux-distribution, du bruger. Ellers finder du tillægsmodulet her: https://apps.kde.org/da/discover.flatpak/
Flatpaks er “sandboxed”
Efter denne lille detour kan vi prøve at bygge vores første Flatpak. Vi skal bruge en 4 ting, en “runtime” og et SDK - Software Development Kit, og en manifest-fil, og så dit program, script eller lign.
Der findes tre forskellige runtimes, FreeDesktop, KDE og Gnome. Runtimen pakkes med ned sammen med din app i din færdige Flatpak, og sørger for, at pakken virker som en native compiled app.
Det er lidt en omstændig arbejdsgang, men måske husker du fra del I, at jeg skrev at Flatpaks var sandboxed? De har slet ikke adgang til det omkringliggende miljø, derfor skal vi bruge dels runtimen, SDK’et, men også manifest-filen til at specificere, hvilke rettigheder Flatpak’en skal have. Freedesktop-runtimen har det mest minimale sæt af “tilbehør”, så det er målet for vores første Flatpak.
En tur i sandkassen
Jeg anbefaler, at du først laver en hel ny mappe, som skal indeholde alt, der har med din kommende Flatpak at gøre. Dvs. at du lige om lidt har et shell-script og en manifest-fil i mappen.
Og så skal vi have installeret runtime og SDK. Installationsmetoden til runtime og SDK er sakset direkte fra dokumentationen til Flatpak
$ flatpak install flathub org.freedesktop.Platform//23.08 org.freedesktop.Sdk//23.08
Jeg valgte Freedesktops-udgave, da det er den mest grundlæggende. KDE, Elementarys og Gnomes varianter er alle overbygninger. Du skal nok påregne, at det vil æde ca. 500MB+ af din computers diskplads, men står i skærende kontrast til, hvad Windows SDK’et fylder til sammenligning ;-)
Efter endt installation, sakser jeg lige lidt mere fra dokumentationen. Kast følgende kode i en ny fil, navnet er valgfrit, men kunne f.eks være ‘hello.sh’ for at følge Flatpak-doc’en:
#!/bin/sh echo "Hello world, from a sandbox"
Manifestet
Nu kommer vi så til manifestet, manifestet vil jeg egentlig helst sammenligne med en bageopskrift. Det fortæller, hvordan systemet skal bygge og afvikle din Flatpak, og den del synes jeg mangler lidt mere beskrivelse end det, der står i Flatpak-dokumentationen, så tillad mig at uddybe:
Først sakser vi lige “bageopskriften” - manifestet - fra Flatpak-dokumentationen - imens jeg beder til, at mit Flatpress-blogsystem formaterer koden korrekt. Fordi eftersom manifestet kan være en YAML eller JSON-fil (herunder er den i YAML-format), så er det vigtigt hvordan indrykninger laves, se f.eks strukturen efter modules-afsnittet, hvor der er indryk:
app-id: org.flatpak.Hello runtime: org.freedesktop.Platform runtime-version: '23.08' sdk: org.freedesktop.Sdk command: hello.sh modules: - name: hello buildsystem: simple build-commands: - install -D hello.sh /app/bin/hello.sh sources: - type: file path: hello.sh
Forklaring til de enkelte dele:
app-id: et unikt ID til din Flatpak, læg specielt mærke til, at det er omvendt notation i forhold til en website-adresse. Jeg ville f.eks normalt bruge app-id’et dk.simonjustesen.Hello til denne test-Flatpak, hvis den skulle udgives på f.eks Flathub. Du skal bl.a. bruge app-id’et som præfix på de elementer, du vil have i din færdige Flatpak-pakke. Det kigger vi mere på i del III. Lige nu er det, det mest basale først.
runtime: den valgte runtime
runtime-version: - versionsnr. på den valgte runtime.
sdk: - det valgte SDK
command: - kommando, der udføres, når Flatpak’en startes
Modules-afsnittet
Du kan have et eller flere moduler, hvis en del af din Flatpak er afhængig af en anden.
name: Navn på dette modul
buildsystem: - kan f.eks være “simple”, “cmake-ninja” og “meson”, “qmake”. Du kan således delegere byggeriet over til andre buildsystems.
build-command: Et array af build-kommandoer, der skal køres. I manifestet ovenfor installerer vi hello.sh ind i /app/bin/hello i Flatpak’ens sandkasse. Valgmuligheden -D på install-kommandoen betyder, at vi giver lov til at oprette både ‘app’ og ‘bin’-mapperne, som ‘hello’-scriptet placeres i, inde i Flatpak’en.
Le grande finale
Nu er der egentlig kun tilbage at køre
flatpak-builder build-dir org.flatpak.Hello.yaml
som vil bygge din Flatpak, dernæst kan du testkøre den lokalt med:
flatpak-builder --run build-dir org.flatpak.Hello.yaml hello.sh
Nu skulle du så gerne se outputtet af din hello.sh-scriptfil.
Det var det… Eller var det? Andre guider ville måske slippe dig løs her, men vi er ikke færdige endnu. Af hensyn til opslagets længde vil jeg dog fortsætte i part III, som jeg poster så hurtigt, jeg kan.