Moj peti dan sa Haikuom: portirajmo neke programe

Moj peti dan sa Haikuom: portirajmo neke programe

TL; DR: Novajlija je prvi put vidio Haiku, pokušavajući da prenese neke programe iz svijeta Linuxa.

Moj peti dan sa Haikuom: portirajmo neke programe
Moj prvi portirani Haiku program, upakovan u hpkg format

Nedavno Otkrio sam Haiku, iznenađujuće dobar operativni sistem za računare.
Danas ću naučiti kako da prenesem nove programe na ovaj operativni sistem. Glavni fokus je opis prvog iskustva prelaska na Haiku sa stanovišta Linux programera. Izvinjavam se za sve glupe greške koje sam napravio usput, jer nije prošlo ni sedmicu otkako sam prvi put preuzeo Haiku.

Želim da ostvarim tri cilja:

  • Port jednostavnu CLI aplikaciju
  • Port aplikaciju sa GUI na Qt
  • Zatim ih zapakirajte u hpkg format (pošto još uvijek razmišljam o prilagođavanju AppDir-a i AppImage-a za Haiku...)

Hajde da počnemo. U sekcijama dokumentaciju и razvoj, kao i u Wiki iz HaikuPortsa sam našao pravi pravac. Postoji čak i online PDF knjiga BeOS: Prenošenje Unix aplikacije.
467 stranica - a ovo je iz 1997! Strašno je pogledati unutra, ali nadam se najboljem. Reči programera su ohrabrujuće: „trebalo je dosta vremena jer BeOS nije bio kompatibilan sa POSIX-om“, ali Haiku je „većim delom“ već takav.

Portiranje jednostavne CLI aplikacije

Prva pomisao je bila portiranje aplikacije avrdude, ali, kako se ispostavilo, to je već uradio prije mnogo vremena.

Prvi pokušaj: ništa za gledati

Ono što ne mogu da razumem je to već Aplikacije su prenošene na Haiku više od 10 godina - uprkos činjenici da sam OS još nije ni verzija 1.0.

Drugi pokušaj: potrebno je prepisati

Pa ću iskoristiti ptouch-770, CLI za kontrolu Brother P-Touch 770 štampača koji koristim za štampanje naljepnica.
Na njemu štampam razne etikete, a možda ste to već vidjeli u prethodnom članku. Malo ranije sam napisao mali GUI program omotač u Python-u (pošto je u Gtk+, moraće da se prepiše, a ovo je dobar razlog za učenje).

Moj peti dan sa Haikuom: portirajmo neke programe
Brother štampač naljepnica P-Touch 770. Hoće li raditi s Haikuom?

Haiku menadžer paketa zna za biblioteke i komande, pa ako dobijem poruku "ne mogu pronaći libintl" prilikom pokretanja configure - Upravo sam lansirao pkgman install devel:libintl i traženi paket će biti pronađen. Isto tako pkgman install cmd:rsync. pa itd.

Osim kada ovo ne radi:

/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

Možda je udev previše zasnovan na Linuxu i stoga ne postoji za Haiku. Što znači da moram urediti izvorni kod koji pokušavam kompajlirati.
Eh, ne možeš da skočiš preko glave, a ne znam ni odakle da počnem.

Treći pokušaj

Bilo bi lijepo imati tmate za Haiku, onda bih dozvolio Haiku programerima da se povežu na moju terminalsku sesiju - u slučaju da nešto krene po zlu. Upute su prilično jednostavne:

./autogen.sh
./configure
make
make install

Izgleda dobro, pa zašto ga ne isprobati na Haikuu?

/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

U ovom koraku otvaram HaikuDepot i tražim curses.
Pronađeno je nešto što mi je dalo nagoveštaj za kompetentniji upit:

/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

Opet sam otišao u HaikuDepot i, naravno, našao devel:msgpack_c_cpp_devel. Koja su ovo čudna imena?

/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

