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

Minu esimene Haiku jaoks portitud programm, pakitud selle hpkg formaati.
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 ja , samuti haikuPorts leidsin vajaliku suuna. On isegi olemas online PDF raamat. .
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 , kuid nagu selgus, on see juba ammu tehtud.
Esimene katse: pole midagi vaadata
Mida ma tõeliselt aru ei saa, on see, et juba — arvestades, et operatsioonisüsteemil pole isegi versiooni 1.0.
Teine katse: tuleb ümber kirjutada
Nii et ma kasutan , 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).

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 foundVõ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 installNä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 foundSelles 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 foundLä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 1Selles 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 (buildslave – virtuaalmasinad).

Parendatud msgpacki ehitamine buildmasteril
Tegelen samal ajal patch'i saatmisega ülespoole .
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 1Praegu 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... nosoovitab, 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 .
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 foundSama, ainult profiilis. Googeldasin ja . Kui lisada -lssp „mõnikord” aitab, proovin:
/Haiku/home/tmate> ./configure LDFLAGS="-lbsd -lssp"
(...)/Haiku/home/tmate> make
(...)/Haiku/home/tmate> ./tmateVau! See käivitub! Aga…
[tmate] ssh.tmate.io lookup failure. Retrying in 2 seconds (non-recoverable failure in name resolution)Proovin siluda, :
/Haiku/home/tmate> strace -f ./tmate >log 2>&1„Bad port ID” — see juba nagu visiitkaart . Äkki keegi teab, mis valesti on ja kuidas seda parandada? Kui midagi, uuendan artiklit. Link .
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
- Soovitatakse kasutada (mul kukub see kokku, )
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:
haikuportersee 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.confRetsepti 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 , 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 hoidlastTundub, 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.recipeSee 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.gitMiks 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
sed -i -e 's|#ALLOW_UNSAFE_SOURCES|ALLOW_UNSAFE_SOURCES|g' /boot/home/config/settings/haikuports.confEdenen edasi, kuid miks see mind karjub (GitHub ei ole ju ohutu!) ja proovib endiselt midagi lahti pakkida.
Vastavalt :
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 2Harjumuse 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 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, 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 andmedOlen 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.

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.

Ü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 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 . Paigaldamiseks piisab pildi allalaadimisest ja selle kirjutamisest USB-mälupulgale koos
Kas on küsimusi? Olete oodatud venekeelsesse .
Vea ülevaade:
Alates tõlge: see on viies artikkel Haiku seeriast.
Artiklite nimekiri:
Allikas: habr.com
