Minu viies päev Haiku's: portime natuke programmi.

Minu viies päev Haiku's: portime natuke programmi.

TL;DR: Algaja nägi Haiku esmakordselt ja proovib portida mõned programmide Linuxi maailmast.

Minu viies päev Haiku's: portime natuke programmi.
Minu esimene Haiku jaoks portitud programm, pakitud selle hpkg formaati.

Hiljuti Avastasin Haiku, üllatavalt hea operatsioonisüsteem PC-dele.
Täna hakkan õppima uusi programme sellele operatsioonisüsteemile portima. Põhitähelepanu on esmakogemuse kirjeldamine Haiku'sse üleminekul Linuxi arendaja vaatenurgast. Vabandan rumalate vigade eest, mis protsessi käigus tekkisid, sest alates esmakordsest Haiku laadimisest ei ole möödas isegi nädal.

Soovin saavutada kolme eesmärki:

  • Portida lihtne CLI rakendus.
  • Portida GUI rakendus Qt-l.
  • Pakendada need hiljem hpkg formaati (kuna mõtlen endiselt AppDir ja AppImage kohandamisele Haiku jaoks…)

Hakkame pihta. Jaotistes dokumentatsioon ja arendus, samuti wiki haikuPorts leidsin vajaliku suuna. On isegi olemas online PDF raamat. BeOS: Unix'i rakenduse portimine..
467 lehekülge — ja see on alates 1997. aastast! Sisse vaatamine on hirmutav, kuid loodan parimat. Lohutavad on arendaja sõnad: „kestab kaua, kuna BeOS ei olnud POSIX-ühilduv“, aga Haiku on „enamasti“ juba selline.

Lihtsa CLI rakenduse portimine.

Esimene mõte oli rakenduse portimine avrdude, kuid nagu selgus, on see juba tegi ammu tehtud.

Esimene katse: pole midagi vaadata

Mida ma tõeliselt aru ei saa, on see, et juba üle 10 aasta on rakendusi portitud Haiku jaoks — arvestades, et operatsioonisüsteemil pole isegi versiooni 1.0.

Teine katse: tuleb ümber kirjutada

Nii et ma kasutan ptouch-770, CLI, et juhtida printerit Brother P-Touch 770, millel printin etikette.
Prindin sellel erinevaid etikette ning võite seda juba varasemas artiklis näha. Veidi varem kirjutasin väikese programmika wrapper'i GUI-s Pythonis (kuna see on Gtk+ — tuleb ümber kirjutada, mis on hea põhjus õppida).

Minu viies päev Haiku's: portime natuke programmi.
Printer Brother P-Touch 770. Kas see töötab Haiku all?

Haiku paketihaldur tunneb raamatukogusid ja käske, seega kui ma saan sõnumi «can’t find libintl» käivitamisel configure — lihtsalt käivitan pkgman install devel:libintl ja vajalik pakk lepitakse leidma. Samamoodi pkgman install cmd:rsync. No, ja nii edasi.

Välja arvatud juhtudel, kui see ei tööta:

/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

Võib-olla on udev liiga „linuxelik“, seega ei eksisteeri see Haiku jaoks. Mis tähendab vajadust muuta lähtekoodi, mida ma üritan kompileerida.
Kahjuks ei saa ma üle oma pea hüpata, ja ma ei tea isegi, kust alustada.

Kolmas katse

Oleks tore omada tmate Haiku jaoks, siis lubaksin Haiku arendajatel minu terminali sessiooniga ühendada – juhuks, kui midagi läheb valesti. Juhised on piisavalt lihtsad:

./autogen.sh
./configure
make
make install

Näeb hea välja, miks mitte proovida seda Haikus?

/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

Selles etapis avan HaikuDepot'i ja otsin curses.
Midagi leidsin, mis andis mulle vihje, kuidas paremini küsida:

/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

Läksin uuesti HaikuDepot'i ja loomulikult leidsin devel:msgpack_c_cpp_devel. Mis kummalised nimed?

/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

Selles etapis mõistsin, et programmi viimise Haikusse nõuab oluliselt rohkem teadmisi, kui lihtsalt uuesti kompileerimist.
Rääkisin sõbralike Haiku arendajatega, selgus, et msgpackis on viga, ja mõne minuti pärast näen patch'i HaikuPortsis. Näen silmaga, kuidas parendatud pakett siin kokku pannakse (buildslave – virtuaalmasinad).

