Môj piaty deň s Haiku: poďme portovať nejaké programy

Môj piaty deň s Haiku: poďme portovať nejaké programy

TL; DRNováčik vidí Haiku prvýkrát a snaží sa portovať niektoré programy zo sveta Linux.

Môj piaty deň s Haiku: poďme portovať nejaké programy
Môj prvý portovaný program Haiku, zabalený vo formáte hpkg

nedávno Objavil som Haiku, prekvapivo dobrý operačný systém pre PC.
Dnes sa naučím, ako portovať nové programy do tohto operačného systému. Hlavný dôraz bude kladený na opis mojej prvej skúsenosti s prechodom na Haiku z pohľadu vývojára. LinuxOspravedlňujem sa za všetky hlúpe chyby, ktorých som sa cestou dopustil, pretože odkedy som si prvýkrát stiahol Haiku, neubehol ani týždeň.

Chcem dosiahnuť tri ciele:

  • Preneste jednoduchú aplikáciu CLI
  • Port aplikácie z GUI do Qt
  • Potom ich zabaľte do formátu hpkg (keďže stále uvažujem o prispôsobení AppDir a AppImage pre Haiku...)

Začnime. V sekciách dokumentáciu и rozvoj, ako aj v wiki z HaikuPorts som našiel správny smer. Existuje dokonca aj online kniha PDF BeOS: Portovanie unixovej aplikácie.
467 strán - a toto je z roku 1997! Je strašidelné pozerať sa dovnútra, ale dúfam v to najlepšie. Slová vývojára sú povzbudivé: „trvalo to dlho, pretože BeOS nebol kompatibilný s POSIX“, ale Haiku „väčšinou“ je už taký.

Portovanie jednoduchej aplikácie CLI

Prvou myšlienkou bolo preniesť aplikáciu AVRDude, ale, ako sa ukázalo, už je to tak urobili pred dlhým časom.

Prvý pokus: nie je čo pozerať

Čo už nedokážem pochopiť Aplikácie sa do Haiku prenášajú už viac ako 10 rokov - napriek tomu, že samotný OS ešte nemá ani verziu 1.0.

Druhý pokus: treba prepísať

Takže použijem ptouch-770, CLI na ovládanie tlačiarne Brother P-Touch 770, ktorú používam na tlač štítkov.
Tlačím naň rôzne štítky a možno ste ho už videli v predchádzajúcom článku. O niečo skôr som napísal malý GUI wrapper program v Pythone (keďže je v Gtk+, bude ho treba prepísať, a to je dobrý dôvod sa učiť).

Môj piaty deň s Haiku: poďme portovať nejaké programy
Tlačiareň štítkov Brother P-Touch 770. Bude fungovať s Haiku?

Správca balíkov Haiku vie o knižniciach a príkazoch, takže ak pri spustení dostanem správu „nemôžem nájsť libintl“ configure - Práve spúšťam pkgman install devel:libintl a požadovaný balík sa nájde. Podobne pkgman install cmd:rsync. No atď.

Okrem prípadov, keď to nefunguje:

/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žno je udev príliš založený na Linuxe, a preto pre Haiku neexistuje. Čo znamená, že musím upraviť zdrojový kód, ktorý sa pokúšam skompilovať.
Eh, nemôžeš skákať po hlave a ja ani neviem, kde začať.

Tretí pokus

Bolo by pekné mať tmate pre Haiku by som vývojárom Haiku umožnil pripojiť sa k mojej terminálovej relácii - v prípade, že sa niečo pokazí. Návod je celkom jednoduchý:

./autogen.sh
./configure
make
make install

Vyzerá to dobre, tak prečo to neskúsiť na 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

V tomto kroku otvorím HaikuDepot a hľadám curses.
Našlo sa niečo, čo mi dalo tip na kompetentnejší dotaz:

/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

Opäť som išiel do HaikuDepot a, samozrejme, našiel devel:msgpack_c_cpp_devel. Čo sú to za zvláštne mená?

/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