U ovom koraku sam shvatio da prenošenje programa na Haiku zahteva mnogo više znanja nego što je potrebno za jednostavnu rekonstrukciju.
Razgovarao sam sa ljubaznim Haiku programerima, ispostavilo se da postoji greška u msgpack-u, i nakon nekoliko minuta vidim zakrpu u HaikuPorts-u. Vidim svojim očima kako je ispravljen paket ide ovamo (buildslave - virtuelne mašine).

Moj peti dan sa Haikuom: portirajmo neke programe
Izgradnja ispravljenog msgpack-a na buildmasteru

Između vremena šaljem zakrpu uzvodno da dodate podršku za Haiku u msgpack.

Pet minuta kasnije, ažurirani msgpack je već dostupan u Haikuu:

/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.

Neocekivano dobro. Jesam li to rekao?!

Vraćam se na prvobitni problem:

/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

Sada izgleda da msgpack nije kriv. komentarišem IMAXLABEL в tty.c tako:

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

Rezultat:

osdep-unknown.c: In function 'osdep_get_cwd':
osdep-unknown.c:32:19: warning: unused parameter 'fd' [-Wunused-parameter]
 osdep_get_cwd(int fd)
               ~~~~^~
make: *** No rule to make target 'compat/forkpty-unknown.c', needed by 'compat/forkpty-unknown.o'.  Stop.

Pa, evo nas opet... Usput:

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

gospodin. waddlesplash govori ti gdje da kopaš:

/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.

Ovdje sam objavio config.log.

Objasnili su mi da postoji još nešto u libnetwork-u pored libresolva na Haikuu. Očigledno kod treba dodatno uređivati. Treba razmisliti…

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

Vječno pitanje: šta se dešava?

/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

Ista stvar, samo u profilu. Googled and našao ovo. Ako dodate -lssp "ponekad" pomaže, pokušavam:

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

Vau! Počinje! Ali…

[tmate] ssh.tmate.io lookup failure. Retrying in 2 seconds (non-recoverable failure in name resolution)

Pokušaću da otklonim greške fajl ovdje:

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

“Loš port ID” je već kao vizit karta haiku. Možda neko ima ideju šta nije u redu i kako to popraviti? Ako je tako, ažurirat ću članak. Link na GitHub.

Portiranje GUI aplikacije na Qt.

Ja biram jednostavnu QML aplikaciju.

/> 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!

Zaista jednostavno. Manje od minute!

Pakovanje aplikacija u hpkg koristeći haikuporter i haikuports.

Od čega da počnem? Ne postoji jednostavna dokumentacija, odem na #haiku kanal na irc.freenode.net i čujem:

  • tim package - način na niskom nivou za kreiranje paketa. Uglavnom, PackageInfo joj je dovoljan, kao što je opisano u odjeljku "Pretvaranje u odgovarajući .hpkg paket"
  • Moram nešto da uradim je
  • Može koristiti hpkg-creator (sruši mi se, prijavljivanje grešaka)

Nije jasno šta da se radi. Pretpostavljam da mi treba vodič za početnike u stilu Hello World, idealno video. Bilo bi lepo imati i zgodan uvod u HaikuPorter, kao što je to učinjeno u GNU hello.

Citam sledece:

haikuporter je alat za kreiranje zajedničkih paketskih projekata za Haiku. Koristi HaikuPorts spremište kao osnovu za sve pakete. Haikuporter recepti se koriste za kreiranje paketa.

Osim toga, saznajem da:

Nema potrebe za pohranjivanjem recepata u skladištu HaikuPorts. Možete napraviti još jedno spremište, staviti recepte u njega, a zatim uputiti haikuporter na njega.

Baš ono što mi treba - ako ne tražim način da javno objavim paket. Ali ovo je tema za drugi post.

Instaliranje haikuportera i haikuporta

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/ # make it runnable from anywhere
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

Pisanje recepta

SUMMARY="Demo QtQuick application"
DESCRIPTION="QtQuickApp is a demo QtQuick application for testing Haiku porting and packaging"
HOMEPAGE="https://github.com/probonopd/QtQuickApp"
COPYRIGHT="None"
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
}

Sastavljanje recepta

Sačuvam fajl pod imenom QtQuickApp-1.0.recipe, nakon čega pokrećem aikuporter -S ./QuickApp-1.0.recipe. Zavisnosti se provjeravaju za sve pakete u spremištu haikuports, što traje neko vrijeme. Idem po kafu.

Zašto bi, zaboga, ova provjera bila obavljena na mojoj lokalnoj mašini, a ne centralno na serveru jednom za svakoga?

Prema riječima mr. waddlesplash:

Sa takvim da možete prepisati bilo koju datoteku u spremištu 😉 Ovo možete malo optimizirati, računajući potrebne informacije kada je potrebno, jer su posljednje promjene koje su napravljene prilično rijetke.

~/QtQuickApp> haikuporter  QtQuickApp-1.0.recipe
Checking if any dependency-infos need to be updated ...
Looking for stale dependency-infos ...
Error: QtQuickApp not found in repository

Ispostavilo se da ne postoji obična datoteka recepta koja sadrži izvorni kod vaše aplikacije. Morate ga čuvati u spremištu u HaikuPorts formatu.

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

Ova činjenica čini montažu glomaznijom. Ne sviđa mi se to posebno, ali mislim da je neophodno kako bi se na kraju sav softver otvorenog koda pojavio u HaikuPortovima.

dobijam sledeće:

~/QtQuickApp> haikuporter -S QtQuickApp-1.0.recipe
Checking if any dependency-infos need to be updated ...
        updating dependency infos of QtQuickApp-1.0
Looking for stale dependency-infos ...
Error: QtQuickApp-1.0.recipe not found in tree.

Sta nije u redu? Nakon čitanja irc-a radim:

~/QtQuickApp> haikuporter -S QtQuickApp
Checking if any dependency-infos need to be updated ...
        updating dependency infos of QtQuickApp-1.0
Looking for stale dependency-infos ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------Downloading: https://github.com/probonopd/QtQuickApp.git ...
--2019-07-14 16:12:44--  https://github.com/probonopd/QtQuickApp.git
Resolving github.com... 140.82.118.3
Connecting to github.com|140.82.118.3|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://github.com/probonopd/QtQuickApp [following]
--2019-07-14 16:12:45--  https://github.com/probonopd/QtQuickApp
Reusing existing connection to github.com:443.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘/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’ saved [90094]
Validating checksum of QtQuickApp.git
Warning: ----- CHECKSUM TEMPLATE -----
Warning: CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"
Warning: -----------------------------
Error: No checksum found in recipe!

Pojavilo se zanimljivo pitanje. Ako dodam kontrolnu sumu receptu - da li će se podudarati s najnovijim git urezivanjem za kontinuiranu integraciju? (Programer potvrđuje: "Neće raditi. Recepti su dizajnirani da budu relativno stabilni.")

Za zabavu dodajte u recept:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Još uvijek nisam zadovoljan:

~/QtQuickApp> haikuporter -S QtQuickApp
Checking if any dependency-infos need to be updated ...
        updating dependency infos of QtQuickApp-1.0
Looking for stale dependency-infos ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------
Skipping download of source for QtQuickApp.git
Validating checksum of QtQuickApp.git
Unpacking source of QtQuickApp.git
Error: Unrecognized archive type in file /boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git

Šta on radi? Na kraju krajeva, ovo je git repozitorij, kod je već tamo direktno, nema se šta raspakovati. Sa moje tačke gledišta, alat bi trebao biti dovoljno pametan da ne traži raspakivač ako je iznad GitHub URL-a.

Možda će uri git:// raditi

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

Sad se žali ovako:

Downloading: git://github.com/probonopd/QtQuickApp.git ...
Error: Downloading from unsafe sources is disabled in haikuports.conf!

Hm, zašto je sve tako komplikovano, zašto ne možeš "samo da radiš"? Uostalom, nije tako neuobičajeno napraviti nešto od GitHuba. Bilo da se radi o alatima koji rade odmah, bez potrebe za podešavanjem, ili kako ja to zovem "mučenje".

Možda će funkcionisati ovako:

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

Ne. I dalje dobijam ovu čudnu grešku i radim, kako je ovdje opisano

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

Idem malo dalje, ali zašto vrišti na mene (GitHub nije siguran!) i još uvijek pokušava nešto raspakirati.

Prema gospodin. waddlesplash:

Pa, da, razlog je bila želja da se provjeri integritet podataka primljenih na sklapanje. Jedna od opcija je provjera kontrolne sume arhive, ali možete, naravno, heširati pojedinačne fajlove, što neće biti implementirano, jer potrebno je mnogo duže. Posljedica ovoga je "nesigurnost" git-a i drugih VCS-ova. To će najvjerovatnije uvijek biti slučaj, jer je kreiranje arhive na GitHubu prilično jednostavno i često brže. Pa, u budućnosti, možda poruka o grešci neće biti tako blistava... (više ne spajamo takve recepte u HaikuPorts).

~/QtQuickApp> haikuporter -S QtQuickApp
Checking if any dependency-infos need to be updated ...
Looking for stale dependency-infos ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------Downloading: git+https://github.com/probonopd/QtQuickApp.git ...
Warning: UNSAFE SOURCES ARE BAD AND SHOULD NOT BE USED IN PRODUCTION
Warning: PLEASE MOVE TO A STATIC ARCHIVE DOWNLOAD WITH CHECKSUM ASAP!
Cloning into bare repository '/boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git'...
Unpacking source of QtQuickApp.git
tar: /boot/home/haikuports/app-misc/QtQuickApp/work-1.0/sources/QtQuickApp-1.0: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now
Command 'git archive HEAD | tar -x -C "/boot/home/haikuports/app-misc/QtQuickApp/work-1.0/sources/QtQuickApp-1.0"' returned non-zero exit status 2

Po staroj navici idem da pitam dobre ljude na #haiku kanalu na mreži irc.freenode.net. A gde bih ja bio bez njih? Nakon nagoveštaja, shvatio sam da treba da koristim:

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

U redu, postalo je jasno šta radi - preuzima arhivu sa izvornim kodom određene revizije. Glupo je, sa moje tačke gledišta, i nije baš ono što sam želeo, naime, da preuzmem najnoviju reviziju sa master grane.

Jedan od programera je to objasnio na ovaj način:

Imamo vlastiti CI, tako da će sve što se nalazi u haikuports repozitoriju biti upakovano za sve korisnike, i ne želimo riskirati prikupljanje i isporuku „sve u najnovijoj verziji uzvodno“.

Razumeo! U svakom slučaju, desilo se ovo:

waiting for build package QtQuickApp-1.0-1 to be activated
waiting for build package QtQuickApp-1.0-1 to be activated
waiting for build package QtQuickApp-1.0-1 to be activated
waiting for build package QtQuickApp-1.0-1 to be activated
waiting for build package QtQuickApp-1.0-1 to be activated
(...)

To se ponavlja do beskonačnosti. Očigledno je ovo greška (da li postoji aplikacija? Nisam je mogao pronaći).

С haikuporter i repozitorijum haikuports Nema osećaj "samo radi", ali kao programer, neke stvari mi se sviđaju u radu sa Haikuom. Uglavnom je sličan Open Build Service, skupu alata za pravljenje Linux buildova: izuzetno moćan, sa sistematičnim pristupom, ali previše za moju malu "zdravo svijet" aplikaciju.

Opet, prema riječima mr. waddlesplash:

Zaista, HaikuPorter je prilično strog prema zadanim postavkama (plus postoji i lint mod kao i strogi način da ga učini još strožijim!), ali samo zato što kreira pakete koji će raditi, a ne samo kreirati pakete. Zato se žali na nedeklarisane zavisnosti, biblioteke koje nisu pravilno uvezene, netačne verzije itd. Cilj je uhvatiti sve probleme, uključujući i buduće, prije nego što korisnik sazna za to (zbog toga nije bilo moguće instalirati avrdude, jer je ovisnost zapravo navedena u receptu). Biblioteke nisu samo pojedinačni paketi ili čak specifične SO verzije. HaikuPorter osigurava da se sve ovo poštuje u samim receptima kako bi se izbjegle greške tokom izvršavanja.

U principu, ovaj nivo strogosti je opravdan pri kreiranju operativnog sistema, ali mi se čini nepotrebnim za aplikaciju „zdravo svet“. Odlučio sam da probam nešto drugo.

Izrada aplikacija u hpkg formatu pomoću naredbe “package create”.

Možda, ovo Hoće li jednostavne upute bolje raditi za mene?

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

summary "Demo QtQuick application"
description "QtQuickApp is a demo QtQuick application for testing Haiku porting and packaging"

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# See below if you also want the application
# to appear in the menu

Neočekivano brzo, neočekivano jednostavno, neočekivano efikasno. Tačno kako mi se sviđa, neverovatno!

Instalacija - šta i gdje?

Premještena datoteka QtQuickApp.hpkg u ~/config/packageskoristeći upravitelj datoteka, nakon čega se QtQuickApp magično pojavio ~/config/apps.
Opet, neočekivano brzo, jednostavno i efikasno. Neverovatno, neverovatno!

Ali... (gdje bismo bili bez njih!)

Aplikacija još uvijek nedostaje na listi menija aplikacija i QuickLaunch-u. Mislim da već znam kako to popraviti. U upravitelju datoteka premjestim QtQuickApp.hpkg iz ~/config/packages u /system/packages.

Ne, još uvijek nedostaje. Očigledno sam (pa i uputstva) nešto propustio.

Pogledavši karticu "Sadržaj" u HaikuDepotu za neke druge aplikacije, vidio sam da postoje fajlovi poput /data/mimedb/application/x-vnd... ono što je još upečatljivije je /data/deskbar/menu/Applications/….

Pa, šta da stavim tamo? hajde...

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

Sasvim sam siguran da će ovaj trik uspjeti, ali ostaju pitanja: zašto je to potrebno, čemu služi? Mislim da ovo kvari ukupni utisak da je sistem tako sofisticiran.

Kako je objasnio g. waddlesplash:

Ponekad postoje aplikacije koje su potrebne drugim aplikacijama, ali nisu u meniju. Na primer, LegacyPackageInstaller na snimku ekrana, obrađuje .pkg arhive u BeOS formatu. Volio bih da ih korisnici instaliraju, ali njihovo prisustvo u meniju će dovesti do zabune.

Iz nekog razloga mi se čini da postoji jednostavnije rješenje npr Hidden=true u fajlovima .desktop na Linuxu. Zašto ne biste "skrivene" informacije učinili resursom i atributom sistema datoteka?

Ono što posebno nije suptilno je naziv (neke) aplikacije koja prikazuje meni, deskbar, čvrsto vezan uz put.

gospodin. waddlesplash objašnjava ovo:

„Deskbar“ u ovom slučaju treba shvatiti kao neku vrstu opšteg pojma (na sličan način kao i „traka zadataka“, koja se odnosi i na Windows aplikaciju i na opšti koncept). Pa, od ovoga deskbar, a ne „Deskbar“, ovo se takođe može shvatiti na sličan način.

Moj peti dan sa Haikuom: portirajmo neke programe
2 "gotovo identična" direktorija sa aplikacijama u njima

Zašto postoje 2 direktorija sa aplikacijama, i zašto je moja QtQuickApplication u jednom, a ne u drugom? (Uostalom, ovo nije jedan sistemski, već drugi korisnički, što bi meni lično bilo razumljivo).
Zaista sam zbunjen i mislim da bi ovo trebalo biti ujedinjeno.

komentar mr. waddlesplash

Katalog aplikacija sadrži aplikacije koje nisu potrebne u meniju. Ali situaciju sa menijem zaista treba poboljšati, učiniti ga prilagodljivijim.

Prijavite se, ili se to neće desiti 😉

Pitao sam se: da li je zaista potrebno ugostiti aplikacije /system/apps, ako ih korisnici vide tamo, to je nepoželjno. Možda bi bilo bolje da ih postavite na neko drugo mjesto gdje ih korisnik neće susresti? Baš kao što je to učinjeno u Mac OS X-u, gdje se nalazi sadržaj paketa .app, koji ne bi trebao biti vidljiv korisniku u /Applications, skrivajući se u dubinama /Sistema/Biblioteke/…“`.

Šta je sa zavisnostima?

Mislim da vrijedi nekako specificirati ovisnosti, zar ne? Može li se Qt podrazumevano smatrati obaveznim delom Haiku instalacije? Ne! Qt nije instaliran po defaultu. Može li graditelj paketa automatski otkriti zavisnosti provjeravanjem ELF datoteka? Rečeno mi je da HaikuPorter to zapravo radi, ali package br. To je zato što je to samo "paket builder" koji samo kreira fajlove hpkg.

Da li Haiku treba učiniti sofisticiranijim dodavanjem politike da paket ne treba da zavisi od paketa izvan Haikua? haikuports? (Volio bih, jer bi takva politika mnogo olakšala stvari – sistem bi mogao automatski riješiti ovisnosti svakog paketa preuzetog s bilo kojeg mjesta, bez petljanja s dodatnim izvorima paketa.)

gospodin. waddlesplash objašnjava:

Ne bismo željeli toliko ograničavati slobodu programera, jer je očigledno da ako CompanyX želi podržati svoj vlastiti set softvera s ovisnostima (a samim tim i spremište), to će učiniti potpuno slobodno.

U tom slučaju, možda bi bilo vrijedno preporučiti da paketi trećih strana izbjegavaju ovisnosti o bilo čemu što nije uključeno u haikuportove tako što će u potpunosti pakirati sve što je potrebno uz aplikaciju. Ali mislim da je ovo tema za budući članak u ovoj seriji. [Da li autor ide prema AppImageu? — pribl. prevodilac]

Dodavanje ikone aplikacije

Šta ako želim da dodam jednu od urednih ugrađenih ikona u resurse moje novokreirane aplikacije? Ispostavilo se da je ovo nevjerovatna tema, pa će to biti osnova za sljedeći članak.

Kako organizirati kontinuiranu izradu aplikacija?

Zamislite projekat kao što je Inkscape (da, svjestan sam da još nije dostupan u Haiku-u, ali je zgodno prikazati na njemu). Imaju spremište izvornog koda https://gitlab.com/inkscape/inkscape.
Svaki put kada neko urezuje svoje promjene u spremište, pokreću se build pipelines, nakon čega se promjene automatski testiraju, izgrađuju i aplikacija pakira u različite pakete, uključujući AppImage za Linux (samostalni paket aplikacije koji se može preuzeti za lokalno testiranje bez obzira na šta može ili ne mora biti instalirano na sistemu [Znao sam! — pribl. prevodilac]). Ista stvar se dešava sa svakim zahtjevom za spajanje grane, tako da možete preuzeti aplikaciju izgrađenu iz koda predloženog u zahtjevu za spajanje prije spajanja.

Moj peti dan sa Haikuom: portirajmo neke programe
Spajanje zahtjeva sa statusima izgradnje i mogućnošću preuzimanja kompajliranih binarnih datoteka ako je izgradnja uspješna (označeno zelenom bojom)

Izgradnja se izvodi u Docker kontejnerima. GitLab nudi besplatne trkače na Linuxu, i mislim da bi bilo moguće uključiti vaše vlastite trkače (usput, ne vidim kako bi ovo funkcioniralo za sisteme poput Haikua, za koje znam da nemaju Docker ili ekvivalent, ali takođe za FreeBSD ne postoji Docker, tako da ovaj problem nije jedinstven za Haiku).

U idealnom slučaju, Haiku aplikacije mogu biti izgrađene unutar Docker kontejnera za Linux. U ovoj situaciji, sklop za Haiku se može uvesti u postojeće cevovode. Postoje li unakrsni kompajleri? Ili bih trebao emulirati cijeli Haiku unutar Docker kontejnera koristeći nešto poput QEMU/KVM (pod pretpostavkom da će tako funkcionirati unutar Docker-a)? Usput, mnogi projekti koriste slične principe. Na primjer, Scribus to radi - već je dostupan za Haiku. Jednog dana će doći dan kada ću moći poslati takve Povucite zahtjeve za druge projekte da dodate podršku za Haiku.

Jedan od programera objašnjava:

Za druge projekte koji žele sami kreirati pakete, podržana je obična metoda CMake/CPack. Drugi sistemi izgradnje mogu se podržati direktnim pozivanjem programa za izgradnju paketa, što je u redu ako su ljudi zainteresovani za to. Iskustvo pokazuje: do sada nije bilo velikog interesovanja, tako da nam je haikuporter funkcionisao onako kako nam je zgodno, ali, na kraju krajeva, obe metode treba da rade zajedno. Trebalo bi da uvedemo skup alata za unakrsnu izgradnju softvera iz Linuxa ili bilo kog drugog serverskog operativnog sistema (Haiku nije dizajniran za rad na serverima).

Dajem ovacije. Redovni korisnici Linuxa nose sav taj dodatni teret i dodatni prtljag (sigurnost, stroga kontrola itd.) koji je neophodan za serverski operativni sistem, ali ne i za lični. Dakle, potpuno se slažem da je mogućnost izrade Haiku aplikacija na Linuxu pravi način.

zaključak

Prenošenje POSIX aplikacija na Haiku je moguće, ali može biti skuplje od tipične rekonstrukcije. Definitivno bih se dugo zaglavio s ovim da nije bilo pomoći ljudi sa #haiku kanala na mreži irc.freenode.net. Ali čak ni oni nisu uvek odmah videli šta nije u redu.

Aplikacije napisane u Qt-u su lak izuzetak. Sastavio sam jednostavnu demo aplikaciju bez ikakvih problema.

Izrada paketa za jednostavne aplikacije je također prilično jednostavna, ali samo za one „tradicionalno objavljene“, tj. posjedovanje verzioniranih arhiva izvornog koda namijenjene podršci u haikuportovima. Za kontinuiranu gradnju (izrada za svaku urezivanje promjena) sa GitHub-om, sve izgleda nije tako jednostavno. Ovdje Haiku više liči na distribuciju Linuxa nego kao rezultat na Macu, gdje kada kliknete na dugme “Build” u XCodeu dobijate paket .app, spreman za umetanje u sliku diska .dmg, pripremljen za preuzimanje na mojoj web stranici.
Kontinuirana izrada aplikacija baziranih na „serverskom“ operativnom sistemu, na primjer, Linuxu, najvjerovatnije će postati moguća ako postoji potražnja programera, ali u ovom trenutku Haiku projekat ima druge, hitnije zadatke.

Probajte sami! Na kraju krajeva, Haiku projekat obezbeđuje slike za pokretanje sa DVD-a ili USB-a, generisane ежедневно. Da biste instalirali, samo preuzmite sliku i zapišite je na fleš disk pomoću Etcher

Imate bilo kakvih pitanja? Pozivamo vas na rusko govorno područje telegram kanal.

Pregled grešaka: Kako pucati sebi u nogu u C i C++. Haiku OS zbirka recepata

od autor prevod: ovo je peti članak u nizu o haikuu.

Spisak članaka: Prvi Drugi Treći Četvrto

izvor: www.habr.com

Dodajte komentar