Minu viies päev Haiku's: portime natuke programmi.
Parendatud msgpacki ehitamine buildmasteril

Tegelen samal ajal patch'i saatmisega ülespoole msgpacki Haiku toe lisamiseks.

Viie minuti pärast on uuendatud msgpack juba Haikus saadaval:

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

Ootamatult hea. Kas ma ütlesin seda?!

Tulen tagasi algse ülesande juurde:

/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

Praegu tundub, et msgpack ei ole süüdi. Kommenteerin IMAXLABEL ühes tty.c nii:

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

Tulemus:

osdep-unknown.c: Funktsioonis 'osdep_get_cwd':
osdep-unknown.c:32:19: hoiatus: kasutamata parameeter 'fd' [-Wunused-parameter]
 osdep_get_cwd(int fd)
               ~~~~^~
make: *** Sihtmärk 'compat/forkpty-unknown.c' ei ole reeglit teha, vajalik 'compat/forkpty-unknown.o' jaoks. Peatu.

Noh, jälle… Muide:

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

mr. waddlesplash soovitab, kuhu kaevata:

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

Siin olen jaganud config.log.

Mulle öeldi, et libresolv'i kohta Haikus on midagi veel libnetwork'is. Tundub, et koodi tuleb veel parandada. Tuleb mõelda...

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

Igavene küsimus: mis siis toimub.

/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

Sama, ainult profiilis. Googeldasin ja leidsin selle. Kui lisada -lssp „mõnikord” aitab, proovin:

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

Vau! See käivitub! Aga…

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

Proovin siluda, fail on siin:

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

„Bad port ID” — see juba nagu visiitkaart haiku. Äkki keegi teab, mis valesti on ja kuidas seda parandada? Kui midagi, uuendan artiklit. Link GitHub.

GUI rakenduse portimine Qt-le.

Valin lihtsa QML rakenduse.

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

Tõeliselt lihtne. Vähem kui minut!

Rakenduste pakkimine hpkg-s kasutades haikuporteri ja haikuports'i.

Kust alustada? Pole kõige lihtsamat dokumentatsiooni, lähen kanali #haiku juurde irc.freenode.net-s ja kuulen:

  • Meeskond package — madalast tasemest pakettide loomise meetod. Peamiselt piisab PackageInfo'st, nagu on kirjeldatud jaotises „Kuidas muuta see õigeks .hpkg paketiks“
  • Pean midagi tegema sellist
  • Soovitatakse kasutada hpkg-creator (mul kukub see kokku, veateade)

Ei ole selge, mida teha. Arvan, et mul on vaja algajatele mõeldud juhendit stiilis „Tere, maailm!“, ideaaljuhul videot. Hea oleks ka saada mugav sissejuhatus HaikuPorterisse, nagu GNU hello puhul.

Lugen järgmise:

haikuporter see on tööriist Haiku üldiste pakettide projektide loomiseks. See kasutab kõigi pakettide aluseks olevana HaikuPorts'i repositooriumi. Pakettide loomiseks kasutatakse haikuporteri retsepte.

Lisaks saan teada, et:

Ei ole vaja hoida retsepte HaikuPorts'i ladustamisruumis. Saab teha veel ühe repositooriumi, panna sinna retseptid ja seejärel suunata haikuporter sellele.

Just see, mida ma vajan — kui mitte otsida viisi paketi avalikuks jagamiseks. Kuid see on teema teiseks postituseks.

haikuporter ja haikuportsi installimine

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/ # tee see käivitatav igal pool
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

Retsepti kirjutamine

SUMMARY="Demo QtQuick rakendus"
DESCRIPTION="QtQuickApp on demo QtQuick rakendus Haiku portimise ja paketihalduse testimiseks"
HOMEPAGE="https://github.com/probonopd/QtQuickApp"
COPYRIGHT="Puudub"
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
}

Retsepti koostamine

Salvestan faili nimega QtQuickApp-1.0.recipe, pärast mida käivitan haikuporter -S ./QuickApp-1.0.recipe. Kontrollitakse sõltuvusi kõigi pakettide jaoks hoidlas haikuports, mis võtab aega. Lähen kohe kohvi jooma.