V tomto kroku som si uvedomil, že portovanie programu na Haiku si vyžaduje oveľa viac vedomostí, ako je potrebné na jednoduchú prestavbu.
Hovoril som s priateľskými vývojármi Haiku, ukázalo sa, že v msgpack je chyba a po niekoľkých minútach vidím opravu v HaikuPorts. Na vlastné oči vidím, ako bol opravený balík ísť sem (buildslave - virtuálne stroje).

Môj piaty deň s Haiku: poďme portovať nejaké programy
Vytvorenie opraveného balíka msgpack na buildmaster

Medzitým posielam patch do upstreamu pridať podporu Haiku do msgpack.

O päť minút neskôr je aktualizovaný msgpack už dostupný v Haiku:

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

Nečakane dobré. Povedal som to?!

Vrátim sa k pôvodnému problému:

/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

Teraz to vyzerá, že msgpack nie je na vine. komentujem IMAXLABEL в tty.c nasledovne:

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

Výsledok:

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.

Tak a zase ideme... Mimochodom:

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

Pán. waddlesplash povie vám, kde máte kopať:

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

Tu som uverejnil príspevok config.log.

Vysvetlili mi, že v libnetwork je okrem libresolv na Haiku aj niečo iné. Zrejme je potrebné kód ďalej upravovať. Treba myslieť…

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

Večná otázka: čo sa deje?

/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

To isté, len v profile. Googled a našiel toto. Ak pridáte -lssp "niekedy" pomáha, skúšam:

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

Wow! Už to začína! Ale…

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

Skúsim odladiť súbor tu:

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

„Zlé ID portu“ je už ako vizitka haiku. Možno má niekto nápad, čo je zlé a ako to opraviť? Ak áno, aktualizujem článok. Odkaz na GitHub.

Prenos GUI aplikácie do Qt.

Vyberám si jednoduchú QML aplikáciu.

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

Naozaj jednoduché. Menej ako minútu!

Balenie aplikácií do hpkg pomocou haikuporter a haikuports.

S čím by som mal začať? Neexistuje jednoduchá dokumentácia, idem na kanál #haiku na irc.freenode.net a počujem:

  • Tím package - nízkoúrovňový spôsob vytvárania balíkov. Väčšinou jej stačí PackageInfo, ako je popísané v časti "Urob z toho poriadny .hpkg balík"
  • Potrebujem niečo urobiť toto
  • Môže sa použiť hpkg-creator (zrúti sa mi to, hlásenie chýb)

Nie je jasné, čo robiť. Asi potrebujem príručku pre začiatočníkov v štýle Hello World, ideálne video. Bolo by pekné mať tiež pohodlný úvod do HaikuPorter, ako sa to robí v GNU hello.

Prečítal som si nasledovné:

haikuporter je nástroj na vytváranie spoločných balíkových projektov pre Haiku. Používa úložisko HaikuPorts ako základ pre všetky balíčky. Recepty Haikuporter sa používajú na vytváranie balíčkov.

Okrem toho zisťujem, že:

Nie je potrebné ukladať recepty do úložiska HaikuPorts. Môžete vytvoriť ďalšie úložisko, vložiť doň recepty a potom naň nasmerovať haikuporter.

Presne to, čo potrebujem - ak nehľadám spôsob, ako verejne vydať balík. Ale toto je téma na iný príspevok.

Inštalácia haikuporter a haikuports

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

Písanie receptu

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
}

Zostavenie receptu

Súbor ukladám pod menom QtQuickApp-1.0.recipe, po ktorom spustím aikuporter -S ./QuickApp-1.0.recipe. Závislosti sa kontrolujú pre všetky balíky v úložisku haikuporty, čo nejaký čas trvá. Idem si dať kávu.

Prečo by sa preboha mala táto kontrola vykonávať na mojom lokálnom počítači a nie centrálne na serveri raz pre každého?

Podľa p. waddlesplash:

S takým, že môžete prepísať akýkoľvek súbor v úložisku 😉 Môžete to trochu optimalizovať a v prípade potreby spočítať potrebné informácie, pretože posledné vykonané zmeny sú dosť zriedkavé.

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

Ukázalo sa, že neexistuje nič také ako bežný súbor receptov, ktorý by obsahoval zdrojový kód vašej aplikácie. Musíte ho uchovávať v úložisku vo formáte HaikuPorts.

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

Táto skutočnosť spôsobuje, že montáž je ťažkopádnejšia. Veľmi sa mi to nepáči, ale myslím si, že je to potrebné, aby sa nakoniec všetok softvér s otvoreným zdrojovým kódom objavil v HaikuPorts.

Dostanem nasledovné:

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

Čo je zle? Po prečítaní irc robím:

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

Vyvstala zaujímavá otázka. Ak do receptu pridám kontrolný súčet – bude sa zhodovať s najnovším odovzdaním git pre nepretržitú integráciu? (Vývojár potvrdzuje: "Nebude to fungovať. Recepty sú navrhnuté tak, aby boli relatívne stabilné.")

Pre zábavu pridajte do receptu:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Stále nie som spokojný:

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

Čo robí? Ide predsa o git repozitár, kód tam už priamo je, nie je čo rozbaľovať. Z môjho pohľadu by mal byť nástroj dostatočne inteligentný na to, aby nehľadal rozbaľovač, ak je nad adresou URL GitHubu.

Možno bude fungovať uri git://

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

Teraz sa sťažuje takto:

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

Hmm, prečo je všetko také komplikované, prečo nemôžete „len pracovať“? Koniec koncov, nie je to až také nezvyčajné, že sa dá niečo postaviť z GitHubu. Či už ide o nástroje, ktoré fungujú hneď, bez nutnosti nastavovania, alebo ako tomu hovorím „fušovanie“.

Možno to bude fungovať takto:

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

Nie. Stále dostávam túto zvláštnu chybu a robím, ako je tu popísané

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

Posúvam sa trochu ďalej, ale prečo to na mňa kričí (GitHub nie je zabezpečený!) a stále sa snaží niečo vybaliť.

Podľa Pán. waddlesplash:

Áno, dôvodom bola túžba skontrolovať integritu údajov prijatých na montáž. Jednou z možností je overenie kontrolného súčtu archívu, no jednotlivé súbory môžete samozrejme hašovať, čo sa neimplementuje, pretože trvá to oveľa dlhšie. Dôsledkom toho je „nebezpečnosť“ git a iných VCS. S najväčšou pravdepodobnosťou to tak bude vždy, pretože vytvorenie archívu na GitHub je pomerne jednoduché a často rýchlejšie. No v budúcnosti snáď nebude chybové hlásenie také honosné... (takéto recepty už v HaikuPorts nezlučujeme).

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

Zo starého zvyku sa chodím pýtať dobrých ľudí na kanál #haiku v sieti irc.freenode.net. A kde by som bol bez nich? Po náznaku som si uvedomil, že by som mal použiť:

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

Dobre, bolo jasné, čo robí - sťahuje archív so zdrojovým kódom určitej revízie. Z môjho pohľadu je to hlúpe a nie presne to, čo som chcel, konkrétne stiahnuť najnovšiu revíziu z hlavnej vetvy.

Jeden z vývojárov to vysvetlil takto:

Máme vlastné CI, takže všetko, čo je umiestnené v úložisku haikuports, bude zabalené pre všetkých používateľov a nechceme riskovať zhromažďovanie a doručovanie „všetko v najnovšej verzii upstream“.

Rozumiem! V každom prípade sa stalo toto:

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

Opakuje to donekonečna. Zrejme ide o chybu (existuje nejaká aplikácia? Nenašiel som ju).

С haikuporter a úložisko haikuporty Nemám pocit, že to „proste funguje“, ale ako vývojár sa mi na práci s Haiku páči niekoľko vecí. Je to prevažne podobné Open Build Service – sade nástrojov na vytváranie zostáv. LinuxExtrémne výkonné, so systematickým prístupom, ale pre moju malú aplikáciu na úrovni „hello world“ príliš náročné.

Opäť podľa p. waddlesplash:

V skutočnosti je HaikuPorter štandardne dosť prísny (navyše existuje režim lint, ako aj striktný režim, aby bol ešte prísnejší!), ale len preto, že vytvára balíky, ktoré budú fungovať, a nie len vytváranie balíkov. Preto sa sťažuje na nedeklarované závislosti, nesprávne naimportované knižnice, nesprávne verzie atď. Cieľom je zachytiť všetky problémy, vrátane budúcich, skôr, ako sa o nich používateľ dozvie (preto nebolo možné nainštalovať avrdude, pretože závislosť bola skutočne špecifikovaná v recepte). Knižnice nie sú len jednotlivé balíčky alebo dokonca špecifické verzie SO. HaikuPorter zabezpečuje, aby sa toto všetko dodržiavalo v samotných receptoch, aby sa predišlo chybám počas vykonávania.

V zásade je táto úroveň prísnosti opodstatnená pri vytváraní operačného systému, ale pre aplikáciu „hello world“ sa mi zdá zbytočná. Rozhodol som sa skúsiť niečo iné.

Vytváranie aplikácií vo formáte hpkg pomocou príkazu „package create“.

Možno, toto Budú pre mňa jednoduché pokyny fungovať lepšie?

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

Nečakane rýchle, nečakane jednoduché, nečakane efektívne. Presne ako sa mi to páči, úžasné!

Inštalácia - čo a kde?

Súbor QtQuickApp.hpkg bol presunutý do ~/config/packagespomocou správcu súborov, po ktorom sa zázračne objavila aplikácia QtQuickApp ~/config/apps.
Opäť nečakane rýchlo, jednoducho a efektívne. Úžasné, neuveriteľné!

Ale... (kde by sme bez nich boli!)

Aplikácia stále chýba v zozname aplikácií a QuickLaunch. Myslím, že už viem, ako to opraviť. V správcovi súborov presuniem QtQuickApp.hpkg z ~/config/packages do /system/packages.

Nie, stále chýba. Zrejme mi (no a návod) niečo uniklo.

Keď som sa pozrel na kartu „Obsah“ v HaikuDepot pre niektoré ďalšie aplikácie, videl som, že existujú súbory ako /data/mimedb/application/x-vnd... čo je ešte pozoruhodnejšie /data/deskbar/menu/Applications/….

No a čo tam mám dať? Poď...

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

Som si celkom istý, že tento trik bude fungovať, ale otázky zostávajú: prečo je to potrebné, na čo to je? Myslím, že to kazí celkový dojem, že systém je taký prepracovaný.

Ako vysvetlil p. waddlesplash:

Niekedy existujú aplikácie, ktoré iné aplikácie potrebujú, ale nie sú v ponuke. Napríklad LegacyPackageInstaller na snímke obrazovky, ktorý spracováva archívy .pkg vo formáte BeOS. Bol by som rád, keby si ich používatelia nainštalovali, ale ich prítomnosť v menu povedie k zmätku.

Z nejakého dôvodu sa mi zdá, že existuje jednoduchšie riešenie napr Hidden=true v súboroch .desktop na LinuxPrečo neurobiť z „skrytých“ informácií zdroj a atribút súborového systému?

Čo nie je obzvlášť jemné, je názov (nejakej) aplikácie, ktorá zobrazuje menu, deskbar, pevne zviazané po ceste.

Pán. waddlesplash vysvetľuje toto:

„Panel úloh“ by sa v tomto prípade mal chápať ako všeobecný pojem (podobne ako „panel úloh“, ktorý označuje aplikáciu Windows, a k všeobecnému konceptu). Nuž, keďže toto je deskbar, nie „Deskbar“, to sa dá tiež chápať podobne.

Môj piaty deň s Haiku: poďme portovať nejaké programy
2 "takmer identické" adresáre s aplikáciami v nich

Prečo sú tam 2 adresáre s aplikáciami a prečo je moja QtQuickApplication v jednom, ale nie v druhom? (Nejde predsa o jeden systémový, ale o druhý užívateľský, čo by bolo pre mňa osobne pochopiteľné).
Som naozaj zmätený a myslím si, že by sa to malo zjednotiť.

komentár od p. waddlesplash

Katalóg aplikácií obsahuje aplikácie, ktoré nie sú potrebné v ponuke. Situáciu s menu však skutočne treba zlepšiť, aby bolo lepšie prispôsobiteľné.

Aplikácia, inak sa to nestane 😉

Zaujímalo by ma: je skutočne potrebné hostiť aplikácie v /system/apps, ak ich tam používatelia uvidia, je to nežiaduce. Možno by bolo lepšie umiestniť ich na iné miesto, kde sa s nimi používateľ nestretne? Rovnako ako sa to robí v Mac OS X, kde je obsah balíkov .app, ktorý by nemal byť viditeľný pre používateľa v /Applications, ktorý sa skrýva v hlbinách /System/Library/…“`.

A čo závislosti?

Myslím, že stojí za to nejako špecifikovať závislosti, nie? Môže byť Qt štandardne považovaný za povinnú súčasť inštalácie Haiku? Nie! Qt nie je štandardne nainštalovaný. Môže tvorca balíkov automaticky zistiť závislosti kontrolou súborov ELF? Bolo mi povedané, že HaikuPorter to skutočne robí, ale package Nie Je to preto, že je to len „tvorca balíkov“, ktorý len sám vytvára súbory hpkg.

Malo by byť Haiku sofistikovanejšie pridaním zásady, že balík by nemal mať závislosti od balíkov mimo Haiku? haikuports? (Rád by som to urobil, pretože takáto politika by veci značne uľahčila – systém by bol schopný automaticky vyriešiť závislosti každého balíka stiahnutého odkiaľkoľvek, bez toho, aby sa zaoberal ďalšími zdrojmi balíkov.)

Pán. waddlesplash vysvetľuje:

Neradi by sme toľko obmedzovali slobodu vývojárov, pretože je zrejmé, že ak chce CompanyX podporovať vlastnú sadu softvéru so závislosťami (a teda úložisko), bude to robiť úplne slobodne.

V takom prípade by sa možno oplatilo odporučiť, aby sa balíky tretích strán vyhli závislosti od čohokoľvek, čo nie je zahrnuté v haikuportoch, a to úplným zabalením všetkého potrebného do aplikácie. Ale myslím si, že toto je téma pre budúci článok z tejto série. [Smeruje autor k AppImage? - približne. prekladateľ]

Pridanie ikony aplikácie

Čo ak chcem pridať jednu z úhľadných vstavaných ikon do zdrojov mojej novovytvorenej aplikácie? Ukazuje sa, že je to úžasná téma, takže bude základom pre ďalší článok.

Ako organizovať nepretržité zostavovanie aplikácií?

Predstavte si projekt ako Inkscape (áno, viem, že ešte nie je dostupný v Haiku, ale je vhodné ho na ňom zobraziť). Majú úložisko zdrojového kódu https://gitlab.com/inkscape/inkscape.
Vždy, keď niekto odošle zmeny do repozitára, spustia sa procesy zostavovania, po ktorých sa zmeny automaticky otestujú, zostavia a aplikácia sa zabalí do rôznych balíkov vrátane AppImage pre... Linux (samostatný aplikačný balík, ktorý je možné stiahnuť na lokálne testovanie bez ohľadu na to, čo je alebo nie je v systéme nainštalované [Vedel som to! - približne. prekladateľ]). To isté sa stane s každou žiadosťou o zlúčenie pobočiek, takže pred zlúčením si môžete stiahnuť aplikáciu zostavenú z kódu navrhnutého v žiadosti o zlúčenie.

Môj piaty deň s Haiku: poďme portovať nejaké programy
Zlúčiť požiadavky so stavmi zostavy a možnosťou stiahnuť skompilované binárne súbory, ak je zostava úspešná (označené zelenou farbou)

Zostavenie beží v kontajneroch Docker. GitLab ponúka bezplatné runnery na Linux, a tiež si myslím, že by bolo možné pripojiť vlastné spúšťače (mimochodom, netuším, ako by to fungovalo na systémoch ako Haiku, o ktorých viem, že nemajú Docker ani nič podobné, ale ani FreeBSD nemá Docker, takže tento problém nie je špecifický pre Haiku).

V ideálnom prípade je možné vytvárať aplikácie pre Haiku v kontajneri Docker. LinuxV tomto scenári je možné zostavovanie Haiku integrovať do existujúcich kanálov. Existujú krížové kompilátory? Alebo by som mal emulovať celé Haiku v kontajneri Docker pomocou niečoho ako QEMU/KVM (za predpokladu, že to takto funguje v Dockeri)? Mimochodom, mnoho projektov používa podobné princípy. Napríklad Scribus to robí – je už dostupný pre Haiku. Jedného dňa budem môcť posielať taký Stiahnutím žiadostí do iných projektov pridajte podporu Haiku.

Jeden z vývojárov vysvetľuje:

Pre ostatné projekty, ktoré si chcú vytvárať vlastné balíčky, je podporovaná štandardná metóda CMake/CPack. Iné systémy zostavovania je možné podporiť priamym volaním nástroja na tvorbu balíčkov, čo by bolo fajn, keby ľudia mali záujem. Skúsenosti ukazujú, že zatiaľ nebol veľký záujem, takže haikuporter nám fungoval, ale v konečnom dôsledku by obe metódy mali fungovať spoločne. Mali by sme zaviesť sadu nástrojov na krížové zostavovanie softvéru z... Linux alebo akýkoľvek iný serverový operačný systém (Haiku nie je určený na spustenie na serveroch).

Standing ovation od bežných používateľov Linux Nesú so sebou všetku túto dodatočnú záťaž a batožinu (zabezpečenie, prísna kontrola atď.), ktorú serverový operačný systém potrebuje, ale nie desktopový. Preto úplne súhlasím s tým, že schopnosť vytvárať aplikácie pre Haiku na Linux — správnym spôsobom.

Záver

Portovanie aplikácií POSIX na Haiku je možné, ale môže byť drahšie ako typické prebudovanie. Určite by som v tom zostal dlho, keby mi nepomohli ľudia z kanála #haiku na sieti irc.freenode.net. Ale ani oni nie vždy hneď videli, čo je zle.

Aplikácie napísané v Qt sú jednoduchou výnimkou. Bez problémov som dal dokopy jednoduchú demo aplikáciu.

Vytvorenie balíka pre jednoduché aplikácie je tiež pomerne jednoduché, ale iba pre „tradične vydané“ aplikácie, čo znamená tie s verziovanými archívmi zdrojového kódu určenými na podporu v haikuportoch. Pre kontinuálne zostavovania (zostavovanie pre každý commit) to s GitHubom nie je až také jednoduché. Tu Haiku pôsobí skôr ako distribúcia. Linux, než výsledok na Macu, kde kliknutím na tlačidlo „Vytvoriť“ v Xcode sa vytvorí balík .app, pripravený na vloženie do obrazu disku .dmg, pripravený na stiahnutie na mojej webovej stránke.
Napríklad nepretržitá montáž aplikácií založených na operačnom systéme „server“, Linux, bude pravdepodobne možné, ak bude dopyt zo strany vývojárov, ale momentálne má projekt Haiku iné, naliehavejšie úlohy.

Skúste to sami! Koniec koncov, projekt Haiku poskytuje vygenerované obrázky na zavedenie z DVD alebo USB denná. Ak chcete nainštalovať, stačí stiahnuť obrázok a zapísať ho na flash disk pomocou ten, kto leptá

Máte nejaké otázky? Pozývame vás na rusky hovoriaci telegramový kanál.

Prehľad chýb: Ako si vystreliť do nohy v C a C++. Zbierka receptov Haiku OS

Od autora preklad: toto je piaty článok zo série o Haiku.

Zoznam článkov: Prvé Druhý Третья štvrtý

Zdroj: hab.com

Kúpte si spoľahlivý hosting pre stránky s DDoS ochranou, VPS VDS servery 🔥 Kúpte si spoľahlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster