Mana piektā diena ar Haiku: portēsim dažas programmas

Mana piektā diena ar Haiku: portēsim dažas programmas

TL; DR: Iesācējs pirmo reizi redzēja Haiku, mēģinot pārnest dažas programmas no Linux pasaules.

Mana piektā diena ar Haiku: portēsim dažas programmas
Mana pirmā Haiku portētā programma, kas iepakota hpkg formātā

Nesen Es atklāju Haiku, pārsteidzoÅ”i labu operētājsistēmu personālajiem datoriem.
Å odien es uzzināŔu, kā portēt jaunas programmas uz Å”o operētājsistēmu. Galvenā uzmanÄ«ba tiek pievērsta pirmās pieredzes aprakstam, pārejot uz Haiku no Linux izstrādātāja viedokļa. Es atvainojos par stulbām kļūdām, ko pieļāvu ceļā, jo nav pagājusi pat nedēļa, kopÅ” pirmo reizi lejupielādēju Haiku.

Es vēlos sasniegt trīs mērķus:

  • Portējiet vienkārÅ”u CLI lietojumprogrammu
  • Portējiet lietojumprogrammu no GUI uz Qt
  • Pēc tam iesaiņojiet tos hpkg formātā (jo es joprojām domāju par AppDir un AppImage pielāgoÅ”anu Haiku...)

Sāksim. Sadaļās dokumentāciju Šø attÄ«stÄ«bu, kā arÄ« iekŔā Wiki no HaikuPorts atradu pareizo virzienu. Ir pat tieÅ”saistes PDF grāmata BeOS: Unix lietojumprogrammas pārneÅ”ana.
467 lappuses - un tas ir no 1997. gada! Ir bail skatÄ«ties iekŔā, bet ceru uz to labāko. Izstrādātāja vārdi ir iepriecinoÅ”i: ā€œpagāja ilgs laiks, jo BeOS nebija saderÄ«gs ar POSIXā€, bet Haiku ā€œlielākotiesā€ jau tāds ir.

VienkārŔas CLI lietojumprogrammas pārneŔana

Pirmā doma bija lietojumprogrammas pārneŔana avrdude, bet, kā izrādījās, tas jau ir ir darījuŔi sen.

Pirmais mēģinājums: nekas nav jāskatās

Ko es nevaru saprast, tas jau ir Lietotnes ir pārnestas uz Haiku vairāk nekā 10 gadus - neskatoties uz to, ka pati OS vēl nav pat versija 1.0.

Otrais mēģinājums: nepiecieÅ”ams pārrakstÄ«t

Tāpēc es izmantoÅ”u ptouch-770, CLI, lai kontrolētu Brother P-Touch 770 printeri, ko izmantoju uzlÄ«mju drukāŔanai.
Es uz tā drukāju dažādas etiÄ·etes, un jÅ«s, iespējams, to jau redzējāt iepriekŔējā rakstā. Nedaudz agrāk es uzrakstÄ«ju nelielu GUI iesaiņojuma programmu Python (tā kā tā ir Gtk+, tā bÅ«s jāpārraksta, un tas ir labs iemesls mācÄ«ties).

Mana piektā diena ar Haiku: portēsim dažas programmas
Brother P-Touch 770 uzlīmju printeris. Vai tas darbosies ar Haiku?

Haiku pakotņu pārvaldnieks zina par bibliotēkām un komandām, tādēļ, ja palaižot saņemu ziņojumu "nevaru atrast libintl". configure - Es tikko palaižu pkgman install devel:libintl un vajadzīgā pakete tiks atrasta. Tāpat pkgman install cmd:rsync. Nu utt.

Izņemot gadījumus, kad tas nedarbojas:

/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

Iespējams, udev ir pārāk balstÄ«ts uz Linux, un tāpēc tas nepastāv priekÅ” Haiku. Tas nozÄ«mē, ka man ir jārediģē avota kods, ko mēģinu apkopot.
Eh, tu nevari lēkt pāri galvai, un es pat nezinu, ar ko sākt.

TreÅ”ais mēģinājums

BÅ«tu jauki, ja bÅ«tu tmate Haiku gadÄ«jumā es ļautu Haiku izstrādātājiem pieslēgties manai termināļa sesijai - ja kaut kas noiet greizi. NorādÄ«jumi ir pavisam vienkārÅ”i:

./autogen.sh
./configure
make
make install

Izskatās labi, kāpēc gan neizmēģināt to uz Haiku?

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

Šajā solī es atveru HaikuDepot un meklēju curses.
Tika atrasts kaut kas, kas man deva mājienu precīzākam vaicājumam:

/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

Atkal devos uz HaikuDepot, un, protams, atradu devel:msgpack_c_cpp_devel. Kādi ir Ŕie dīvainie vārdi?

/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

Šajā solī es sapratu, ka programmas pārneŔana uz Haiku prasa daudz vairāk zināŔanu, nekā nepiecieŔams vienkārŔai pārbūvei.
Es runāju ar draudzÄ«gajiem Haiku izstrādātājiem, izrādās, ka msgpack ir kļūda, un pēc dažām minÅ«tēm es redzu ielāpu HaikuPorts. Savām acÄ«m redzu kā izlabots iepakojums dodos Å”eit (buildslave ā€” virtuālās maŔīnas).

Mana piektā diena ar Haiku: portēsim dažas programmas
Labotās ziņu pakotnes izveide vietnē buildmaster

Starplaikos es nosūtu ielāpu uz augŔu lai pievienotu Haiku atbalstu msgpack.

Pēc piecām minūtēm atjauninātais msgpack jau ir pieejams Haiku valodā:

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

Negaidīti labi. Vai es to teicu?!

Atgriežos pie sākotnējās problēmas:

/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

Tagad izskatās, ka msgpack nav vainÄ«gs. Es komentēju IMAXLABEL Š² tty.c tā:

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

Rezultāts:

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.

Nu, lūk, atkal... Starp citu:

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

Mr. waddlespllash norāda, kur rakt:

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

Å eit es ievietoju config.log.

Viņi man paskaidroja, ka bez Haiku libresolv ir vēl kaut kas libresolv tÄ«klā. AcÄ«mredzot kods ir jārediģē tālāk. Jādomāā€¦

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

Mūžīgais jautājums: kas notiek?

/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

Tas pats, tikai profilā. Google un atrada Å”o. Ja pievienojat -lssp ā€œDažreizā€ palÄ«dz, es mēģinu:

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

Oho! Sākas! Betā€¦

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

Es mēģināŔu atkļūdot failu Å”eit:

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

ā€œBad port IDā€ jau ir kā vizÄ«tkarte haiku. VarbÅ«t kādam ir nojausma, kas par vainu un kā to novērst? Ja tā, es atjaunināŔu rakstu. Saite uz GitHub.

GUI lietojumprogrammas pārneŔana uz Qt.

Es izvēlos vienkārÅ”u QML aplikāciju.

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

TieŔām vienkārŔi. Mazāk par minūti!

Aplikāciju iepakoŔana hpkg, izmantojot haikuporter un haikuports.

Ar ko man jāsāk? Nav vienkārÅ”as dokumentācijas, es dodos uz #haiku kanālu vietnē irc.freenode.net un dzirdu:

  • Komanda package - zema lÄ«meņa pakotņu izveides veids. Lielākoties viņai pietiek ar PackageInfo, kā aprakstÄ«ts sadaļā "Pareizas .hpkg pakotnes izveidoÅ”ana"
  • Man kaut kas jādara ir
  • Var izmantot hpkg-radÄ«tājs (tas sabrÅ«k man, kļūdu ziņoÅ”ana)

Nav skaidrs, ko darÄ«t. Man Ŕķiet, ka man ir vajadzÄ«ga Hello World stila rokasgrāmata iesācējiem, ideālā gadÄ«jumā video. BÅ«tu jauki, ja bÅ«tu arÄ« ērts ievads par HaikuPorter, kā tas tiek darÄ«ts GNU hello.

Es lasu sekojoŔo:

haikuporter ir rīks kopēju Haiku pakotņu projektu izveidei. Tas izmanto HaikuPorts repozitoriju kā bāzi visām pakotnēm. Haikuporter receptes tiek izmantotas, lai izveidotu iepakojumus.

Turklāt es atklāju, ka:

HaikuPorts krātuvē receptes nav jāglabā. Varat izveidot citu krātuvi, ievietot tajā receptes un pēc tam norādīt uz to haikuporter.

TieÅ”i tas, kas man vajadzÄ«gs ā€“ ja nemeklēju veidu, kā publiski izlaist paketi. Bet Ŕī ir tēma citam ierakstam.

Haikuportera un haikuportu uzstādīŔana

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

Receptes rakstīŔana

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
}

Receptes salikŔana

Es saglabāju failu ar nosaukumu QtQuickApp-1.0.recipe, pēc kura es palaistu aikuporter -S ./QuickApp-1.0.recipe. AtkarÄ«bas tiek pārbaudÄ«tas visām repozitorijā esoÅ”ajām pakotnēm haikuports, kas aizņem kādu laiku. Es aizieÅ”u pēc kafijas.

Kāpēc Ŕī pārbaude bÅ«tu jāveic manā vietējā datorā, nevis centralizēti serverÄ« vienu reizi visiem?

Saskaņā ar mr. waddlesplash:

Ar tādu, lai varētu pārrakstÄ«t jebkuru failu repozitorijā šŸ˜‰ Å o vari nedaudz optimizēt, nepiecieÅ”amÄ«bas gadÄ«jumā aprēķinot nepiecieÅ”amo informāciju, jo pēdējās veiktās izmaiņas ir diezgan reti.

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

Izrādās, ka nav tādas lietas kā parasts receptes fails, kas satur jūsu lietojumprogrammas avota kodu. Jums tas jāglabā krātuvē HaikuPorts formātā.

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

Å is fakts padara montāžu apgrÅ«tinoŔāku. Man tas Ä«paÅ”i nepatÄ«k, bet domāju, ka tas ir nepiecieÅ”ams, lai galu galā visa atvērtā koda programmatÅ«ra parādÄ«tos HaikuPorts.

Es saņemu sekojoÅ”o:

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

Kas noticis? Pēc irc izlasÄ«Å”anas es daru:

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

Ir radies interesants jautājums. Ja es pievienoŔu receptei kontrolsummu, vai tā atbilst jaunākajai git commit nepārtrauktai integrācijai? (Izstrādātājs apstiprina: "Tas nedarbosies. Receptes ir izstrādātas tā, lai tās būtu salīdzinoŔi stabilas.")

Lai izklaidētos, pievienojiet receptei:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Joprojām neesmu apmierināts:

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

Ko viņŔ dara? Galu galā Ŕī ir git repozitorija, kods jau ir tieÅ”i tur, nav ko izpakot. Manā skatÄ«jumā rÄ«kam jābÅ«t pietiekami gudram, lai nemeklētu atpakotāju, ja tas atrodas virs GitHub url.

Varbūt uri git:// darbosies

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

Tagad tas sūdzas Ŕādi:

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

Hmm, kāpēc viss ir tik sarežģīti, kāpēc nevar "tikai strādāt"? Galu galā nav nekas neparasts izveidot kaut ko no GitHub. NeatkarÄ«gi no tā, vai tie ir rÄ«ki, kas darbojas uzreiz, bez nepiecieÅ”amÄ«bas pēc iestatÄ«Å”anas vai kā es to saucu par "uztraukumu".

Varbūt tas darbosies Ŕādi:

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

Nē. Es joprojām saņemu Å”o dÄ«vaino kļūdu un daru, kā Å”eit aprakstÄ«ts

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

Es virzos nedaudz tālāk, bet kāpēc tas kliedz uz mani (GitHub nav droÅ”s!) un joprojām mēģina kaut ko izpakot.

Saskaņā ar Mr. waddlespllash:

Nu jā, iemesls bija vēlme pārbaudÄ«t montāžai saņemto datu integritāti. Viena no iespējām ir pārbaudÄ«t arhÄ«va kontrolsummu, taču jÅ«s, protams, varat jaukt atseviŔķus failus, kas netiks ieviesti, jo tas aizņem daudz ilgāku laiku. Tā sekas ir git un citu VCS ā€œnedroŔībaā€. Visticamāk, tas tā bÅ«s vienmēr, jo arhÄ«va izveide vietnē GitHub ir diezgan vienkārÅ”a un bieži vien ātrāka. Labi, nākotnē varbÅ«t kļūdas ziņojums nebÅ«s tik spilgts... (Ŕādas receptes vairs HaikuPorts neapvienojam).

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

Pēc vecā ieraduma es eju pajautāt labiem cilvēkiem kanālā #haiku tīklā irc.freenode.net. Un kur es būtu bez viņiem? Pēc mājiena es sapratu, ka man vajadzētu izmantot:

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

Labi, kļuva skaidrs, ko tas dara - tas lejupielādē arhīvu ar noteiktas versijas pirmkodu. Tas ir stulbi, no mana viedokļa, un ne gluži tas, ko es gribēju, proti, lejupielādēt jaunāko versiju no galvenās filiāles.

Viens no izstrādātājiem to paskaidroja Ŕādi:

Mums ir savs CI, tāpēc viss, kas tiek ievietots haikuportu repozitorijā, tiks iesaiņots visiem lietotājiem, un mēs nevēlamies riskēt, apkopojot un piegādāt ā€œvisu jaunākajā versijā augÅ”pusā€.

Sapratu! Jebkurā gadījumā notika Ŕādi:

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

Tas atkārto to bezgalīgi. Acīmredzot tā ir kļūda (vai ir lietojumprogramma? Es to nevarēju atrast).

Š” haikuporter un repozitorijs haikuports Tam nav "tikai darbojas" sajÅ«tas, taču kā izstrādātājam man patÄ«k dažas lietas, strādājot ar Haiku. Lielākoties tas ir lÄ«dzÄ«gs Open Build Service ā€” rÄ«ku komplektam Linux bÅ«vējumu veidoÅ”anai: ārkārtÄ«gi jaudÄ«gs, ar sistemātisku pieeju, taču pārspÄ«lēts manai mazajai "sveiki pasaulei" lietojumprogrammai.

Atkal, saskaņā ar mr. waddlesplash:

PatieŔām, HaikuPorter pēc noklusējuma ir diezgan stingrs (turklāt ir savstarpēja režīms, kā arÄ« stingrs režīms, lai padarÄ«tu to vēl stingrāku!), bet tikai tāpēc, ka tas rada pakotnes, kas darbosies, nevis tikai izveido pakotnes. Tāpēc viņŔ sÅ«dzas par nedeklarētām atkarÄ«bām, nepareizi importētām bibliotēkām, nepareizām versijām utt. MērÄ·is ir noÄ·ert visas problēmas, arÄ« turpmākās, pirms lietotājs par to uzzina (tāpēc nebija iespējams instalēt avrdude, jo atkarÄ«ba faktiski bija norādÄ«ta receptē). Bibliotēkas nav tikai atseviŔķas pakotnes vai pat konkrētas SO versijas. HaikuPorter nodroÅ”ina, ka tas viss tiek ievērots paŔās receptēs, lai izvairÄ«tos no kļūdām izpildes laikā.

Principā Ŕāds stingrÄ«bas lÄ«menis ir attaisnojams, veidojot operētājsistēmu, bet man tas Ŕķiet nevajadzÄ«gs "hello world" lietojumprogrammai. Nolēmu pamēģināt ko citu.

Lietojumprogrammu izveide hpkg formātā, izmantojot komandu ā€œpackage createā€.

Var bÅ«t, Å”is Vai vienkārÅ”as instrukcijas man noderēs labāk?

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

Negaidīti ātri, negaidīti vienkārŔi, negaidīti efektīvi. TieŔi tā, kā man patīk, apbrīnojami!

UzstādīŔana - kas un kur?

Pārvietoja failu QtQuickApp.hpkg uz ~/config/packagesizmantojot failu pārvaldnieku, pēc kura maģiski parādījās QtQuickApp ~/config/apps.
Atkal negaidīti ātri, vienkārŔi un efektīvi. Apbrīnojami, neticami!

Bet... (kur gan mēs būtu bez viņiem!)

Programma joprojām nav iekļauta lietotņu izvēlņu sarakstā un QuickLaunch. Man Ŕķiet, ka es jau zinu, kā to labot. Failu pārvaldniekā es pārvietoju QtQuickApp.hpkg no ~/config/packages uz /system/packages.

Nē, joprojām trūkst. Acīmredzot es (nu un instrukcijas) kaut ko palaidu garām.

Apskatot dažas citas lietojumprogrammas HaikuDepot cilnē "Saturs", es redzēju, ka ir tādi faili kā /data/mimedb/application/x-vnd... kas ir vēl ievērojamāks /data/deskbar/menu/Applications/ā€¦.

Nu ko man tur likt? Aiziet...

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

Esmu diezgan pārliecināts, ka Å”is triks darbosies, taču paliek jautājumi: kāpēc tas ir vajadzÄ«gs, kam tas paredzēts? Manuprāt, tas sagrauj kopējo iespaidu, ka sistēma ir tik izsmalcināta.

Kā skaidroja Mr. waddlesplash:

Dažreiz ir lietojumprogrammas, kas ir vajadzīgas citām lietojumprogrammām, bet kuras nav izvēlnē. Piemēram, ekrānuzņēmumā LegacyPackageInstaller, kas apstrādā .pkg arhīvus BeOS formātā. Es vēlētos, lai lietotāji tos instalētu, taču viņu klātbūtne izvēlnē radīs neskaidrības.

Man nez kāpēc Ŕķiet, ka ir, piemēram, vienkārŔāks risinājums Hidden=true failos .desktop operētājsistēmā Linux. Kāpēc gan nepadarÄ«t "slēpto" informāciju par failu sistēmas resursu un atribÅ«tu?

ÄŖpaÅ”i smalks ir (dažas) lietojumprogrammas nosaukums, kas parāda izvēlni, deskbar, pa ceļam stingri sasiets.

Mr. waddlesplash to izskaidro:

ā€œDarbjoslaā€ Å”ajā gadÄ«jumā ir jāsaprot kā sava veida vispārÄ«gs termins (tāpat kā ā€œuzdevumjoslaā€, kas attiecas gan uz Windows lietojumprogrammu, gan uz vispārējo koncepciju). Nu, kopÅ” Ŕī deskbar, nevis ā€œDeskbarā€, arÄ« to var saprast lÄ«dzÄ«gi.

Mana piektā diena ar Haiku: portēsim dažas programmas
2 "gandrīz identiski" direktoriji ar lietojumprogrammām tajos

Kāpēc ir 2 direktoriji ar lietojumprogrammām, kā arī kāpēc vienā ir mana QtQuickApplication, bet otrā nav? (Galu galā tas nav vienas sistēmas, bet gan otrā lietotāja, kas man personīgi būtu saprotams).
Es esmu patieŔām apmulsis, un es domāju, ka tam vajadzētu bÅ«t vienotam.

komentēja mr. waddlespllash

Programmu katalogā ir lietojumprogrammas, kas izvēlnē nav vajadzÄ«gas. Taču situācija ar ēdienkarti tieŔām ir jāuzlabo, lai tā bÅ«tu pielāgojamāka.

PieteikÅ”anās, vai arÄ« nenotiks šŸ˜‰

Es prātoju: vai tieŔām ir nepiecieÅ”ams mitināt lietojumprogrammas /system/apps, ja lietotāji tos tur redz, tas ir nevēlami. VarbÅ«t labāk tos novietot citā vietā, kur lietotājs ar tiem nesastapsies? Tāpat kā tas tiek darÄ«ts operētājsistēmā Mac OS X, kur pakotņu saturs .app, kam nevajadzētu bÅ«t redzamam lietotājam /Applications, slēpjas /Sistēma/Bibliotēka/ā€¦ā€œ` dziļumos.

Kā ar atkarībām?

Es domāju, ka ir vērts kaut kā precizēt atkarÄ«bas, vai ne? Vai Qt pēc noklusējuma var uzskatÄ«t par obligātu Haiku instalācijas sastāvdaļu? Nē! Qt pēc noklusējuma nav instalēts. Vai pakotņu veidotājs var automātiski noteikt atkarÄ«bas, pārbaudot ELF failus? Man teica, ka HaikuPorter patiesÄ«bā to dara, bet package Nē. Tas ir tāpēc, ka tas ir tikai "pakeÅ”u veidotājs", kas tikai izveido failus pats hpkg.

Vai Haiku ir jāpadara sarežģītākas, pievienojot politiku, ka paketei nevajadzētu bÅ«t atkarÄ«gām no pakotnēm ārpus haiku? haikuports? (Es gribētu, jo Ŕāda politika padarÄ«tu darbu daudz vienkārŔāku ā€” sistēma spētu automātiski atrisināt katras no jebkuras vietas lejupielādētas pakotnes atkarÄ«bas, nejaucoties ar papildu pakotņu avotiem.)

Mr. waddlesplash paskaidro:

Mēs negribētu tik ļoti ierobežot izstrādātāju brīvību, jo ir acīmredzams, ka, ja CompanyX vēlas atbalstīt savu programmatūras komplektu ar atkarībām (un līdz ar to arī repozitoriju), tas to darīs pilnīgi brīvi.

Tādā gadÄ«jumā varētu bÅ«t vērts ieteikt treÅ”o puÅ”u pakotnēm izvairÄ«ties no atkarÄ«bas no nekā, kas nav iekļauts haikuportā, pilnÄ«bā iesaiņojot visu nepiecieÅ”amo kopā ar lietojumprogrammu. Bet es domāju, ka Ŕī ir tēma turpmākam Ŕīs sērijas rakstam. [Vai autors dodas uz AppImage? ā€” apm. tulkotājs]

Lietojumprogrammas ikonas pievienoŔana

Ko darÄ«t, ja es vēlos pievienot kādu no glÄ«tajām iebÅ«vētajām ikonām savas jaunizveidotās lietojumprogrammas resursiem? Izrādās, ka Ŕī ir pārsteidzoÅ”a tēma, tāpēc tas bÅ«s pamats nākamajam rakstam.

Kā organizēt nepārtrauktu lietojumprogrammu veidoÅ”anu?

Iedomājieties tādu projektu kā Inkscape (jā, es zinu, ka tas vēl nav pieejams Haiku formātā, bet ir ērti tajā attēlot). Viņiem ir pirmkoda repozitorijs https://gitlab.com/inkscape/inkscape.
Ikreiz, kad kāds veic izmaiņas krātuvē, tiek palaistas izveides konveijerus, pēc kuriem izmaiņas tiek automātiski pārbaudÄ«tas, veidotas un lietojumprogramma tiek iepakota dažādās pakotnēs, tostarp AppImage for Linux (atseviŔķa lietojumprogrammu pakotne, kuru var lejupielādēt vietējai testÄ“Å”anai neatkarÄ«gi no ko var vai nevar instalēt sistēmā [ES to zināju! ā€” apm. tulkotājs]). Tas pats notiek ar katru filiāles sapludināŔanas pieprasÄ«jumu, tāpēc pirms sapludināŔanas varat lejupielādēt lietojumprogrammu, kas izveidota no sapludināŔanas pieprasÄ«jumā piedāvātā koda.

Mana piektā diena ar Haiku: portēsim dažas programmas
Apvienot pieprasÄ«jumus ar bÅ«vējuma statusiem un iespēju lejupielādēt kompilētos bināros failus, ja bÅ«vÄ“Å”ana ir veiksmÄ«ga (atzÄ«mēta zaļā krāsā)

BÅ«vējums darbojas Docker konteineros. GitLab piedāvā bezmaksas skrējējus operētājsistēmā Linux, un es domāju, ka varētu bÅ«t iespējams iekļaut savus skrējējus (starp citu, es nesaprotu, kā tas darbotos tādās sistēmās kā Haiku, kurām, kā es zinu, nav Docker vai lÄ«dzvērtÄ«ga, taču arÄ« FreeBSD nav Docker, tāpēc Ŕī problēma nav raksturÄ«ga tikai Haiku).

Ideālā gadÄ«jumā Haiku lietojumprogrammas var iebÅ«vēt Docker konteinerā, kas paredzēts Linux. Šādā situācijā Haiku montāžu var ieviest esoÅ”ajos cauruļvados. Vai ir krusteniski kompilatori? Vai arÄ« man vajadzētu atdarināt visu Haiku Docker konteinerā, izmantojot kaut ko lÄ«dzÄ«gu QEMU/KVM (pieņemot, ka tā darbosies Docker iekÅ”pusē)? Starp citu, daudzi projekti izmanto lÄ«dzÄ«gus principus. Piemēram, Scribus to dara - tas jau ir pieejams Haiku. Kādu dienu pienāks diena, kad varÄ“Å”u nosÅ«tÄ«t Ŕāds PārsÅ«tiet pieprasÄ«jumus citiem projektiem, lai pievienotu Haiku atbalstu.

Viens no izstrādātājiem paskaidro:

Citiem projektiem, kas vēlas paÅ”i izveidot pakotnes, tiek atbalstÄ«ta parastā CMake/CPack metode. Citas bÅ«vÄ“Å”anas sistēmas var atbalstÄ«t, tieÅ”i izsaucot pakotnes veidoÅ”anas programmu, kas ir labi, ja cilvēkus tā interesē. Pieredze rāda: lÄ«dz Å”im liela interese nav bijusi, tāpēc haikuporter darbojās kā mums ērts, bet galu galā abām metodēm vajadzētu strādāt kopā. Mums vajadzētu ieviest rÄ«ku komplektu programmatÅ«ras savstarpējai veidoÅ”anai no Linux vai jebkuras citas servera operētājsistēmas (Haiku nav paredzēts darboties serveros).

Es sniedzu stāvovācijas. Regulāri Linux lietotāji nes visu Å”o papildu slodzi un papildu bagāžu (droŔība, stingra kontrole utt.), kas nepiecieÅ”ama servera operētājsistēmai, bet ne personÄ«gajai. Tāpēc es pilnÄ«bā piekrÄ«tu, ka iespēja izveidot Haiku lietotnes operētājsistēmā Linux ir pareizais ceļŔ.

Secinājums

POSIX lietojumprogrammu pārneÅ”ana uz Haiku ir iespējama, taču tā var bÅ«t dārgāka nekā parasta pārbÅ«ve. Es noteikti paliktu pie tā uz ilgu laiku, ja nepalÄ«dzētu cilvēki no #haiku kanāla irc.freenode.net tÄ«klā. Bet pat viņi ne vienmēr uzreiz saprata, kas bija nepareizi.

Programmas, kas rakstÄ«tas Qt, ir vienkārÅ”s izņēmums. Es bez problēmām izveidoju vienkārÅ”u demonstrācijas lietojumprogrammu.

Pakotnes izveidoÅ”ana vienkārŔām lietojumprogrammām arÄ« ir diezgan vienkārÅ”a, taču tikai ā€œtradicionāli izlaistajāmā€, t.i. kam ir versijas pirmkoda arhÄ«vi, kas paredzēti atbalstam haikuportos. Nepārtrauktai izveidei (veidot katrai izmaiņu veikÅ”anai) ar GitHub, Ŕķiet, ka viss nav tik vienkārÅ”i. Å eit Haiku Ŕķiet vairāk kā Linux izplatÄ«Å”ana, nevis rezultāts Mac datorā, kur, noklikŔķinot uz pogas ā€œBuildā€ programmā XCode, jÅ«s saņemat pakotni. .app, gatavs ievietoÅ”anai diska attēlā .dmg, sagatavots lejupielādei manā vietnē.
Nepārtraukta aplikāciju veidoÅ”ana uz ā€œserveraā€ operētājsistēmas bāzes, piemēram, Linux, visticamāk, kļūs iespējama, ja bÅ«s pieprasÄ«jums no izstrādātājiem, taču Å”obrÄ«d Haiku projektam ir citi, aktuālāki uzdevumi.

Izmēģiniet to pats! Galu galā Haiku projekts nodroÅ”ina Ä£enerētus attēlus palaiÅ”anai no DVD vai USB katru dienu. Lai instalētu, vienkārÅ”i lejupielādējiet attēlu un ierakstiet to zibatmiņas diskā, izmantojot Etcher

Vai jums ir kādi jautājumi? Aicinām uz krievvalodīgo telegrammas kanāls.

Kļūdu pārskats: Kā ieŔaut sev kājā C un C++ valodā. Haiku OS recepŔu kolekcija

No autors tulkojums: Å”is ir piektais raksts sērijā par Haiku.

Rakstu saraksts: Pirmais Otrais TreŔais Ceturtais

Avots: www.habr.com

Pievieno komentāru