Ja miks peaks see kontroll toimuma minu lokaalses masinas, mitte tsentraliseeritult serveris ühe korra kõigi jaoks?

Kohas mr. waddlesplash:

Nii, et igat faili repos saab kirjutada. 😉 Seda saaks veidi optimeerida, arvutades vajalikku teavet siis, kui on vaja, kuna viimased tehtud muudatused on piisavalt harvad.

~/QtQuickApp> haikuporter  QtQuickApp-1.0.recipe
Kontrollin, kas sõltuvusinfoid tuleb värskendada ...
Otsin aegunud sõltuvusinfot ...
Viga: QtQuickApp ei leitud hoidlast

Tundub, et tavapärast retseptifaili, kus on teie rakenduse lähtekood, ei eksisteeri. Peate selle hoidma HaikuPorts formaadis hoidlas.

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

See fakt muudab kogumise keerukamaks. Mulle see ei meeldi, kuid arvan, et see on vajalik, et lõpuks kõik avatud lähtekoodiga tarkvara HaikuPortsis ilmuks.

Saan järgmise:

~/QtQuickApp> haikuporter -S QtQuickApp-1.0.recipe
Kontrollin, kas sõltuvusinfoid tuleb värskendada ...
        värskendan QtQuickApp-1.0 sõltuvusinfot
Otsin aegunud sõltuvusinfot ...
Viga: QtQuickApp-1.0.recipe ei leitud puust.

Mis on valesti? Pärast irc lugemist teen:

~/QtQuickApp> haikuporter -S QtQuickApp
Kontrollitakse, kas sõltuvuse teavet tuleb uuendada ...
        uuendatakse QtQuickApp-1.0 sõltuvuse teavet
Otsin vananenud sõltuvuse teavet ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------Laadin alla: 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... ühendatud.
HTTP päring saadetud, oodatakse vastust... 301 Liigutatud Permanently
Asukoht: https://github.com/probonopd/QtQuickApp [järgimine]
--2019-07-14 16:12:45--  https://github.com/probonopd/QtQuickApp
Uuendatakse olemasolevat ühendust github.com:443.
HTTP päring saadetud, oodatakse vastust... 200 OK
Pikkus: määramata [text/html]
Salvestamine: ‘/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’ salvestatud [90094]
Kontrollin QtQuickApp.git kontrollsummat
Hoiatus: ----- KONTROLLSUMMA MALLOON -----
Hoiatus: CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"
Hoiatus: -----------------------------
Viga: Retseptis ei leitud kontrollsummat!

Tekkis huvitav küsimus. Kui ma lisan retseptile kontrollsummat — kas see vastab viimasele git commit'ile pideva integreerimise jaoks? (Arendaja kinnitab: „Midagi välja ei tule. Retseptid on loodud olema suhteliselt stabiilsed“).

Nali töö jaoks lisavad retsepti:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Endiselt ei rahulda:

~/QtQuickApp> haikuporter -S QtQuickApp
Kontrollin, kas on vaja uuendada sõltuvuste teavet ...
        värskendatakse QtQuickApp-1.0 sõltuvuste teavet
Otsin aegunud sõltuvuste teavet ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------
Kipub QtQuickApp.git allika allalaadimise vahele jätma
Kontrollin QtQuickApp.git kontrollsummat
Pakkimine QtQuickApp.git allika jaoks
Viga: Tuvastamata arhiivitüüp failis /boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git

Miks ta nii käitub? See on ju git-repositsioon, kood on seal juba otse, midagi ei ole pakendada. Minu arvates peaks tööriist olema piisavalt nutikas, et mitte otsida lahtipakkijat, kui selle URLs on GitHub.

Võib-olla toimib uri git://

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

Nüüd kaebab see nii:

Laadimine: git://github.com/probonopd/QtQuickApp.git ...
Viga: Allalaadimine ebausaldusväärsetest allikatest on haikuports.conf-is keelatud!

Hmm, miks on kõik nii keeruline, miks ei saa 'lihtsalt töötada'? Lõppude lõpuks ei ole mitte nii harva võimalik midagi GitHubist kokku koguda. Tööriistade puhul on tore, kui need toimivad kohe, ilma et oleks vaja seadistada, või nagu mina seda nimetan, 'tegelemine'.

Võib-olla toimib see nii:

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

Ei. Olen endiselt saamast seda kummalist viga ja teen nagu siin kirjeldatud

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

Edenen edasi, kuid miks see mind karjub (GitHub ei ole ju ohutu!) ja proovib endiselt midagi lahti pakkida.

Vastavalt mr. waddlesplash:

Jah, põhjuseks on soov kontrollida koopiate terviklikkust, mis saadi kogumisandmete jaoks. Üks võimalus on arhiivi kontrollsumma kontrollimine, kuid saab ka eraldi faile rikkaida, mis ei ole teostatav, kuna see võtab palju rohkem aega. Selle taga ongi git'i ja teiste VCS-de 'ohutus'. On tõenäoline, et see jääb alati nii, kuna arhivi loomine GitHubis on piisavalt lihtne ja tihti kiiremini. Tulevikus võib-olla ei tule selline karjuv veateade enam... (me ei tee enam selliste retseptide sulandamist HaikuPortsisse).

~/QtQuickApp> haikuporter -S QtQuickApp
Kontrollin, kas mingid sõltuvuse infod vajavad uuendamist ...
Otsin aegunud sõltuvuse infot ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------Laadin alla: git+https://github.com/probonopd/QtQuickApp.git ...
Hoiatus: OHTLIKUD ALLIKAD ON HALB JA NEID EI KASUTATA TOOTMISES
Hoiatus: KOLIGE PALUN PEATUD ARHIIVI ALLALAADIMISELE KONTROLLSUMMA KOHUSTUSTEGA ASAP!
Kloonimine tühjasse hoidlasse '/boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git' ...
Pakkimine QtQuickApp.git allikast
tar: /boot/home/haikuports/app-misc/QtQuickApp/work-1.0/sources/QtQuickApp-1.0: Ei saa avada: Sellist faili ega ka katalooge ei eksisteeri
tar: Viga pole taastatav: lõpetan nüüd
Käsk 'git archive HEAD | tar -x -C "/boot/home/haikuports/app-misc/QtQuickApp/work-1.0/sources/QtQuickApp-1.0"' tagastas mittereageeriva väljumise staatuse 2

Harjumuse järgi lähen küsima häid inimesi kanalil #haiku võrgus irc.freenode.net. Ja kuhu ma nende ilma jäänud olen? Pärast vihje saamist sain aru, et pean kasutama:

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

Hästi, nüüd on selge, mida see teeb — laeb alla arhiivi teatud revisjoniga allikaid. Loll, minu arvates, ja mitte täpselt see, mida soovisin, nimelt — laadida alla viimane revisjon master-harust.

Üks arendajatest selgitas seda järgmiselt:

Meil on oma CI, nii et kõik, mis paigutatakse haikuports'i repository'sse, pakitakse kõigile kasutajatele, ja me ei taha riskida, kogudes ja andes välja 'kõike viimasena upstream'is'.

Sain aru! Igatahes tuli selline asi välja:

ootan, et ehituspakett QtQuickApp-1.0-1 aktiveeritaks
ootan, et ehituspakett QtQuickApp-1.0-1 aktiveeritaks
ootan, et ehituspakett QtQuickApp-1.0-1 aktiveeritaks
ootan, et ehituspakett QtQuickApp-1.0-1 aktiveeritaks
ootan, et ehituspakett QtQuickApp-1.0-1 aktiveeritaks
(...)

See kordub nii lõputult. Näib, et see on viga (kas on aruanne? ma ei leidnud).

C haikuporter ja repositooriumi haikuports Ei tunne taset 'lihtsalt töötab', aga kui arendaja, siis mõned asjad Haikuga töötamisel meeldivad mulle. Suures osas sarnaneb see Open Build Service'iga — komplekt tööriistu Linuxi ülesehitamiseks: äärmiselt võimas, süsteemne lähenemine, aga minu väikese 'hello world' taseme rakenduse jaoks liigne.

Jälle, mr. waddlesplash'i väitel:

Tõepoolest, HaikuPorter on vaike seadistustes üsna range (pluss on olemas lint-režiim ja veelgi rangem režiim, mis muudavad selle veelgi rangemaks!), kuid ainult seetõttu, et see loob pakette, mis töötavad, mitte lihtsalt, et luua pakette. Seetõttu ka kaevatakse välja deklareerimata sõltuvused, vale importimisega teegid, vale versioonid jne. Eesmärk on leida kõik probleemid, sealhulgas tulevased, enne, kui kasutaja neist teada saab (seega ei õnnestunud avrdude installimine, kuna retseptis oli tegelikult määratud sõltuvus). Teegid ei ole lihtsalt eraldi paketid ega isegi määratud SO versioonid. HaikuPorter jälgib kõigi nende järgimist retseptides, vältimaks täitmisvigu.

Praktikas on selline ranguse tase mõistlik operatsioonisüsteemi loomisel, kuid mulle tundub see liiga rangena, kui rääkida 'hello world' rakendusest. Otsustasin proovida midagi muud.

Rakenduste kogumine hpkg formaadis, kasutades käsku 'package create'

Võib-olla, seda lihtne juhend sobib mulle paremini?

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

summary "Demo QtQuick rakendus"
description "QtQuickApp on demo QtQuick rakendus Haiku portimise ja pakendamise testimiseks."

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# Vaata allpool, kui soovid, et rakendus
# ilmuks menüüsse

Üllatavalt kiire, üllatavalt lihtne, üllatavalt tõhus. Just nii, nagu mulle meeldib, hämmastav!

Installimine — mis ja kuhu?

Liikusin faili QtQuickApp.hpkg ~/config/packages, kasutades failihaldurit, pärast mida QtQuickApp maagiliselt ilmus ~/config/apps.
Taaskord üllatavalt kiire, lihtne ja efektiivne. Hämmastav, uskumatu!

Aga… (kuidas ilma nendeta!)

Rakendus on endiselt puudub rakenduste menüüs ja QuickLaunchis. Ma arvan, et tean, kuidas seda parandada. Failihalduris liigutan QtQuickApp.hpkg ~/config/packages-ist /system/packages-i.

Ei, endiselt puudub. Tundub, et ma (noh, ja juhend) jätsin midagi tähelepanuta.

Vaadates HaikuDepot'i "Sisu" vahekaarti mõne teise rakenduse jaoks märkasin, et seal on tüüpi faile /data/mimedb/application/x-vnd... mida tähelepanuväärsem, /data/deskbar/menu/Applications/….

No ja mida ma sinna panna saan? Oota…

mkdir -p data/deskbar/menu/Applications/
( cd data/deskbar/menu/Applications ; ln -s ../..../..../apps/QtQuickApp . )
pakettida QtQuickApp.hpkg rakendused andmed

Olen täiesti kindel, et see trikk töötab, kuid mul on mõned küsimused: miks seda vaja on, milleks see hea on? Minu arvates kahjustab see üldist muljet, et süsteem on nii rafineeritud.

Nagu selgitas mr. waddlesplash:

Mõnikord on rakendusi, mis on teistele rakendustele vajalikud, kuid mitte menüüs. Näiteks LegacyPackageInstaller teie ekraanipildil, mis töödelda .pkg arhiive BeOS formaadis. Sooviks, et kasutajad saaksid need installitud, kuid nende olemasolu menüüs tooks kaasa segadust.

Mul on tunne, et on lihtsam lahendus, näiteks Hidden=true failides .desktop Linuxis. Miks mitte teha «varjatud» teavet ressursi ja failisüsteemi atribuudiks?

Mis ei ole just rafineeritud — (mõne) rakenduse nimi, mis näitab menüüd, deskbar, on jäigalt seotud teega.

mr. waddlesplash selgitab sellega seoses:

„Deskbar“ tuleks sel juhul mõista kui mingit üldist terminit (umbes nagu „taskbar“, mis viitab nii Windowsi rakendusele kui ka üldisele kontseptsioonile). Ja kuna see deskbar, mitte „Deskbar“, võib seda tõlgendada sarnaselt.

Minu viies päev Haiku's: portime natuke programmi.
2 „peaaegu identsed“ rakenduste katalooge

Miks on 2 rakenduste katalooge ning miks on ühes mu QtQuickApplication, aga teises mitte? (See ei ole ju ainult süsteemne, vaid ka teine kasutaja, mis oleks mulle arusaadav).
Ma olen tõeliselt segaduses ja arvan, et peaksime selle ühtlustama.

kommentaar mr. waddlesplash

Apps kataloogis on rakendusi, mis ei ole menüüs vajalikud. Kuid menüüsituatsiooni tuleks tõeliselt parandada, muuta see kohandatavaks.

Taotlus, või seda ei juhtu 😉

Ma mõtlesin: kas on tõesti vajalik rakendusi asetada /system/apps, kui kasutajad ei tohiks neid seal näha? Kas ei oleks parem asetada need kuhugi mujale, kus kasutaja nendega ei kohtu? Nii nagu on tehtud Mac OS X-is, kus pakettide sisu .app, mis ei tohiks kasutajale nähtav olla, peidetakse /Applications, sügavusse /System/Library/…«.

Kuidas on sõltuvustega?

Ma arvan, et sõltuvused peaks kuidagi ära märkima, eks? Kas Qt-d saab pidada Haiku vaikimisi installimise kohustuslikuks osaks? Ei! Qt ei ole vaikimisi installitud. Kas pakettide ehitamise programm suudab automaatselt sõltuvusi tuvastada, kontrollides ELF-faile? Mulle öeldi, et HaikuPorter seda tõesti teeb, aga package ei. Kõik sellepärast, et see on lihtsalt „paketihaldur”, mis iseenesest lihtsalt loob faile hpkg.

Kas Haiku peaks olema peenem, lisades poliitika, mis ütleb, et paketil ei tohi olla sõltuvusi paketidest, mis ei kuulu haikuports? (Мне бы так хотелось, поскольку подобная политика значительно облегчает задачу — система смогла бы автоматически разрешить зависимости каждого пакета, загружаемого откуда угодно, без возни с дополнительными источниками пакетов).

mr. waddlesplash selgitab:

Me ei tahaks arendajate vabadust niivõrd piirata, sest on selge, et kui CompanyX soovib toetada oma tarkvara komplekti koos sõltuvustega (seega ka reposi) — saavad nad seda täiesti vabalt teha.

Sel juhul oleks võib-olla mõistlik soovitada vältida kolmandate osapoolte pakettide sõltuvusi millegist, mis ei kuulu haikuportsi, pakkides vajaliku täielikult rakendusega. Aga ma arvan, et see on teema tulevaseks artikliks selles seerias. [Autor viitab AppImage'ile? — tõlkija märk.]

Rakenduse ikooni lisamine

Aga mis siis, kui ma tahan oma värskelt loodud rakendusse lisada ühe nunnu sisseehitatud ikoone? Tundub, et see on üllatav teema, seega saab see aluseks järgmisele artiklile.

Kuidas organiseerida rakenduste pidev integreerimine?

Kujutage ette projekti, mis sarnaneb Inkscape'iga (jah, ma tean, et seda pole veel Haikus, kuid see on mugav näitamiseks). Neil on allika koodide hoidla. https://gitlab.com/inkscape/inkscape.
Iga kord, kui keegi salvestab oma muudatused hoidlas, käivitatakse kogumise torud, seejärel testitakse muudatusi automaatselt, kogutakse ning rakendus pakitakse erinevatesse pakettidesse, sealhulgas AppImage'i jaoks Linuxile (iseseisev rakenduse pakett, mis võib olla alla laaditud kohalikuks testimiseks, sõltumata sellest, mis võib olla või mitte olla süsteemis installitud. [ma teadsin, et nii läheb! — tõlkija märkus]). Sarnaselt toimub kõik igal ühendamisettepanekute taotlemisel, nii et saate alla laadida rakenduse, mis on kokku pandud koodist, mida pakuti ühendamisettepanekus, juba enne ühendamist.

Minu viies päev Haiku's: portime natuke programmi.
Üksikisikute liitumispäringud koos ehituse staatustega ja võimalusega alla laadida ehitatud binaarid, kui koostamine on edukas (märgitud roheliselt)

Koostamine toimub Docker konteinerites. GitLab pakub tasuta runners'i Linuxil, ja ma arvan, et on võimalik ka oma runners'eid lisada (ühesõnaga, ma ei oska ette kujutada, kuidas see toimib süsteemides nagu Haiku, mis, nagu ma tean, ei kasuta Dockerit või analooge, kuid FreeBSD-l ei ole samuti Dockerit, seega pole see probleem ainulaadne Haiku jaoks).

Ideaaljuhul võiks Haiku rakenduste koostamine toimuda Linuxi Docker konteineri sees. Sel juhul võiks Haiku koostamine olla integreeritud olemasolevatesse torustikesse. Kas on olemas ristkompilaatoreid? Või peame kogu Haiku emuleerima Docker konteineris, kasutades midagi nagu QEMU/KVM (kui see hakkab seal toimima)? Paljud projektid kasutavad muide sarnaseid põhimõtteid. Näiteks Scribus teeb nii — see on juba saadaval Haiku jaoks. Ühel päeval saan ma esitada selliseid liitumispäringuid teistesse projektidesse, et lisada neile Haiku toetust.

Üks arendajatest selgitab:

Teistele projektidele, kes soovivad ise pakette luua, toetatakse tavalist CMake/CPack meetodit. Teisi komplekteerimissüsteeme võib toetada, kui pakettide ehitamise programmi otseselt käivitada, mis on hea, kui inimesed sellest huvitatud on. Praktika näitab: seni pole olnud erilist huvi, nii et haikuporter töötab meile mugavalt, kuid lõpuks peaksid mõlemad meetodid koos töötama. Me peaksime esitama tööriistade komplekti tarkvara ristkomplekteerimiseks Linuxist või mõnest muust serveri operatsioonisüsteemist (Haiku ei ole mõeldud serverites töötamiseks).

Aplodeerin seistes. Tavalised Linuxi kasutajad peavad kandma kogu selle lisakoormuse ja täiendava pagasi (turvalisus, range kontroll jne), mis on vajalik serveri operatsioonisüsteemile, kuid mitte isiklikule. Seetõttu olen täielikult nõus, et võimalus koguda rakendusi Haiku jaoks Linuxis – on õige suund.

Kokkuvõte

POSIX rakenduste portimine Haiku'le on võimalik, kuid võib nõuda rohkem ressursse kui tavaline uuesti koostamine. Ma oleksin kindlasti sellega pikka aega vaeva näinud, kui mitte #haiku kanali inimeste abi irc.freenode.net keskkonnas. Kuid isegi nemad ei näinud alati kohe, mis oli vale.

Qt-s kirjutatud rakendused on väike erand. Koostasin lihtsa demorakenduse ilma eriliste probleemideta.

Paketi koostamine lihtsate rakenduste jaoks on samuti piisavalt lihtne, kuid ainult traditsiooniliselt välja antud rakenduste puhul, st neil on versioneeritud allikaarhive, mis on mõeldud haikuports'i toetamiseks. Jätkuva koostamise (iga muudatuse fikseerimisega) puhul GitHub'is ei ole kõik sugugi nii lihtne. Siin Haiku meenutab rohkem Linuxi distributsiooni, kui Mac'i tulemust, kus XCode'is nuppu 'Koguda' vajutades saadakse pakett .app, mis on ette valmistatud ketta pildi lisamiseks .dmg, mis on laadimiseks valmis minu veebisaidile.
Jätkuv rakenduste kogumine serveripõhisel operatsioonisüsteemil, näiteks Linuxil, võib muutuda võimalikuks, kui arendajate nõudlus kasvab, kuid praegu on Haiku projektil teised, pakilisemad ülesanded.

Katsuge ise! Haiku projekt pakub allalaadimiseks pilte DVD või USB, mis on loodud igal päeval.. Paigaldamiseks piisab pildi allalaadimisest ja selle kirjutamisest USB-mälupulgale koos Etcher

Kas on küsimusi? Olete oodatud venekeelsesse telegrami kanalisse..

Vea ülevaade: Kuidas endale jalga tulistada C ja C++-ga. Haiku OS retseptide kogumik.

Alates autori tõlge: see on viies artikkel Haiku seeriast.

Artiklite nimekiri: Esimene Teine Kolmas Neljas

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster