Minu viies päev Haikuga: portime mõned programmid

Minu viies päev Haikuga: portime mõned programmid

TL; DR: Uustulnuk nägi Haiku esimest korda, üritades mõnda programmi Linuxi maailmast portida.

Minu viies päev Haikuga: portime mõned programmid
Minu esimene Haiku porteeritud programm, mis on pakitud hpkg-vormingusse

Hiljuti Avastasin Haiku, üllatavalt hea operatsioonisüsteemi arvutitele.
Täna õpin, kuidas sellesse operatsioonisüsteemi uusi programme portida. Põhirõhk on haikule ülemineku esmakogemuse kirjeldusel Linuxi arendaja vaatenurgast. Vabandan kõigi rumalate vigade pärast, mida ma oma teel tegin, sest pole möödunud isegi nädalat sellest, kui ma esimest korda Haiku alla laadisin.

Soovin saavutada kolm eesmärki:

  • Portige lihtne CLI rakendus
  • Rakenduse portimine GUI-lt Qt-le
  • Seejärel pakkige need hpkg-vormingusse (kuna ma veel mõtlen AppDiri ja AppImage'i kohandamisele Haiku jaoks...)

Alustame. Sektsioonides dokumentatsiooni и arengut, samuti aastal wiki HaikuPortsist leidsin õige suuna. Internetis on isegi PDF-raamat BeOS: Unixi rakenduse portimine.
467 lehekülge – ja see on aastast 1997! Sisse vaadata on hirmus, aga loodan parimat. Arendaja sõnad on julgustavad: "see võttis kaua aega, sest BeOS ei olnud POSIX-ühilduv", kuid Haiku "enamasti" on juba selline.

Lihtsa CLI-rakenduse teisaldamine

Esimene mõte oli rakendus portida avrdude, kuid nagu selgus, see juba on tehtud kaua aega tagasi.

Esimene katse: pole midagi vaadata

Millest ma aru ei saa, on see juba Rakendusi on Haikule teisaldatud üle 10 aasta - hoolimata asjaolust, et OS ise pole veel isegi versioon 1.0.

Teine katse: vaja ümber kirjutada

Nii et ma kasutan Ptouch-770, CLI Brother P-Touch 770 printeri juhtimiseks, mida kasutan siltide printimiseks.
Prindin sellele erinevaid silte ja võib-olla olete seda juba eelmises artiklis näinud. Veidi varem kirjutasin Pythonis väikese GUI-ümbrise programmi (kuna see on Gtk+-s, siis tuleb see ümber kirjutada ja see on hea põhjus õppimiseks).

Minu viies päev Haikuga: portime mõned programmid
Brother P-Touch 770 etiketiprinter. Kas see töötab koos Haikuga?

Haiku paketihaldur teab teeke ja käske, nii et kui ma saan käivitamisel teate "ei leia libintl" configure - Ma just käivitan pkgman install devel:libintl ja vajalik pakett leitakse. Samamoodi pkgman install cmd:rsync. No jne.

Välja arvatud juhul, 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 Linuxi-põhine ja seetõttu pole seda Haiku jaoks olemas. Mis tähendab, et ma pean muutma lähtekoodi, mida üritan kompileerida.
Eh, sa ei saa üle pea hüpata ja ma isegi ei tea, kust alustada.

Kolmas katse

Oleks tore omada tmate Haiku jaoks lubaksin Haiku arendajatel minu terminali seansiga ühenduse luua - juhuks, kui midagi peaks valesti minema. Juhised on üsna lihtsad:

./autogen.sh
./configure
make
make install

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

/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 ja otsin curses.
Midagi leiti, mis andis vihje pädevamaks päringuks:

/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

Jälle läksin HaikuDepotisse ja loomulikult leidsin devel:msgpack_c_cpp_devel. Mis need kummalised nimed on?

/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 portimine Haikule nõuab palju rohkem teadmisi, kui on vaja lihtsaks ümberehitamiseks.
Rääkisin sõbralike Haiku arendajatega, selgus, et msgpackis on viga ja mõne minuti pärast näen HaikuPortsis plaastrit. Näen oma silmaga, kuidas parandatud pakk läheb siia (buildslave - virtuaalsed masinad).

Minu viies päev Haikuga: portime mõned programmid
Parandatud sõnumipaketi koostamine buildmasteris

Vahepeal saadan plaastri ülesvoolu msgpacki Haiku toe lisamiseks.

Viis minutit hiljem on värskendatud 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?!

Ma pöördun tagasi algse probleemi 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

Nüüd tundub, et msgpack pole süüdi. Ma kommenteerin IMAXLABEL в tty.c nii:

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

Tulemus:

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.

Noh, siin me jälle... Muide:

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

härra. waddlespllash ütleb teile, kuhu kaevama:

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

Siia ma postitasin config.log.

Nad selgitasid mulle, et libresolv'is on libresolv'is ka midagi muud. Ilmselt tuleb koodi veel redigeerida. Vaja mõelda…

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

Igavene küsimus: mis 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 asi, ainult profiilis. Googeldas ja leidis selle. Kui lisate -lssp "Mõnikord" aitab, proovin:

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

Vau! Algab! Aga…

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

Proovin siluda faili siia:

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

“Bad port ID” on juba nagu visiitkaart haiku. Ehk on kellelgi aimu milles viga ja kuidas seda parandada? Kui jah, siis uuendan artiklit. Link aadressile GitHub.

GUI-rakenduse portimine Qt-sse.

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õesti lihtne. Vähem kui minut!

Rakenduste pakkimine hpkg-sse kasutades haikuporterit ja haikuporte.

Millest peaksin alustama? Lihtne dokumentatsioon puudub, lähen irc.freenode.net kanalile #haiku ja kuulen:

  • Meeskond package - madala tasemega viis pakettide loomiseks. Enamasti piisab talle PackageInfost, nagu on kirjeldatud jaotises "Korralikuks .hpkg pakendiks tegemine"
  • Ma pean midagi tegema selline a
  • Võib kasutada hpkg-looja (see jookseb minu jaoks kokku, veateade)

Pole selge, mida teha. Mul on vist vaja Hello World stiilis algaja juhendit, ideaalis videot. Oleks tore saada ka mugav sissejuhatus HaikuPorterile, nagu seda tehakse GNU hello's.

Loen järgmist:

haikuporter on tööriist Haiku ühiste pakettprojektide loomiseks. See kasutab kõigi pakettide alusena HaikuPortsi hoidlat. Pakendite koostamisel kasutatakse Haikuporteri retsepte.

Lisaks saan teada, et:

Retsepte pole vaja HaikuPortsi hoidlas talletada. Saate teha teise hoidla, panna sinna retseptid ja seejärel suunata haikuporter sellele.

Just see, mida ma vajan – kui ma ei otsi võimalust paketi avalikuks vabastamiseks. Aga see on teise postituse teema.

Haikuporteri ja haikuportide paigaldamine

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

Retsepti kirjutamine

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
}

Retsepti kokkupanek

Salvestan faili nime all QtQuickApp-1.0.recipe, mille järel käivitan aikuporter -S ./QuickApp-1.0.recipe. Sõltuvusi kontrollitakse kõigi hoidlas olevate pakettide puhul haikuports, mis võtab natuke aega. Ma lähen jooma kohvi.

Miks peaks seda kontrolli tegema minu kohalikus masinas, mitte kõigi jaoks serveris?

Vastavalt hr. waddlesplash:

Sellisega, millega saab repositooriumis suvalist faili ümber kirjutada 😉 Seda saab veidi optimeerida, vajadusel arvutades vajaliku info, sest viimased tehtud muudatused on üsna harvad.

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

Selgub, et pole olemas sellist asja nagu tavaline retseptifail, mis sisaldaks teie rakenduse lähtekoodi. Peate seda hoidma HaikuPortsi formaadis hoidlas.

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

See asjaolu muudab kokkupaneku tülikamaks. Mulle see eriti ei meeldi, aga pean seda vajalikuks, et lõpuks ilmuks kogu avatud lähtekoodiga tarkvara HaikuPortsi.

Saan järgmise:

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

Mis viga? Pärast irc lugemist teen:

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

Tekkis huvitav küsimus. Kui lisan retseptile kontrollsumma – kas see ühtib pideva integreerimise jaoks uusima git commitiga? (Arendaja kinnitab: "See ei tööta. Retseptid on loodud suhteliselt stabiilseks.")

Lõbusaks lisage retseptile:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Pole ikka veel rahul:

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

Mida ta teeb? Tegemist on ju giti hoidlaga, kood on juba otse olemas, pole midagi lahti pakkida. Minu seisukohast peaks tööriist olema piisavalt tark, et mitte otsida lahtipakkijat, kui see asub GitHubi URL-i kohal.

Võib-olla uri git:// töötab

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

Nüüd kurdab see nii:

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

Hmm, miks on kõik nii keeruline, miks ei saa "lihtsalt tööd teha"? Lõppude lõpuks pole GitHubist millegi ehitamine nii haruldane. Olgu need tööriistad, mis töötavad kohe, ilma seadistamist vajamata, või nagu ma seda "pabinaks" nimetan.

Võib-olla töötab see nii:

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

Ei. Saan ikka veel selle imeliku vea ja teen, nagu siin kirjeldatud

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

Ma liigun veidi edasi, aga miks see minu peale karjub (GitHub pole turvaline!) ja ikka üritab midagi lahti pakkida.

Vastavalt härra. waddlespllash:

No jah, põhjuseks oli soov kontrollida komplekteerimiseks saadud andmete terviklikkust. Üks võimalustest on kontrollida arhiivi kontrollsummat, kuid loomulikult saate räsida üksikuid faile, mida ei rakendata, kuna see võtab palju kauem aega. Selle tagajärjeks on giti ja muu VCS-i "ebaturvalisus". Tõenäoliselt on see alati nii, kuna arhiivi loomine GitHubis on üsna lihtne ja sageli kiirem. Eks edaspidi ehk veateade nii toretsev ei ole... (HaikuPortsis me selliseid retsepte enam ei ühenda).

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

Vanast harjumusest käin headelt inimestelt küsimas irc.freenode.net võrgu kanalis #haiku. Ja kus ma oleksin ilma nendeta? Pärast vihjet mõistsin, et peaksin kasutama:

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

Olgu, sai selgeks, mida see teeb – laadib alla teatud versiooni lähtekoodiga arhiivi. Minu vaatevinklist on see rumal ja mitte just see, mida ma tahtsin, nimelt uusima versiooni põhiharust allalaadimine.

Üks arendajatest selgitas seda järgmiselt:

Meil on oma CI, nii et kõik, mis on paigutatud haikuportide hoidlasse, pakitakse kõigile kasutajatele ning me ei taha riskida, et kogume ja edastame „kõike uusima versiooni ülesvoolu”.

Sai aru! Igal juhul juhtus nii:

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
(...)

See kordab seda lõpmatuseni. Ilmselt on see viga (kas rakendus on olemas? Ma ei leidnud seda).

С haikuporter ja hoidla haikuports Sellel ei ole "lihtsalt töötab" tunnet, kuid arendajana on mulle Haikuga töötamise juures mõned asjad meeldivad. Enamasti sarnaneb see Open Build Service'iga, tööriistade komplektiga Linuxi buildide loomiseks: äärmiselt võimas, süstemaatilise lähenemisega, kuid minu väikese "tere maailm" rakenduse jaoks üle jõu käiv.

Jällegi, vastavalt hr. waddlesplash:

Tõepoolest, HaikuPorter on vaikimisi üsna range (lisaks on nii lintrežiim kui ka range režiim, et muuta see veelgi rangemaks!), kuid ainult sellepärast, et see loob pakette, mis toimivad, mitte ainult pakette. Seetõttu kurdab ta deklareerimata sõltuvuste, valesti imporditud raamatukogude, valede versioonide jms üle. Eesmärk on tabada kõik probleemid, ka tulevased, enne, kui kasutaja sellest teada saab (seetõttu ei saanudki avrdude installida, kuna sõltuvus oli retseptis tegelikult välja toodud). Teegid ei ole ainult üksikud paketid või isegi konkreetsed SO versioonid. HaikuPorter tagab, et seda kõike järgitakse retseptides endis, et vältida vigu täitmisel.

Põhimõtteliselt on selline ranguse tase operatsioonisüsteemi loomisel õigustatud, kuid mulle tundub see "tere maailm" rakenduse puhul ebavajalik. Otsustasin proovida midagi muud.

Rakenduste loomine hpkg-vormingus, kasutades käsku "paketi loomine".

Võib olla, see Kas lihtsad juhised toimivad minu jaoks paremini?

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

Ootamatult kiire, ootamatult lihtne, ootamatult tõhus. Täpselt nii, nagu mulle meeldib, hämmastav!

Paigaldamine - mida ja kus?

Teisaldas faili QtQuickApp.hpkg asukohta ~/config/packageskasutades failihaldurit, mille järel ilmus võluväel sisse QtQuickApp ~/config/apps.
Jällegi ootamatult kiire, lihtne ja tõhus. Hämmastav, uskumatu!

Aga... (kus me oleksime ilma nendeta!)

Rakendus puudub endiselt rakenduste menüü loendist ja QuickLaunchist. Arvan, et tean juba, kuidas seda parandada. Failihalduris teisaldan QtQuickApp.hpkg asukohast ~/config/packages kausta /system/packages.

Ei, ikka veel puudu. Ilmselt jäi mul (noh, ja juhistest) midagi kahe silma vahele.

Vaadanud HaikuDepoti vahekaarti "Sisu" mõne muu rakenduse jaoks, nägin, et seal on selliseid faile nagu /data/mimedb/application/x-vnd... mis veelgi tähelepanuväärsem on /data/deskbar/menu/Applications/….

No mida ma peaksin sinna panema? Ole nüüd...

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

Olen üsna kindel, et see trikk töötab, kuid küsimused jäävad: miks see on vajalik, milleks see on? Ma arvan, et see rikub üldmulje, et süsteem on nii keerukas.

Nagu selgitas hr. waddlesplash:

Mõnikord on rakendusi, mida teised rakendused vajavad, kuid mida menüüs pole. Näiteks LegacyPackageInstaller teie ekraanipildil, töötleb .pkg arhiive BeOS-vormingus. Soovin, et kasutajad need installiksid, kuid nende olemasolu menüüs tekitab segadust.

Millegipärast tundub mulle, et on näiteks lihtsam lahendus Hidden=true failides .desktop Linuxis. Miks mitte muuta "peidetud" teave failisüsteemi ressursiks ja atribuudiks?

Mis pole eriti peen, on (mõne) rakenduse nimi, mis näitab menüüd, deskbar, mööda teed jäigalt seotud.

härra. waddlesplash selgitab seda:

"Töölauariba" tuleks sel juhul mõista kui üldmõistet (umbes samamoodi nagu "tegumiriba", mis viitab nii Windowsi rakendusele kui ka üldisele kontseptsioonile). No sellest ajast peale deskbar, mitte “Deskbar”, seda saab ka sarnaselt mõista.

Minu viies päev Haikuga: portime mõned programmid
2 "peaaegu identset" kataloogi, milles on rakendused

Miks on 2 rakendustega kataloogi ja miks on minu QtQuickApplication ühes, aga mitte teises? (See ei ole ju ühe süsteemi, vaid teise kasutaja oma, mis oleks mulle isiklikult arusaadav).
Ma olen tõesti segaduses ja arvan, et see peaks olema ühtne.

kommentaar hr. waddlespllash

Rakenduste kataloog sisaldab rakendusi, mida menüüs pole vaja. Aga olukord menüüga vajab tõesti parandamist, kohandatavamaks muutmist.

Kandideerimine, muidu ei juhtu 😉

Mõtlesin: kas tõesti on vaja rakendusi majutada /system/apps, kui kasutajad neid seal näevad, on see ebasoovitav. Võib-olla oleks parem paigutada need mõnda teise kohta, kus kasutaja neid ei kohta? Täpselt nagu seda tehakse Mac OS X-is, kus pakettide sisu .app, mis ei tohiks olla kasutajale nähtav /Applications, peidus /System/Library/…“’ sügavustesse.

Aga sõltuvused?

Ma arvan, et tasuks sõltuvused kuidagi täpsustada, eks? Kas Qt võib vaikimisi pidada Haiku installi kohustuslikuks osaks? Ei! Qt pole vaikimisi installitud. Kas paketi koostaja saab ELF-faile kontrollides automaatselt tuvastada sõltuvusi? Mulle öeldi, et HaikuPorter teeb seda tegelikult, aga package Ei. Seda seetõttu, et see on lihtsalt "paketi koostaja", mis lihtsalt loob faile iseseisvalt hpkg.

Kas Haikuid tuleks muuta keerukamaks, lisades poliitika, et pakett ei tohiks sõltuda väljaspool Haiku pakette? haikuports? (Tahaks, sest selline poliitika teeks asja palju lihtsamaks – süsteem suudaks automaatselt lahendada iga kõikjalt alla laaditud paketi sõltuvused, ilma täiendavate paketiallikatega jamamata.)

härra. waddlesplash selgitab:

Me ei tahaks nii väga piirata arendajate vabadust, sest on ilmselge, et kui CompanyX soovib oma tarkvarakomplekti sõltuvustega (ja seega repositooriumiga) toetada, siis teeb ta seda täiesti vabalt.

Sel juhul tasub soovitada, et kolmandate osapoolte paketid väldiksid sõltuvust millestki, mis ei sisaldu haikuportides, pakkides kõik vajaliku täielikult rakendusega kaasa. Kuid ma arvan, et see on selle sarja tulevase artikli teema. [Kas autor suundub AppImage'i poole? — ca. tõlkija]

Rakenduse ikooni lisamine

Mida teha, kui ma tahan lisada oma vastloodud rakenduse ressurssidele ühe korraliku sisseehitatud ikooni? Selgub, et see on hämmastav teema, nii et see on järgmise artikli aluseks.

Kuidas korraldada pidevaid rakenduste koostamisi?

Kujutage ette sellist projekti nagu Inkscape (jah, ma olen teadlik, et see pole veel Haikus saadaval, kuid seda on mugav sellel kuvada). Neil on lähtekoodi hoidla https://gitlab.com/inkscape/inkscape.
Iga kord, kui keegi teeb hoidlas oma muudatused, käivitatakse ehituskonveierid, misjärel muudatusi testitakse automaatselt, koostatakse ja rakendus pakitakse erinevatesse pakettidesse, sealhulgas AppImage for Linuxi (eraldiseisva rakenduse pakett, mida saab kohalikuks testimiseks alla laadida sõltumata mida võib süsteemi installida või mitte [Ma teadsin seda! — ca. tõlkija]). Sama juhtub iga haru ühendamise taotlusega, nii et saate enne ühendamist alla laadida ühendamistaotluses pakutud koodist koostatud rakenduse.

Minu viies päev Haikuga: portime mõned programmid
Ühendage päringud järgu olekutega ja kompileeritud binaarfailide allalaadimise võimalusega, kui ehitamine õnnestub (märgitud rohelisega)

Ehitamine töötab Dockeri konteinerites. GitLab pakub Linuxis tasuta jooksjaid ja ma arvan, et võib-olla oleks võimalik kaasata oma jooksjaid (muide, ma ei saa aru, kuidas see toimiks selliste süsteemide puhul nagu Haiku, millel minu teada pole Dockerit ega samaväärset, kuid ka FreeBSD jaoks pole Dockerit, seega pole see probleem ainult Haiku jaoks ainulaadne).

Ideaalis saab Haiku rakendusi ehitada Linuxi jaoks mõeldud Dockeri konteinerisse. Sellises olukorras saab Haiku koostu viia olemasolevatesse torustikesse. Kas on ristkoostajaid? Või peaksin kõiki Dockeri konteineris olevaid haikuid emuleerima, kasutades midagi sellist nagu QEMU/KVM (eeldusel, et see töötab Dockeri sees nii)? Muide, paljud projektid kasutavad sarnaseid põhimõtteid. Näiteks Scribus teeb seda – see on juba haiku jaoks saadaval. Ükskord tuleb päev, mil saan saata selline Tõmmake taotlused teistele projektidele, et lisada Haiku toetus.

Üks arendajatest selgitab:

Teiste projektide puhul, kes soovivad ise pakette luua, toetatakse tavalist CMake/CPack meetodit. Teisi ehitussüsteeme saab toetada, kui helistate otse paketi ehitusprogrammile, mis on hea, kui inimesed sellest huvitatud on. Kogemus näitab: seni pole suurt huvi olnud, nii et haikuporter toimis meile sobivalt, kuid lõppkokkuvõttes peaksid mõlemad meetodid koos töötama. Peaksime juurutama tööriistade komplekti Linuxist või mõnest muust serveri operatsioonisüsteemist ristuva tarkvara loomiseks (Haiku pole mõeldud serverites töötamiseks).

Ma aplodeerin püsti. Tavalised Linuxi kasutajad kannavad endaga kaasas kogu seda lisakoormust ja lisapagasit (turvalisus, range kontroll jne), mis on vajalik serveri operatsioonisüsteemile, aga mitte isiklikule. Seega olen täiesti nõus, et Haiku rakenduste loomine Linuxis on õige tee.

Järeldus

POSIX-i rakenduste portimine Haikule on võimalik, kuid võib olla kulukam kui tavaline ümberehitamine. Oleksin sellega kindlasti kauaks ummikus, kui poleks abiks irc.freenode.net võrgu #haiku kanali inimesed. Kuid isegi nemad ei näinud alati kohe, milles viga.

Qt-s kirjutatud rakendused on lihtne erand. Panin ilma probleemideta kokku lihtsa demorakenduse.

Ka lihtsate rakenduste paketi koostamine on üsna lihtne, kuid ainult “traditsiooniliselt välja antud” s.t. millel on versioonitud lähtekoodiarhiivid, mis on mõeldud toetamiseks haikuportides. GitHubiga pideva ehitamise puhul (ehitamine iga muudatuste tegemiseks) tundub, et kõik pole nii lihtne. Siin tundub Haiku rohkem nagu Linuxi distributsioon kui tulemus Macis, kus XCode'i nupul "Ehita" klõpsates saate paketi .app, valmis kettapildile sisestamiseks .dmg, mis on minu veebisaidil allalaadimiseks ette valmistatud.
Pidev rakenduste ehitamine “serveri” operatsioonisüsteemil, näiteks Linuxil, saab suure tõenäosusega võimalikuks siis, kui arendajate poolt on nõudlust, kuid hetkel on Haiku projektil muud pakilisemad ülesanded.

Proovi ise! Lõppude lõpuks pakub Haiku projekt loodud pilte DVD-lt või USB-lt käivitamiseks iga päev. Installimiseks laadige lihtsalt pilt alla ja kirjutage see mälupulgale Etcher

Kas teil on küsimusi? Kutsume teid venekeelsesse telegrammi kanal.

Vea ülevaade: Kuidas tulistada endale jalga C ja C++ keeles. Haiku OS retseptide kogu

Pärit autor tõlge: see on Haiku-teemalise sarja viies artikkel.

Artiklite loend: Esimene Teine kolmas Neljas

Allikas: www.habr.com

Lisa kommentaar