Il mio quinto giorno con Haiku: portiamo un po' di software.

Il mio quinto giorno con Haiku: portiamo un po' di software.

TL;DR: Un principiante ha visto Haiku per la prima volta, prova a portare alcuni programmi dal mondo Linux.

Il mio quinto giorno con Haiku: portiamo un po' di software.
Il mio primo programma portato per Haiku, impacchettato nel suo formato hpkg.

Di recente Ho scoperto Haiku, un sorprendentemente buono sistema operativo per PC.
Oggi imparerò a portare nuovi programmi su questo sistema operativo. L'accento principale sarà sulla descrizione della mia prima esperienza di transizione a Haiku dal punto di vista di uno sviluppatore Linux. Scusate per gli errori stupidi commessi lungo il percorso, dato che è passato meno di una settimana da quando ho caricato Haiku per la prima volta.

Voglio raggiungere tre obiettivi:

  • Portare un'applicazione CLI semplice.
  • Portare un'applicazione con GUI su Qt.
  • Poi imballarle nel formato hpkg (dato che sto ancora pensando all'adattamento di AppDir e AppImage per Haiku…)

Iniziamo. Nelle sezioni documentazione e sviluppare, così come in wiki di HaikuPorts ho trovato la direzione giusta. C'è persino un libro online in formato PDF. BeOS: Porting Unix Applications.
467 pagine — e questo è dal 1997! È spaventoso dare un'occhiata dentro, ma spero nel meglio. Le parole del sviluppatore sono incoraggianti: «lento, perché BeOS non era POSIX-compliant», ma Haiku è «per la maggior parte» già così.

Portare un'applicazione CLI semplice

La prima idea è stata quella di portare l'applicazione avrdude, ma, come si è rivelato, è già sono stati resi da molto tempo.

Primo tentativo: non c'è nulla da vedere

Quello che non riesco a capire, è che già da oltre 10 anni le applicazioni vengono portate su Haiku — considerando che l'OS non ha nemmeno una versione 1.0.

Secondo tentativo: è necessario riscrivere

Quindi, userò ptouch-770, CLI per gestire la stampante Brother P-Touch 770, sulla quale stampo le etichette.
Stampo varie etichette su di essa e potresti averla già vista nel mio articolo precedente. Poco tempo fa ho scritto un piccolo programma wrapper con GUI in Python (dato che è su Gtk+ — dovrò riscriverlo, ed è una buona occasione per imparare).

Il mio quinto giorno con Haiku: portiamo un po' di software.
La stampante per etichette Brother P-Touch 770. Funzionerà su Haiku?

Il gestore pacchetti di Haiku conosce le librerie e i comandi, quindi se ricevo un messaggio "can’t find libintl" all'avvio configure — basta eseguire pkgman install devel:libintl e il pacchetto necessario verrà trovato. Analogamente pkgman install cmd:rsync. E così via.

A parte i casi in cui non funziona:

/Haiku/home> git clone https://github.com/probonopd/ptouch-770
Cloning into 'ptouch-770'...
remote: Enumerating objects: 134, done.
remote: Total 134 (delta 0), reused 0 (delta 0), pack-reused 134
Receiving objects: 100% (134/134), 98.91 KiB | 637.00 KiB/s, done.
Resolving deltas: 100% (71/71), done./Haiku/home> cd ptouch-770//Haiku/home/ptouch-770> make
gcc -Wall -O2 -c -o ptouch-770-write.o ptouch-770-write.c
ptouch-770-write.c:28:10: fatal error: libudev.h: No such file or directory
 #include <libudev.h>
          ^~~~~~~~~~~
compilation terminated.
Makefile:16: recipe for target 'ptouch-770-write.o' failed
make: *** [ptouch-770-write.o] Error 1/Haiku/home/ptouch-770> pkgman install devel:libudev
100% repochecksum-1 [65 bytes]
Validating checksum for Haiku...done.
100% repochecksum-1 [64 bytes]
Validating checksum for HaikuPorts...done.
*** Failed to find a match for "devel:libudev": Name not found/Haiku/home/ptouch-770> pkgman install devel:udev
100% repochecksum-1 [65 bytes]
Validating checksum for Haiku...done.
100% repochecksum-1 [64 bytes]
Validating checksum for HaikuPorts...done.
*** Failed to find a match for "devel:udev": Name not found

Forse udev è troppo 'linuxy', quindi non esiste per Haiku. Questo significa che è necessario modificare il codice sorgente che sto cercando di compilare.
Eh, non si può andare oltre le proprie possibilità, e non so nemmeno da dove cominciare.

Terzo tentativo

Sarebbe utile avere tmate per Haiku, così permetterei agli sviluppatori di Haiku di connettersi alla mia sessione terminale — nel caso in cui qualcosa vada storto. Le istruzioni sono piuttosto semplici:

./autogen.sh
./configure
make
make install

Sembra buono, quindi perché non provarlo su Haiku?

/Haiku/home> git clone https://github.com/tmate-io/tmate/Haiku/home> cd tmate//Haiku/home/tmate> ./autogen.sh
(...)/Haiku/home/tmate> ./configure
(...)
checking for libevent... no
checking for library containing event_init... no
configure: error: "libevent not found"/Haiku/home/tmate> pkgman install devel:libevent
(...)
The following changes will be made:
  in system:
    install package libevent21-2.1.8-2 from repository HaikuPorts
    install package libevent21_devel-2.1.8-2 from repository HaikuPorts
Continue? [yes/no] (yes) :
100% libevent21-2.1.8-2-x86_64.hpkg [965.22 KiB]
(...)
[system] Done.checking for ncurses... no
checking for library containing setupterm... no
configure: error: "curses not found"/Haiku/home/tmate> pkgman install devel:libcurses
(...)
*** Failed to find a match for "devel:libcurses": Name not found/Haiku/home/tmate> pkgman install devel:curses
(...)
*** Failed to find a match for "devel:curses": Name not found

A questo punto apro HaikuDepot e cerco curses.
Qualcosa è apparso, che mi ha dato un suggerimento per una richiesta più appropriata:

/Haiku/home/tmate> pkgman install devel:libncurses
(...)
100% ncurses6_devel-6.1-1-x86_64.hpkg [835.62 KiB]
(...)./configure
(...)
checking for msgpack >= 1.1.0... no
configure: error: "msgpack >= 1.1.0 not found"/Haiku/home/tmate> pkgman install devel:msgpack
(...)
*** Failed to find a match for "devel:msgpack": Name not found/Haiku/home/tmate> pkgman install devel:libmsgpack
(...)
*** Failed to find a match for "devel:libmsgpack": Name not found

Sono tornato in HaikuDepot e, ovviamente, ho trovato devel:msgpack_c_cpp_devel. Che nomi strani?

/Haiku/home/tmate> pkgman install devel:msgpack_c_cpp_devel
100% repochecksum-1 [65 bytes]
Validating checksum for Haiku...done.
100% repochecksum-1 [64 bytes]
Validating checksum for HaikuPorts...done.
*** Failed to find a match for "devel:msgpack_c_cpp_devel": Name not found# Why is it not finding it? To hell with the "devel:".../Haiku/home/tmate> pkgman install msgpack_c_cpp_devel
(...)
The following changes will be made:
  in system:
    install package msgpack_c_cpp-3.1.1-1 from repository HaikuPorts
    install package msgpack_c_cpp_devel-3.1.1-1 from repository HaikuPorts
Continue? [yes/no] (yes) :
(...)/Haiku/home/tmate> ./configure
(...)
checking for libssh >= 0.8.4... no
configure: error: "libssh >= 0.8.4 not found"/Haiku/home/tmate> pkgman install devel:libssh/Haiku/home/tmate> make
(...)
In file included from /boot/system/develop/headers/msgpack.h:22,
                 from tmate.h:5,
                 from cfg.c:29:
/boot/system/develop/headers/msgpack/vrefbuffer.h:19:8: error: redefinition of struct iovec'
 struct iovec {
        ^~~~~
In file included from tmux.h:27,
                 from cfg.c:28:
/boot/system/develop/headers/posix/sys/uio.h:12:16: note: originally defined here
 typedef struct iovec {
                ^~~~~
Makefile:969: recipe for target 'cfg.o' failed
make: *** [cfg.o] Error 1

A questo punto ho capito che portare il programma su Haiku richiede molte più conoscenze di quelle necessarie per una semplice ricompilazione.
Ho parlato con i gentili sviluppatori di Haiku, e ho scoperto che c'è un bug in msgpack, e dopo qualche minuto vedo un patch in HaikuPorts. Osservo come il pacchetto sistemato viene compilato qui (buildslave — macchine virtuali).

Il mio quinto giorno con Haiku: portiamo un po' di software.
Compilazione del msgpack corretto su buildmaster

Nel frattempo invio il patch all'upstream. per aggiungere il supporto a Haiku in msgpack.

Cinque minuti dopo, msgpack aggiornato è già disponibile su Haiku:

/Haiku/home/tmate> pkgman update
(...)
The following changes will be made:
  in system:
    upgrade package msgpack_c_cpp-3.1.1-1 to 3.2.0-2 from repository HaikuPorts
    upgrade package msgpack_c_cpp_devel-3.1.1-1 to 3.2.0-2 from repository HaikuPorts
Continue? [yes/no] (yes) : y
100% msgpack_c_cpp-3.2.0-2-x86_64.hpkg [13.43 KiB]
(...)
[system] Done.

Inaspettatamente buono. L'ho detto io?!

Torno al compito originale:

/Haiku/home/tmate> make
(...)
In file included from tmux.h:40,
                 from tty.c:32:
compat.h:266: warning: "AT_FDCWD" redefined
 #define AT_FDCWD -100

In file included from tty.c:25:
/boot/system/develop/headers/posix/fcntl.h:62: note: this is the location of the previous definition
 #define AT_FDCWD  (-1)  /* CWD FD for the *at() functions */

tty.c: In function 'tty_init_termios':
tty.c:278:48: error: 'IMAXBEL' undeclared (first use in this function); did you mean 'MAXLABEL'?
  tio.c_iflag &= ~(IXON|IXOFF|ICRNL|INLCR|IGNCR|IMAXBEL|ISTRIP);
                                                ^~~~~~~
                                                MAXLABEL
tty.c:278:48: note: each undeclared identifier is reported only once for each function it appears in
Makefile:969: recipe for target 'tty.o' failed
make: *** [tty.o] Error 1

Ora sembra che msgpack non sia colpevole. Commento IMAXLABEL in tty.c così:

tio.c_iflag &= ~(IXON|IXOFF|ICRNL|INLCR|IGNCR|/*IMAXBEL|*/ISTRIP);

Risultato:

osdep-unknown.c: Nella funzione 'osdep_get_cwd':
osdep-unknown.c:32:19: avviso: parametro 'fd' non utilizzato [-Wunused-parameter]
 osdep_get_cwd(int fd)
               ~~~~^~
make: *** Nessuna regola per creare il target 'compat/forkpty-unknown.c', necessario per 'compat/forkpty-unknown.o'. Stop.

Ecco di nuovo... A proposito:

/Haiku/home/tmate> ./configure | grep -i OPENAT
checking for openat... no

mr. waddlesplash indica dove scavare:

/Haiku/home/tmate> ./configure LDFLAGS="-lbsd"
(...)/Haiku/home/tmate> make
(...)
In file included from tmux.h:40,
                 from window.c:31:
compat.h:266: warning: "AT_FDCWD" redefined
 #define AT_FDCWD -100

In file included from window.c:22:
/boot/system/develop/headers/posix/fcntl.h:62: note: this is the location of the previous definition
 #define AT_FDCWD  (-1)  /* CWD FD for the *at() functions */

make: *** No rule to make target 'compat/forkpty-unknown.c', needed by 'compat/forkpty-unknown.o'.  Stop.

Qui ho caricato config.log.

Mi è stato spiegato che per libresolv su Haiku c'è qualcos'altro in libnetwork. Evidentemente bisogna continuare a modificare il codice. Devo riflettere...

find . -type f -exec sed -i -e 's|lresolv|lnetwork|g'  {} ;

La questione di sempre: cosa sta succedendo.

/Haiku/home/tmate> ./configure LDFLAGS="-lbsd"
(...)/Haiku/home/tmate> make
(...)
# Success!# Let's run it:/Haiku/home/tmate> ./tmate
runtime_loader: /boot/system/lib/libssh.so.4.7.2: Could not resolve symbol '__stack_chk_guard'
resolve symbol "__stack_chk_guard" returned: -2147478780
runtime_loader: /boot/system/lib/libssh.so.4.7.2: Troubles relocating: Symbol not found

Lo stesso, solo che in profilo. Ho cercato su Google e ho trovato questo. Se aggiungi -lssp a volte aiuta, provo:

/Haiku/home/tmate> ./configure LDFLAGS="-lbsd -lssp"
(...)/Haiku/home/tmate> make
(...)/Haiku/home/tmate> ./tmate

Wow! Si avvia! Ma...

[tmate] errore di ricerca ssh.tmate.io. Riprovo tra 2 secondi (errore non recuperabile nella risoluzione dei nomi)

Proverò a debuggarlo, il file è qui:

/Haiku/home/tmate> strace -f ./tmate >log 2>&1

«Bad port ID» - è già come un biglietto da visita haiku. Magari qualcuno sa cosa non va e come sistemarlo? Se necessario, aggiornerò l'articolo. Link a GitHub.

Porting di un'app GUI su Qt.

Scelgo un'applicazione QML semplice.

/> cd /Haiku/home//Haiku/home> git clone https://github.com/probonopd/QtQuickApp
/Haiku/home/QtQuickApp> qmake .
/Haiku/home/QtQuickApp> make
/Haiku/home/QtQuickApp> ./QtQuickApp # Works!

Realmente semplice. Meno di un minuto!

Imballaggio delle applicazioni in hpkg utilizzando haikuporter e haikuports.

Da dove iniziare? Non c'è una documentazione semplice, quindi vado sul canale #haiku di irc.freenode.net e sento:

  • Team pacchetto — un modo a basso livello per creare pacchetti. In gran parte, è sufficiente PackageInfo, come descritto nella sezione "Trasformarlo in un vero pacchetto .hpkg".
  • Devo fare qualcosa questo
  • Puoi usare hpkg-creator (mi si chiude, rapporto di errore)

Non capisco cosa fare. Suppongo di aver bisogno di un manuale per principianti in stile "Ciao, Mondo!", idealmente un video. Sarebbe utile anche avere un'introduzione comoda a HaikuPorter, come è fatto in GNU hello.

Leggo il seguente:

haikuporter è uno strumento per creare progetti di pacchetti comuni per Haiku. Utilizza il repository HaikuPorts come base per tutti i pacchetti. Per creare pacchetti si usano le ricette di haikuporter.

Inoltre scopro che:

Non è necessario tenere le ricette nel repository HaikuPorts. Puoi creare un altro repository, inserire le ricette e quindi indicare a haikuporter di usarlo.

Proprio quello di cui ho bisogno — a meno che non stia cercando un modo per pubblicare il pacchetto. Ma questo è un argomento per un altro post.

Installazione di haikuporter e haikuports

cd /boot/home/
git clone https://github.com/haikuports/haikuporter --depth=50
git clone https://github.com/haikuports/haikuports --depth=50
ln -s /boot/home/haikuporter/haikuporter /boot/home/config/non-packaged/bin/ # rendilo eseguibile ovunque
cd haikuporter
cp haikuports-sample.conf /boot/home/config/settings/haikuports.conf
sed -i -e 's|/mydisk/haikuports|/boot/home/haikuports|g' /boot/home/config/settings/haikuports.conf

Scrittura della ricetta

SUMMARY="Demo applicazione QtQuick"
DESCRIPTION="QtQuickApp è un'applicazione demo QtQuick per testare il porting e l'imballaggio di Haiku"
HOMEPAGE="https://github.com/probonopd/QtQuickApp"
COPYRIGHT="Nessuno"
LICENSE="MIT"
REVISION="1"
SOURCE_URI="https://github.com/probonopd/QtQuickApp.git"
#PATCHES=""
ARCHITECTURES="x86_64"
PROVIDES="
    QtQuickApp = $portVersion
"
REQUIRES="
    haiku
"
BUILD_REQUIRES="
    haiku_devel
    cmd:qmake
"BUILD()
{
    qmake .
    make $jobArgs
}INSTALL()
{
    make install
}

Compilazione della ricetta

Salvo il file con il nome QtQuickApp-1.0.recipe, dopo di che eseguo haikuporter -S ./QuickApp-1.0.recipe. Verifico le dipendenze per tutti i pacchetti nel repository haikuports, il che richiede un po' di tempo. Vado a prendere un caffè.

E perché questa verifica dovrebbe essere effettuata sulla mia macchina locale invece che in modo centralizzato su un server una sola volta per tutti?

Secondo mr. waddlesplash:

Perché è possibile riscrivere qualsiasi file nel repository 😉 Si può un po' ottimizzare questo, calcolando le informazioni necessarie solo quando necessario, dato che le ultime modifiche effettuate sono piuttosto rare.

~/QtQuickApp> haikuporter  QtQuickApp-1.0.recipe
Controllo se è necessario aggiornare le informazioni sulle dipendenze ...
Cerco informazioni sulle dipendenze obsolete ...
Errore: QtQuickApp non trovato nel repository

Non esiste un file di ricetta normale che contenga il codice sorgente della tua applicazione. Deve essere mantenuto nel repository nel formato HaikuPorts.

~/QtQuickApp> mv QtQuickApp-1.0.recipe ../haikuports/app-misc/QtQuickApp/
~/QtQuickApp> ../haikuport
~/QtQuickApp> haikuporter -S QtQuickApp-1.0.recipe

Questo fatto rende la compilazione più ingombrante. Non mi piace molto, ma penso che sia necessario affinché, alla fine, tutto il software open source venga incluso in HaikuPorts.

Ricevo quanto segue:

~/QtQuickApp> haikuporter -S QtQuickApp-1.0.recipe
Controllo se è necessario aggiornare le informazioni sulle dipendenze ...
        aggiornamento delle informazioni sulle dipendenze di QtQuickApp-1.0
Cerco informazioni sulle dipendenze obsolete ...
Errore: QtQuickApp-1.0.recipe non trovato nell'albero.

Cosa c'è di sbagliato? Dopo aver letto irc faccio:

~/QtQuickApp> haikuporter -S QtQuickApp
Controllo se è necessario aggiornare le informazioni sulle dipendenze ...
        aggiornamento delle informazioni sulle dipendenze di QtQuickApp-1.0
Cercando informazioni sulle dipendenze obsolete ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------Download: https://github.com/probonopd/QtQuickApp.git ...
--2019-07-14 16:12:44--  https://github.com/probonopd/QtQuickApp.git
Risoluzione di github.com... 140.82.118.3
Connessione a github.com|140.82.118.3|:443... connesso.
Richiesta HTTP inviata, attesa della risposta... 301 Moved Permanently
Posizione: https://github.com/probonopd/QtQuickApp [seguendo]
--2019-07-14 16:12:45--  https://github.com/probonopd/QtQuickApp
Riutilizzo della connessione esistente a github.com:443.
Richiesta HTTP inviata, attesa della risposta... 200 OK
Lunghezza: non specificata [text/html]
Salvataggio in: ‘/boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git’
     0K .                                                     1.34M=0.06s
2019-07-14 16:12:45 (1.34 MB/s) - ‘/boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git’ salvato [90094]
Validazione del checksum di QtQuickApp.git
Attenzione: ----- TEMPLATO DI CHECKSUM -----
Attenzione: CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"
Attenzione: -----------------------------
Errore: Nessun checksum trovato nella ricetta!

È sorta una domanda interessante. Se aggiungo un checksum nella ricetta, corrisponderà all'ultimo commit git per l'integrazione continua? (Lo sviluppatore conferma: «Non funzionerà. Le ricette sono progettate per essere relativamente stabili»).

Per divertimento si aggiunge alla ricetta:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Ancora non è soddisfacente:

~/QtQuickApp> haikuporter -S QtQuickApp
Controllo se ci sono informazioni sulle dipendenze da aggiornare ...
        aggiornando le informazioni sulle dipendenze di QtQuickApp-1.0
Cercando informazioni sulle dipendenze obsolete ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------
Salto il download della sorgente per QtQuickApp.git
Validando il checksum di QtQuickApp.git
Estraendo la sorgente di QtQuickApp.git
Errore: Tipo di archivio non riconosciuto nel file /boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git

Che diavolo fa? È un repository git, il codice è già lì, non c'è nulla da estrarre. Dalla mia prospettiva, lo strumento dovrebbe essere abbastanza intelligente da non cercare un estrattore, se ha il link url con GitHub.

Forse uri git:// funzionerà

SOURCE_URI="git://github.com/probonopd/QtQuickApp.git"

Ora si lamenta così:

Download: git://github.com/probonopd/QtQuickApp.git ...
Errore: Il download da fonti non sicure è disabilitato in haikuports.conf!

Hmm, perché è tutto così complicato, perché non può «funzionare semplicemente»? Alla fine, non è così raro raccogliere qualcosa da GitHub. È tutta un'altra storia per gli strumenti che funzionano immediatamente, senza necessità di configurazione, o come lo chiamo io, «inconvenienti».

Forse funzionerà così:

SOURCE_URI="git+https://github.com/probonopd/QtQuickApp.git"

No. Continuo a ricevere questo strano errore e faccio, come descritto qui

sed -i -e 's|#ALLOW_UNSAFE_SOURCES|ALLOW_UNSAFE_SOURCES|g' /boot/home/config/settings/haikuports.conf

Avanzo un po' più in là, ma perché mi sta urlando contro (GitHub non è sicuro!) e continua a provare a decomprimere qualcosa.

Secondo mr. waddlesplash:

Sì, la causa è stata il desiderio di controllare l'integrità dei dati ricevuti per la build. Una delle opzioni è controllare il checksum dell'archivio, ma si possono anche fare hash di singoli file, il che non verrà realizzato, poiché richiede molto più tempo. E questo è il motivo della "nonsicurezza" di git e di altri VCS. È probabile che sia sempre così, dato che creare un archivio su GitHub è abbastanza facile e spesso più veloce. E in futuro, forse, il messaggio di errore non sarà così allarmante... (non facciamo più merging di queste ricette in HaikuPorts).

~/QtQuickApp> haikuporter -S QtQuickApp
Controllo se è necessario aggiornare le informazioni sulle dipendenze ...
Cercando informazioni sulle dipendenze obsolete ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------Scaricando: git+https://github.com/probonopd/QtQuickApp.git ...
Attenzione: LE SOURCES INSICURE SONO MALE E NON DOVREBBERO ESSERE UTILIZZATE IN PRODUZIONE
Attenzione: SI PREGA DI PASSARE A UN DOWNLOAD DI ARCHIVIO STATICO CON CHECKSUM IL PRIMA POSSIBILE!
Clonazione nel repository vuoto '/boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git'...
Scompattando la sorgente di QtQuickApp.git
tar: /boot/home/haikuports/app-misc/QtQuickApp/work-1.0/sources/QtQuickApp-1.0: Impossibile aprire: Nessun file o directory di questo tipo
tar: L'errore non è recuperabile: uscita ora
Il comando 'git archive HEAD | tar -x -C "/boot/home/haikuports/app-misc/QtQuickApp/work-1.0/sources/QtQuickApp-1.0"' ha restituito uno stato di uscita diverso da zero 2

Per vecchia abitudine, vado a chiedere a delle brave persone sul canale #haiku nella rete irc.freenode.net. E dove sarei senza di loro? Dopo il suggerimento, ho capito che dovevo usare:

srcGitRev="d0769f53639eaffdcd070bddfb7113c04f2a0de8"
SOURCE_URI="https://github.com/probonopd/QtQuickApp/archive/$srcGitRev.tar.gz"
SOURCE_DIR="QtQuickApp-$srcGitRev"
CHECKSUM_SHA256="db8ab861cfec0ca201e9c7b6c0c9e5e828cb4e9e69d98e3714ce0369ba9d9522"

Bene, ora è chiaro cosa fa — scarica l'archivio con il codice sorgente di una certa revisione. È sciocco, dal mio punto di vista, e non esattamente ciò che volevo, ovvero — scaricare l'ultima revisione dal ramo master.

Uno degli sviluppatori ha spiegato così:

Abbiamo il nostro CI, quindi tutto ciò che viene inserito nel repository haikuports sarà impacchettato per tutti gli utenti, e non vogliamo correre il rischio di compilare e fornire 'tutte le ultime versioni in upstream'.

Capito! In ogni caso, è venuto fuori questo:

in attesa che il pacchetto di build QtQuickApp-1.0-1 venga attivato
in attesa che il pacchetto di build QtQuickApp-1.0-1 venga attivato
in attesa che il pacchetto di build QtQuickApp-1.0-1 venga attivato
in attesa che il pacchetto di build QtQuickApp-1.0-1 venga attivato
in attesa che il pacchetto di build QtQuickApp-1.0-1 venga attivato
(...)

Continua a ripetere così all'infinito. Sembrerebbe un errore (c'è già una segnalazione? Non l'ho trovata).

C haikuporter e repository haikuports non si sente il livello di 'funziona semplicemente', ma come sviluppatore, ci sono alcune cose nel lavorare con Haiku che mi piacciono. Per la maggior parte assomiglia a Open Build Service: un set di strumenti per costruire build Linux: estremamente potente, con un approccio sistematico, ma eccessivo per la mia piccola applicazione di 'hello world'.

Ancora una volta, secondo mr. waddlesplash:

In effetti, HaikuPorter è davvero rigoroso per impostazione predefinita (oltre ad avere la modalità lint e la modalità rigorosa che lo rendono ancora più severo!), ma solo perché crea pacchetti che funzioneranno, non semplicemente pacchetti casuali. Ecco perché si lamenta delle dipendenze non dichiarate, delle librerie non importate correttamente, delle versioni errate, e così via. L'obiettivo è catturare ogni singolo problema, comprese le questioni future, prima che l'utente ne sia a conoscenza (ecco perché non è stato possibile installare avrdude, in quanto nel ricetta era effettivamente presente una dipendenza). Le librerie non sono semplici pacchetti separati e nemmeno versioni specifiche di SO. HaikuPorter si assicura che tutto questo venga rispettato all'interno delle ricette per evitare errori durante l'esecuzione.

In linea di principio, questo livello di severità è giustificato nella creazione di un sistema operativo, ma mi sembra eccessivo per un'applicazione "hello world". Ho deciso di provare qualcos'altro.

Creazione di applicazioni nel formato hpkg, utilizzando il comando "package create"

Forse, questo una semplice istruzione potrebbe andar meglio?

mkdir -p apps/
cp QtQuickApp apps/cat >  .PackageInfo <<EOF
name QtQuickApp
version 1.0-1
architecture x86_64

summary "Demo QtQuick application"
description "QtQuickApp è un'applicazione demo di QtQuick per testare il porting e l'imballaggio su Haiku"

packager "probono"
vendor "probono"

copyrights "probono"
licenses "MIT"

provides {
  QtQuickApp = 1.0-1
}requires {
  qt5
}
EOFpackage create -b QtQuickApp.hpkg
package add QtQuickApp.hpkg apps# Vedi sotto se vuoi che anche l'applicazione
# appaia nel menu

Inaspettatamente veloce, inaspettatamente semplice, inaspettatamente efficace. Proprio come piace a me, straordinario!

Installazione — cosa e dove?

Ho spostato il file QtQuickApp.hpkg in ~/config/packages, utilizzando il gestore di file, dopo di che QtQuickApp è apparso magicamente in ~/config/apps.
Ancora una volta inaspettatamente veloce, semplice ed efficace. Straordinario, incredibile!

Ma… (come fare senza!)

L'applicazione è ancora assente nell'elenco delle applicazioni e in QuickLaunch. Penso di sapere già come risolvere il problema. Nel gestore di file sposto QtQuickApp.hpkg da ~/config/packages a /system/packages.

Niente da fare, è ancora assente. A quanto pare ho (beh, e le istruzioni) saltato qualcosa.

Esaminando la scheda "Contents" in HaikuDepot per alcune altre applicazioni, ho visto che ci sono file del tipo /data/mimedb/application/x-vnd... cosa ancora più notevole, /data/deskbar/menu/Applications/….

Beh, e cosa devo metterci dentro? Proviamo…

mkdir -p data/deskbar/menu/Applications/
( cd data/deskbar/menu/Applications ; ln -s ../../../../../apps/QtQuickApp . )
package add QtQuickApp.hpkg apps data

Sono abbastanza sicuro che questo trucco funzionerà, ma ho alcune domande: a cosa serve, perché è necessario? Secondo me, distrugge l'impressione generale che il sistema sia così raffinato.

Come ha spiegato mr. waddlesplash:

A volte ci sono applicazioni necessarie ad altre applicazioni, ma non nel menu. Ad esempio, LegacyPackageInstaller nel tuo screenshot, che gestisce archivi .pkg in formato BeOS. Vorremmo che gli utenti potessero installarli, ma la loro presenza nel menu porterebbe confusione.

Mi sembra che ci sia una soluzione più semplice, ad esempio Hidden=true nei file .desktop su Linux. Perché non rendere le informazioni 'nascoste' una risorsa e un attributo del file system?

Ciò che non è particolarmente raffinato è il nome (di un certo) programma che mostra il menu, deskbar, fissato nel percorso.

mr. waddlesplash поясняет по этому поводу:

"Deskbar" in questo caso deve essere inteso come un termine generale (un po' come "taskbar", che si riferisce sia a un'applicazione Windows che a un concetto generale). Dato che è questo deskbar, e non "Deskbar", può essere inteso in modo simile.

Il mio quinto giorno con Haiku: portiamo un po' di software.
2 «quasi identici» cataloghi con le loro applicazioni

Perché ci sono 2 cataloghi di applicazioni, e perché in uno c'è la mia QtQuickApplication e nell'altro no? (Non è un sistema unico, ma un secondo catalogo utente, che personalmente mi sembrerebbe chiaro).
Sono davvero confuso e penso che sia necessario uniformare questo.

commento di mr. waddlesplash

Nel catalogo Apps ci sono applicazioni non necessarie nel menu. Ma la situazione con il menu deve davvero migliorare, rendendolo più personalizzabile.

Richiesta, oppure questo non accadrà 😉

Mi sono chiesto: è davvero necessario posizionare le applicazioni in /system/apps, se per gli utenti è indesiderato vederle lì? Forse sarebbe meglio metterle in un altro posto dove l'utente non le incontrerà? Proprio come fatto in Mac OS X, dove il contenuto dei pacchetti .app, che non dovrebbe essere visibile all'utente in /Applications, è nascosto nelle profondità /System/Library/…«`.

Cosa dire delle dipendenze?

Penso che sia opportuno indicare in qualche modo le dipendenze, vero? Possiamo considerare Qt una parte obbligatoria dell'installazione di Haiku di default? No! Qt non è installato di default. Può il programma di costruzione del pacchetto determinare automaticamente le dipendenze controllando i file ELF? Mi è stato detto che HaikuPorter fa proprio così, mentre pacchetto no. Tutto perché è semplicemente un "costruttore di pacchetti" che da solo crea file hpkg.

Vale la pena rendere Haiku più sofisticato, aggiungendo una politica secondo cui un pacchetto non dovrebbe avere dipendenze da pacchetti non inclusi in haikuports? (Мне бы так хотелось, поскольку подобная политика значительно облегчает задачу — система смогла бы автоматически разрешить зависимости каждого пакета, загружаемого откуда угодно, без возни с дополнительными источниками пакетов).

mr. waddlesplash spiega:

Non ci piacerebbe limitare così tanto la libertà degli sviluppatori, poiché è evidente che se CompanyX decidesse di supportare un proprio set di software con dipendenze (e quindi un proprio repository) — avrebbero tutto il diritto di farlo.

In tal caso, forse sarebbe opportuno raccomandare di evitare ai pacchetti esterni dipendenze da qualsiasi cosa non inclusa in haikuports, tramite l'imballaggio completo di tutto il necessario con l'applicazione. Ma, penso che sia un argomento per un futuro articolo di questa serie. [L'autore allude a AppImage? — nota del traduttore]

Aggiunta dell'icona dell'applicazione

E se volessi aggiungere una delle eleganti icone incorporate alle risorse della mia nuova applicazione? Si tratta di un argomento affascinante, quindi sarà il tema principale del prossimo articolo.

Come organizzare una build continua delle applicazioni?

Immagina un progetto simile a Inkscape (sì, so che attualmente non è presente in Haiku, ma è utile per spiegarlo). Hanno un repository di codice sorgente. https://gitlab.com/inkscape/inkscape.
Ogni volta che qualcuno registra le proprie modifiche nel repository, viene avviato un processo di build, dopo di che le modifiche vengono automaticamente testate, compilate e l'applicazione viene pacchettizzata in vari formati, incluso AppImage per Linux (un pacchetto autonomo dell'applicazione che può essere caricato per test locali indipendentemente da ciò che può o non può essere installato nel sistema). [lo sapevo! — nota del traduttore]). Lo stesso avviene ad ogni richiesta di unione dei rami, quindi è possibile scaricare l'applicazione costruita dal codice proposto nella richiesta di unione ancora prima dell'unione.

Il mio quinto giorno con Haiku: portiamo un po' di software.
Le richieste di merge con stati di build e la possibilità di scaricare i binari costruiti in caso di build riuscita (contrassegnata in verde)

La build viene avviata in contenitori Docker. GitLab offre runner gratuiti su Linux, e penso sia possibile collegare runner propri (tra l'altro, non riesco a immaginare come questo possa funzionare per sistemi come Haiku, che so non avere Docker o un equivalente, ma anche FreeBSD non ha Docker, quindi questo problema non è unico per Haiku).

Idealmente, la build delle applicazioni per Haiku può essere effettuata all'interno di un contenitore Docker per Linux. In questo modo, la build per Haiku può essere integrata nei pipeline esistenti. Ci sono cross-compilatori? O è necessario emulare l'intero Haiku all'interno del contenitore Docker, utilizzando qualcosa come QEMU/KVM (a patto che funzioni all'interno di Docker)? Tra l'altro, molti progetti utilizzano principi simili. Ad esempio, Scribus lo fa — è già disponibile per Haiku. Arriverà un giorno in cui potrò inviare tali richieste di merge in altri progetti per aggiungere supporto per Haiku.

Uno degli sviluppatori spiega:

Per altri progetti che desiderano creare pacchetti in modo autonomo, è supportato il metodo CMake/CPack. Altri sistemi di build possono essere supportati se si chiama direttamente il programma di creazione del pacchetto, il che è utile se le persone sono interessate. L'esperienza dimostra: finora non c'è stato particolare interesse, quindi haikuporter ha funzionato come era comodo per noi, ma, alla fine, entrambi i metodi dovrebbero lavorare insieme. Dovremmo presentare un set di strumenti per la cross-compilazione di software da Linux o qualsiasi altro sistema operativo server (Haiku non è progettato per funzionare su server).

Applaudo in piedi. Gli utenti comuni di Linux si portano dietro tutto questo carico extra e il bagaglio aggiuntivo (sicurezza, controlli severi, ecc.) necessari per un sistema operativo server, non per uno personale. Pertanto, sono completamente d'accordo che la possibilità di creare applicazioni per Haiku su Linux sia la strada giusta.

Conclusione

Il porting delle applicazioni POSIX su Haiku è possibile, ma potrebbe richiedere più sforzi rispetto a una ricompilazione normale. Sicuramente mi sarei bloccato a lungo se non fosse stato per l'aiuto delle persone nel canale #haiku su irc.freenode.net. Tuttavia, anche loro non sempre riuscivano a vedere subito cosa non andasse.

Le applicazioni scritte in Qt sono un'eccezione leggera. Ho creato una semplice applicazione dimostrativa senza particolari problemi.

La creazione di pacchetti per applicazioni semplici è abbastanza facile, ma solo per quelle «rilasciate nel modo tradizionale», cioè che hanno archivi di codice sorgente versionati destinati a essere supportati in haikuports. Per la creazione continua (compilazione a ogni commit) con GitHub, le cose sembrano non essere così semplici. Qui Haiku si sente più simile a una distribuzione Linux che al risultato su Mac, dove premendo il pulsante 'Compila' in XCode si ottiene un pacchetto .app, pronto per essere inserito nell'immagine del disco .dmg, preparato per il caricamento sul mio sito.
La costruzione continua di applicazioni basate su un sistema operativo 'server', come Linux, potrebbe diventare possibile se ci sarà una domanda da parte degli sviluppatori, ma attualmente il progetto Haiku ha altre priorità più urgenti.

Provatelo voi stessi! Infatti, il progetto Haiku fornisce immagini da scaricare su DVD o USB, generate quotidianamente. Per installarlo, basta scaricare l'immagine e scriverla su una chiavetta USB usando Etcher

Avete domande? Vi invitiamo a unirvi al nostro canale Telegram in lingua russa.

Panoramica sugli errori: Come spararsi un colpo al piede in C e C++. Raccolta di ricette Haiku OS

Da autore traduzione: questo è il quinto articolo di un ciclo su Haiku.

Elenco degli articoli: Primo La seconda Terzo Quarto

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster