Moj peti dan s Haikuom: prenesimo neke programe

Moj peti dan s Haikuom: prenesimo neke programe

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

Moj peti dan s Haikuom: prenesimo neke programe
Moj prvi Haiku portirani program, upakiran u svoj hpkg format

nedavno Otkrio sam Haiku, iznenađujuće dobar operativni sustav za računala.
Danas ću naučiti kako prenijeti nove programe na ovaj operativni sustav. Glavni fokus je opis prvog iskustva prelaska na Haiku sa stajališta Linux programera. Ispričavam se za sve glupe pogreške koje sam napravio putem, jer nije prošlo ni tjedan dana otkako sam prvi put preuzeo Haiku.

Želim postići tri cilja:

  • Prijenos jednostavne CLI aplikacije
  • Prebacite aplikaciju s GUI na Qt
  • Zatim ih zapakirajte u hpkg format (budući da još uvijek razmišljam o prilagodbi AppDir i AppImage za Haiku...)

Započnimo. U odjeljcima dokumentaciju и razvojkao i u wiki iz HaikuPortsa sam našao pravi smjer. Postoji čak i online PDF knjiga BeOS: Prijenos Unix aplikacije.
467 stranica - a ovo je iz 1997. godine! Strašno je pogledati unutra, ali nadam se najboljem. Riječi programera su ohrabrujuće: "trajalo je dugo jer BeOS nije bio usklađen s POSIX-om", ali Haiku je "većinom" već takav.

Prijenos jednostavne CLI aplikacije

Prva pomisao bila je portirati aplikaciju avrdude, ali, kako se pokazalo, ovo je već gotovo prije mnogo vremena.

Prvi pokušaj: ništa za gledati

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

Drugi pokušaj: treba prepisati

Pa ću koristiti dodir-770, CLI za upravljanje pisačem Brother P-Touch 770 koji koristim za ispis naljepnica.
Na njega tiskam razne etikete, a možda ste ga već vidjeli u prošlom članku. Nešto prije sam napisao mali GUI wrapper program u Pythonu (budući da je u Gtk+, morat će se ponovno napisati, a ovo je dobar razlog da naučite).

Moj peti dan s Haikuom: prenesimo neke programe
Brother P-Touch 770 pisač naljepnica. Hoće li raditi s Haikuom?

Upravitelj paketa Haiku zna o bibliotekama i naredbama, pa ako dobijem poruku "ne mogu pronaći libintl" prilikom pokretanja configure - Samo lansiram pkgman install devel:libintl i traženi paket će se pronaći. Također pkgman install cmd:rsync. Pa itd.

Osim kada ovo ne radi:

/Haiku/home> git clone https://github.com/probonopd/ptouch-770
Cloning into 'ptouch-770'...
remote: Enumerating objects: 134, done.
remote: Total 134 (delta 0), reused 0 (delta 0), pack-reused 134
Receiving objects: 100% (134/134), 98.91 KiB | 637.00 KiB/s, done.
Resolving deltas: 100% (71/71), done./Haiku/home> cd ptouch-770//Haiku/home/ptouch-770> make
gcc -Wall -O2 -c -o ptouch-770-write.o ptouch-770-write.c
ptouch-770-write.c:28:10: fatal error: libudev.h: No such file or directory
 #include <libudev.h>
          ^~~~~~~~~~~
compilation terminated.
Makefile:16: recipe for target 'ptouch-770-write.o' failed
make: *** [ptouch-770-write.o] Error 1/Haiku/home/ptouch-770> pkgman install devel:libudev
100% repochecksum-1 [65 bytes]
Validating checksum for Haiku...done.
100% repochecksum-1 [64 bytes]
Validating checksum for HaikuPorts...done.
*** Failed to find a match for "devel:libudev": Name not found/Haiku/home/ptouch-770> pkgman install devel:udev
100% repochecksum-1 [65 bytes]
Validating checksum for Haiku...done.
100% repochecksum-1 [64 bytes]
Validating checksum for HaikuPorts...done.
*** Failed to find a match for "devel:udev": Name not found

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

Treći pokušaj

Bilo bi lijepo imati tmate za Haiku, tada bih dopustio Haiku programerima da se povežu na moju terminalsku sesiju - u slučaju da nešto pođe po zlu. Upute su vrlo jednostavne:

./autogen.sh
./configure
make
make install

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

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

U ovom koraku otvaram HaikuDepot i tražim curses.
Nešto je pronađeno, što mi je dalo nagovještaj za kompetentniji upit:

/Haiku/home/tmate> pkgman install devel:libncurses
(...)
100% ncurses6_devel-6.1-1-x86_64.hpkg [835.62 KiB]
(...)./configure
(...)
checking for msgpack >= 1.1.0... no
configure: error: "msgpack >= 1.1.0 not found"/Haiku/home/tmate> pkgman install devel:msgpack
(...)
*** Failed to find a match for "devel:msgpack": Name not found/Haiku/home/tmate> pkgman install devel:libmsgpack
(...)
*** Failed to find a match for "devel:libmsgpack": Name not found

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

/Haiku/home/tmate> pkgman install devel:msgpack_c_cpp_devel
100% repochecksum-1 [65 bytes]
Validating checksum for Haiku...done.
100% repochecksum-1 [64 bytes]
Validating checksum for HaikuPorts...done.
*** Failed to find a match for "devel:msgpack_c_cpp_devel": Name not found# Why is it not finding it? To hell with the "devel:".../Haiku/home/tmate> pkgman install msgpack_c_cpp_devel
(...)
The following changes will be made:
  in system:
    install package msgpack_c_cpp-3.1.1-1 from repository HaikuPorts
    install package msgpack_c_cpp_devel-3.1.1-1 from repository HaikuPorts
Continue? [yes/no] (yes) :
(...)/Haiku/home/tmate> ./configure
(...)
checking for libssh >= 0.8.4... no
configure: error: "libssh >= 0.8.4 not found"/Haiku/home/tmate> pkgman install devel:libssh/Haiku/home/tmate> make
(...)
In file included from /boot/system/develop/headers/msgpack.h:22,
                 from tmate.h:5,
                 from cfg.c:29:
/boot/system/develop/headers/msgpack/vrefbuffer.h:19:8: error: redefinition of struct iovec'
 struct iovec {
        ^~~~~
In file included from tmux.h:27,
                 from cfg.c:28:
/boot/system/develop/headers/posix/sys/uio.h:12:16: note: originally defined here
 typedef struct iovec {
                ^~~~~
Makefile:969: recipe for target 'cfg.o' failed
make: *** [cfg.o] Error 1

Na ovom sam koraku shvatio da prijenos programa na Haiku zahtijeva puno više znanja nego što je potrebno za jednostavnu ponovnu izgradnju.
Razgovarao sam s prijateljskim programerima Haikua, pokazalo se da postoji greška u msgpacku i nakon nekoliko minuta vidim zakrpu u HaikuPorts. Vidim svojim očima kako je ispravljen paket ide ovamo (buildslave - virtualni strojevi).

Moj peti dan s Haikuom: prenesimo neke programe
Izgradnja ispravljenog msgpacka na buildmasteru

Između vremena šaljem zakrpu uzvodno za dodavanje podrške za Haiku u msgpack.

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

/Haiku/home/tmate> pkgman update
(...)
The following changes will be made:
  in system:
    upgrade package msgpack_c_cpp-3.1.1-1 to 3.2.0-2 from repository HaikuPorts
    upgrade package msgpack_c_cpp_devel-3.1.1-1 to 3.2.0-2 from repository HaikuPorts
Continue? [yes/no] (yes) : y
100% msgpack_c_cpp-3.2.0-2-x86_64.hpkg [13.43 KiB]
(...)
[system] Done.

Neočekivano dobro. Jesam li to rekao?!

Vraćam se na izvorni problem:

/Haiku/home/tmate> make
(...)
In file included from tmux.h:40,
                 from tty.c:32:
compat.h:266: warning: "AT_FDCWD" redefined
 #define AT_FDCWD -100

In file included from tty.c:25:
/boot/system/develop/headers/posix/fcntl.h:62: note: this is the location of the previous definition
 #define AT_FDCWD  (-1)  /* CWD FD for the *at() functions */

tty.c: In function 'tty_init_termios':
tty.c:278:48: error: 'IMAXBEL' undeclared (first use in this function); did you mean 'MAXLABEL'?
  tio.c_iflag &= ~(IXON|IXOFF|ICRNL|INLCR|IGNCR|IMAXBEL|ISTRIP);
                                                ^~~~~~~
                                                MAXLABEL
tty.c:278:48: note: each undeclared identifier is reported only once for each function it appears in
Makefile:969: recipe for target 'tty.o' failed
make: *** [tty.o] Error 1

Sada izgleda da msgpack nije kriv. komentiram IMAXLABEL в tty.c ovako:

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

Rezultat:

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

Pa, idemo opet... Usput:

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

gosp. geganje govori vam gdje da kopate:

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

Evo objavio sam config.log.

Objasnili su mi da postoji još nešto u libnetworku uz libresolv na Haikuu. Očito kod treba dodatno urediti. Treba razmisliti…

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

Vječno pitanje: što se događa?

/Haiku/home/tmate> ./configure LDFLAGS="-lbsd"
(...)/Haiku/home/tmate> make
(...)
# Success!# Let's run it:/Haiku/home/tmate> ./tmate
runtime_loader: /boot/system/lib/libssh.so.4.7.2: Could not resolve symbol '__stack_chk_guard'
resolve symbol "__stack_chk_guard" returned: -2147478780
runtime_loader: /boot/system/lib/libssh.so.4.7.2: Troubles relocating: Symbol not found

Ista stvar, samo iz profila. Guglao i pronašao ovo. Ako dodate -lssp "ponekad" pomaže, pokušavam:

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

Wow! Počinje! Ali…

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

Pokušat ću otkloniti pogreške datoteku ovdje:

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

“Bad port ID” je već kao posjetnica haiku. Možda netko ima ideju što nije u redu i kako to popraviti? Ako je tako, ažurirat ću članak. Poveznica za GitHub.

Prijenos GUI aplikacije na Qt.

Odabrao sam jednostavnu QML aplikaciju.

/> cd /Haiku/home//Haiku/home> git clone https://github.com/probonopd/QtQuickApp
/Haiku/home/QtQuickApp> qmake .
/Haiku/home/QtQuickApp> make
/Haiku/home/QtQuickApp> ./QtQuickApp # Works!

Stvarno jednostavno. Manje od minute!

Pakiranje aplikacija u hpkg pomoću haikuportera i haikuportova.

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

  • Momčad package - način niske razine za stvaranje paketa. Većinom joj je PackageInfo dovoljan, kao što je opisano u odjeljku "Pretvaranje u ispravan .hpkg paket"
  • Moram nešto učiniti ovo
  • Može se koristiti hpkg-kreator (ruši mi se, prijava grešaka)

Nije jasno što učiniti. Pretpostavljam da mi treba vodič za početnike u stilu Hello World, idealno video. Bilo bi lijepo također imati prikladan uvod u HaikuPorter, kao što je učinjeno u GNU hello.

Pročitao sam sljedeće:

haikuporter je alat za stvaranje uobičajenih paketnih projekata za Haiku. Koristi HaikuPorts repozitorij kao bazu za sve pakete. Za izradu paketa koriste se recepti Haikuportera.

Osim toga, saznajem da:

Nema potrebe za pohranjivanjem recepata u HaikuPorts pohranu. Možete napraviti drugo spremište, staviti recepte u njega, a zatim usmjeriti haikuporter na njega.

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

Instaliranje haikuportera i haikuportova

cd /boot/home/
git clone https://github.com/haikuports/haikuporter --depth=50
git clone https://github.com/haikuports/haikuports --depth=50
ln -s /boot/home/haikuporter/haikuporter /boot/home/config/non-packaged/bin/ # make it runnable from anywhere
cd haikuporter
cp haikuports-sample.conf /boot/home/config/settings/haikuports.conf
sed -i -e 's|/mydisk/haikuports|/boot/home/haikuports|g' /boot/home/config/settings/haikuports.conf

Pisanje recepta

SUMMARY="Demo QtQuick application"
DESCRIPTION="QtQuickApp is a demo QtQuick application for testing Haiku porting and packaging"
HOMEPAGE="https://github.com/probonopd/QtQuickApp"
COPYRIGHT="None"
LICENSE="MIT"
REVISION="1"
SOURCE_URI="https://github.com/probonopd/QtQuickApp.git"
#PATCHES=""
ARCHITECTURES="x86_64"
PROVIDES="
    QtQuickApp = $portVersion
"
REQUIRES="
    haiku
"
BUILD_REQUIRES="
    haiku_devel
    cmd:qmake
"BUILD()
{
    qmake .
    make $jobArgs
}INSTALL()
{
    make install
}

Sastavljanje recepta

Spremam datoteku pod imenom QtQuickApp-1.0.recipe, nakon čega pokrećem aikuporter -S ./QuickApp-1.0.recipe. Zavisnosti se provjeravaju za sve pakete u repozitoriju haikuportovi, što oduzima neko vrijeme. Idem po kavu.

Zašto bi se, zaboga, ova provjera trebala raditi na mom lokalnom računalu, a ne centralno na poslužitelju jednom za sve?

Prema riječima mr. geganje:

S takvim da možete prepisati bilo koju datoteku u repozitoriju 😉 Ovo možete malo optimizirati, izračunavajući potrebne informacije kada je to potrebno, jer su posljednje izmjene prilično rijetke.

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

Ispostavilo se da ne postoji nešto poput obične datoteke s receptom koja sadrži izvorni kod vaše aplikacije. Morate ga čuvati u repozitoriju u formatu HaikuPorts.

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

Ova činjenica čini sklop glomaznijim. Ne sviđa mi se to osobito, ali mislim da je potrebno kako bi se sav softver otvorenog koda na kraju pojavio u HaikuPortsu.

Dobivam sljedeće:

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

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

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

Postavilo se zanimljivo pitanje. Ako dodam kontrolni zbroj u recept - hoće li odgovarati najnovijem git commitu za kontinuiranu integraciju? (Razvojni programer potvrđuje: "Neće raditi. Recepti su dizajnirani da budu relativno stabilni.")

Za zabavu dodajte u recept:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Još uvijek nisam zadovoljan:

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

Što on radi? Uostalom, ovo je git repozitorij, kod je već izravno tamo, nema se što raspakirati. S moje točke gledišta, alat bi trebao biti dovoljno pametan da ne traži unpacker ako je iznad GitHub url-a.

Možda će uri git:// raditi

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

Sada se žali ovako:

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

Hmm, zašto je sve tako komplicirano, zašto ne možete "samo raditi"? Uostalom, nije tako neuobičajeno izgraditi nešto od GitHuba. Bilo da se radi o alatima koji rade odmah, bez potrebe za podešavanjem ili kako ja to zovem "fušanju".

Možda će raditi ovako:

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

Ne. Još uvijek dobivam ovu čudnu pogrešku i činim, kako je ovdje opisano

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

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

Prema gosp. geganje:

Pa, da, razlog je bila želja da se provjeri integritet podataka primljenih za montažu. Jedna od opcija je provjera kontrolne sume arhive, ali možete, naravno, hashirati pojedinačne datoteke, što neće biti implementirano, jer traje mnogo duže. Posljedica toga je "nesigurnost" gita i drugih VCS-ova. To će najvjerojatnije uvijek biti slučaj, budući da je stvaranje arhive na GitHubu prilično jednostavno i često brže. Pa, u budućnosti, možda poruka o pogrešci neće biti tako blještava... (više ne spajamo takve recepte u HaikuPorts).

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

Po staroj navici odem pitati dobre ljude na #haiku kanalu na mreži irc.freenode.net. A gdje bih ja bez njih? Nakon savjeta, shvatio sam da bih trebao koristiti:

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

U redu, postalo je jasno što radi - preuzima arhivu s izvornim kodom određene revizije. Glupo je, s moje točke gledišta, i nije baš ono što sam želio, naime, preuzeti najnoviju reviziju s glavne grane.

Jedan od programera je to objasnio na sljedeći način:

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

Razumijem! U svakom slučaju dogodilo se ovo:

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

Ponavlja ovo ad infinitum. Očigledno je ovo pogreška (postoji li aplikacija? Nisam je mogao pronaći).

С haikuporter i spremište haikuportovi Nema osjećaj "samo radi", ali kao programer, postoje neke stvari koje volim u radu s Haikuom. Uglavnom je sličan usluzi Open Build Service, skupu alata za izgradnju međugradnji Linuxa: iznimno moćan, sa sustavnim pristupom, ali pretjeran za moju malu "hello world" aplikaciju.

Opet, prema mr. geganje:

Doista, HaikuPorter je prilično strog prema zadanim postavkama (plus postoji lint mode kao i strict mode da ga učini još strožim!), ali samo zato što stvara pakete koji će raditi, a ne samo stvaranje paketa. Zato se žali na neprijavljene ovisnosti, knjižnice koje nisu ispravno uvezene, netočne verzije itd. Cilj je uhvatiti sve probleme, uključujući i buduće, prije nego što korisnik sazna za njih (zbog toga nije bilo moguće instalirati avrdude, jer je ovisnost zapravo navedena u receptu). Knjižnice nisu samo pojedinačni paketi ili čak specifične SO verzije. HaikuPorter osigurava da se sve to poštuje u samim receptima kako bi se izbjegle pogreške tijekom izvođenja.

U principu, ova razina strogosti je opravdana kod izrade operativnog sustava, ali mi se čini nepotrebnom za aplikaciju “hello world”. Odlučila sam probati nešto drugo.

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

Može biti, ovo Hoće li jednostavne upute bolje funkcionirati za mene?

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

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

packager "probono"
vendor "probono"

copyrights "probono"
licenses "MIT"

provides {
  QtQuickApp = 1.0-1
}requires {
  qt5
}
EOFpackage create -b QtQuickApp.hpkg
package add QtQuickApp.hpkg apps# See below if you also want the application
# to appear in the menu

Neočekivano brzo, neočekivano jednostavno, neočekivano učinkovito. Upravo kako mi se sviđa, nevjerojatno!

Instalacija - što i gdje?

Datoteka QtQuickApp.hpkg premještena u ~/config/packagespomoću upravitelja datotekama, nakon čega se QtQuickApp magično pojavio ~/config/apps.
Opet, neočekivano brzo, jednostavno i učinkovito. Nevjerojatno, nevjerojatno!

Ali... (gdje bismo bez njih!)

Aplikacija još uvijek nedostaje na popisu izbornika aplikacija i QuickLaunch. Mislim da već znam kako to popraviti. U upravitelju datoteka premještam QtQuickApp.hpkg iz ~/config/packages u /system/packages.

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

Nakon što sam pogledao karticu "Sadržaj" u HaikuDepotu za neke druge aplikacije, vidio sam da postoje datoteke poput /data/mimedb/application/x-vnd... što je još izvanrednije /data/deskbar/menu/Applications/….

Pa, što da stavim tamo? Dođi...

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

Sasvim sam siguran da će ovaj trik upaliti, ali ostaju pitanja: zašto je to potrebno, čemu služi? Mislim da to kvari opći dojam da je sustav tako sofisticiran.

Kako je objasnio gosp. geganje:

Ponekad postoje aplikacije koje druge aplikacije trebaju, ali nisu u izborniku. Na primjer, LegacyPackageInstaller na vašoj snimci zaslona obrađuje .pkg arhive u BeOS formatu. Želio bih da ih korisnici instaliraju, ali njihova prisutnost u izborniku dovest će do zabune.

Iz nekog razloga čini mi se da postoji jednostavnije rješenje, npr Hidden=true u datotekama .desktop na Linuxu. Zašto ne učiniti "skrivene" informacije resursom i atributom datotečnog sustava?

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

gosp. waddlesplash objašnjava ovo:

"Deskbar" u ovom slučaju treba shvatiti kao neku vrstu općeg pojma (na sličan način kao "taskbar", koji se odnosi i na Windows aplikaciju i na opći koncept). Pa od ovoga deskbar, a ne “Deskbar”, ovo se također može shvatiti na sličan način.

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

Zašto postoje 2 direktorija s aplikacijama i zašto je moja QtQuickApplication u jednom, ali ne i u drugom? (Uostalom, ne radi se o jednom sistemskom, nego o drugom korisničkom, što bi meni osobno bilo razumljivo).
Stvarno sam zbunjen i mislim da bi ovo trebalo objediniti.

komentar mr. geganje

Katalog aplikacija sadrži aplikacije koje nisu potrebne u izborniku. Ali situaciju s jelovnikom doista treba poboljšati, učiniti ga prilagodljivijim.

Prijava, inače se neće dogoditi 😉

Pitao sam se: je li stvarno potrebno hostirati aplikacije /system/apps, ako ih korisnici tamo vide, to je nepoželjno. Možda bi bilo bolje postaviti ih na drugo mjesto gdje ih korisnik neće sresti? Baš kao što je to učinjeno u Mac OS X, gdje je sadržaj paketa .app, koji ne bi trebao biti vidljiv korisniku u /Applications, skrivajući se u dubinama /Sustava/Knjižnice/…“`.

Što je s ovisnostima?

Mislim da vrijedi nekako specificirati ovisnosti, zar ne? Može li se Qt prema zadanim postavkama smatrati obveznim dijelom Haiku instalacije? Ne! Qt nije instaliran prema zadanim postavkama. Može li program za izradu paketa automatski otkriti ovisnosti provjerom ELF datoteka? Rečeno mi je da HaikuPorter to zapravo radi, ali package Ne. To je zato što je to samo "sastavljač paketa" koji sam stvara datoteke hpkg.

Treba li Haiku učiniti sofisticiranijim dodavanjem pravila da paket ne smije imati ovisnosti o paketima izvan Haikua? haikuports? (Volio bih, jer bi takva politika uvelike olakšala stvari - sustav bi mogao automatski razriješiti ovisnosti svakog paketa preuzetog s bilo kojeg mjesta, bez petljanja s dodatnim izvorima paketa.)

gosp. waddlesplash objašnjava:

Ne bismo htjeli toliko ograničavati slobodu programera, jer je očito da ako CompanyX želi podržati vlastiti skup softvera sa ovisnostima (a time i repozitorij), to će učiniti potpuno slobodno.

U tom slučaju, možda bi bilo vrijedno preporučiti da paketi trećih strana izbjegnu ovisnosti o bilo čemu što nije uključeno u haikuportove potpunim pakiranjem svega što je potrebno s aplikacijom. Ali mislim da je to tema za budući članak u ovoj seriji. [Ide li autor prema AppImageu? - cca. prevoditelj]

Dodavanje ikone aplikacije

Što ako želim dodati jednu od zgodnih ugrađenih ikona u resurse moje novostvorene aplikacije? Ispostavilo se da je ovo nevjerojatna tema, pa će biti temelj za sljedeći članak.

Kako organizirati kontinuiranu izgradnju aplikacije?

Zamislite projekt kao što je Inkscape (da, svjestan sam da još nije dostupan u Haikuu, ali zgodno ga je prikazati na njemu). Imaju spremište izvornog koda https://gitlab.com/inkscape/inkscape.
Svaki put kada netko unese svoje promjene u repozitorij, pokreću se cjevovodi za izgradnju, nakon čega se promjene automatski testiraju, izgrađuju, a aplikacija pakira u različite pakete, uključujući AppImage za Linux (samostalni paket aplikacija koji se može preuzeti za lokalno testiranje bez obzira na to što može ili ne mora biti instalirano na sustavu [Znao sam! - cca. prevoditelj]). Ista stvar se događa sa svakim zahtjevom za spajanje grane, tako da možete preuzeti aplikaciju izgrađenu iz koda predloženog u zahtjevu za spajanje prije spajanja.

Moj peti dan s Haikuom: prenesimo neke programe
Zahtjevi za spajanje sa statusima izgradnje i mogućnost preuzimanja kompiliranih binarnih datoteka ako je izrada uspješna (označeno zelenom bojom)

Gradnja se izvodi u Docker spremnicima. GitLab nudi besplatne pokretače na Linuxu i mislim da bi bilo moguće uključiti svoje vlastite pokretače (usput, ne vidim kako bi to funkcioniralo za sustave poput Haikua, za koje znam da nemaju Docker ili ekvivalent, ali također za FreeBSD ne postoji Docker, tako da ovaj problem nije jedinstven za Haiku).

U idealnom slučaju, Haiku aplikacije mogu se izgraditi unutar Docker spremnika za Linux. U ovoj situaciji, sklop za Haiku može se uvesti u postojeće cjevovode. Postoje li unakrsni kompajleri? Ili bih trebao emulirati sav Haiku unutar Docker spremnika koristeći nešto poput QEMU/KVM (pod pretpostavkom da će tako raditi unutar Dockera)? Usput, mnogi projekti koriste slične principe. Na primjer, Scribus to radi - već je dostupan za Haiku. Jednog dana će doći dan kada ću moći poslati takav Povucite zahtjeve drugim projektima za dodavanje podrške za Haiku.

Jedan od programera objašnjava:

Za druge projekte koji žele sami kreirati pakete, podržana je uobičajena metoda CMake/CPack. Ostali sustavi izgradnje mogu se podržati izravnim pozivanjem programa za izgradnju paketa, što je u redu ako su ljudi zainteresirani za to. Iskustvo pokazuje: do sada nije bilo velikog interesa, pa je haikuporter radio kako nam je odgovaralo, ali, u konačnici, obje metode trebale bi funkcionirati zajedno. Trebali bismo uvesti skup alata za unakrsnu izgradnju softvera iz Linuxa ili bilo kojeg drugog poslužiteljskog operacijskog sustava (Haiku nije dizajniran za rad na poslužiteljima).

Dajem ovacije. Obični korisnici Linuxa nose sav taj dodatni teret i dodatnu prtljagu (sigurnost, stroga kontrola, itd.) koja je neophodna za poslužiteljski operativni sustav, ali ne i za osobni. Stoga se u potpunosti slažem da je mogućnost izrade Haiku aplikacija na Linuxu pravi put.

Zaključak

Prijenos POSIX aplikacija na Haiku je moguć, ali može biti skuplji od tipične obnove. Definitivno bih se dugo bavio ovime da nije bilo pomoći ljudi s kanala #haiku na mreži irc.freenode.net. Ali čak ni oni nisu uvijek odmah vidjeli što nije u redu.

Aplikacije napisane u Qt-u laka su iznimka. Složio sam jednostavnu demo aplikaciju bez ikakvih problema.

Izrada paketa za jednostavne aplikacije također je prilično jednostavna, ali samo za one "tradicionalno izdane", tj. posjedovanje verzioniranih arhiva izvornog koda namijenjenih za podršku u haikuportovima. Za kontinuiranu izgradnju (izgradnja za svaki commit promjena) s GitHubom, čini se da sve nije tako jednostavno. Ovdje se Haiku više doima kao distribucija Linuxa nego rezultat na Macu, gdje kada kliknete gumb "Build" u XCodeu dobivate paket .app, spreman za umetanje u sliku diska .dmg, pripremljen za preuzimanje na mojoj web stranici.
Kontinuirana izgradnja aplikacija temeljenih na “poslužiteljskom” operativnom sustavu, primjerice Linuxu, najvjerojatnije će postati moguća ako bude potražnje programera, ali trenutno projekt Haiku ima druge, hitnije zadatke.

Pokušajte sami! Na kraju krajeva, projekt Haiku pruža generirane slike za dizanje s DVD-a ili USB-a dnevno. Za instalaciju samo preuzmite sliku i zapišite je na flash pogon pomoću Bakropisac

Imate li kakvih pitanja? Pozivamo vas na ruski govorni jezik brzojavni kanal.

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

Iz Autor prijevod: ovo je peti članak u seriji o haikuu.

Popis članaka: Prvi Drugi Treći Četvrta

Izvor: www.habr.com

Dodajte komentar