Min femte dag med Haiku: lÄt oss portera lite program.

Min femte dag med Haiku: lÄt oss portera lite program.

TL;DR: Nybörjaren sÄg Haiku för första gÄngen och försöker portera nÄgra program frÄn LinuxvÀrlden.

Min femte dag med Haiku: lÄt oss portera lite program.
Mitt första portade program för Haiku, paketerat i dess hpkg-format.

Nyligen Jag upptÀckte Haiku, ett ovÀntat bra operativsystem för PC.
I dag ska jag lÀra mig att portera nya program till detta operativsystem. Fokus ligger pÄ att beskriva mina första erfarenheter av att övergÄ till Haiku frÄn perspektivet av en Linuxutvecklare. Jag ber om ursÀkt för de dumma misstag jag gjort under processen, eftersom det knappt har gÄtt en vecka sedan jag först laddade ner Haiku.

Jag har tre mÄl:

  • Portera en enkel CLI-applikation.
  • Portera en GUI-applikation pĂ„ Qt.
  • Sedan paketera dem i hpkg-format (eftersom jag fortfarande funderar pĂ„ att anpassa AppDir och AppImage för Haiku
)

LÄt oss börja. I avsnitten dokumentation och utveckling, samt i wiki frÄn HaikuPorts hittade jag rÀtt riktning. Det finns till och med en PDF-bok online. BeOS: Portering av Unix-applikationer..
467 sidor – och detta sedan 1997! Att titta inuti Ă€r skrĂ€mmande, men jag hoppas pĂ„ det bĂ€sta. Utvecklarens ord Ă€r uppmuntrande: 'lĂ„ng tid, eftersom BeOS inte var POSIX-kompatibel', men Haiku 'i stort sett' Ă€r det redan.

Portera en enkel CLI-applikation.

Den första tanken var att portera applikationen avrdude, men det visade sig att det redan var gjort för lÀnge sedan.

Första försöket: ingenting att se.

Vad jag inte kan förstĂ„ Ă€r att det redan har portats applikationer för Haiku i mer Ă€n 10 Ă„r – trots att sjĂ€lva OS:et inte ens har version 1.0 Ă€n.

Andra försöket: mÄste skrivas om.

SÄ, jag kommer att anvÀnda ptouch-770, CLI för att styra Brother P-Touch 770-skrivarens etikettskrivning, som jag anvÀnder för att skriva etiketter.
Jag skriver olika etiketter med den, och ni kanske har sett den i en tidigare artikel. Tidigare skrev jag ett litet program med GUI pĂ„ Python (eftersom det Ă€r pĂ„ Gtk+ – det mĂ„ste skrivas om, men det Ă€r ett bra tillfĂ€lle att lĂ€ra sig).

Min femte dag med Haiku: lÄt oss portera lite program.
Brother P-Touch 770 etikettskrivare. Kommer den att fungera pÄ Haiku?

Haikus pakethanterare kĂ€nner till biblioteken och kommandona, sĂ„ om jag fĂ„r ett meddelande 'kan inte hitta libintl' vid uppstart konfigurera – kör bara pkgman install devel:libintl och den aktuella paketet kommer att hittas. PĂ„ samma sĂ€tt pkgman install cmd:rsync. NĂ„vĂ€l, och sĂ„ vidare.

Förutom nÀr det inte fungerar:

/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

Kanske Àr udev för mycket Linux-liknande, sÄ det finns inte för Haiku. Det innebÀr att jag mÄste redigera kÀllkoden som jag försöker kompilera.
Suck, jag kan inte hoppa högre Àn huvudet, och jag vet inte ens var jag ska börja.

Tredje försöket

Det skulle vara bra att ha tmate för Haiku, dĂ„ skulle jag lĂ„ta Haikus utvecklare koppla upp sig till min terminalsession – ifall nĂ„got gĂ„r fel. Instruktionerna Ă€r ganska enkla:

./autogen.sh
./configure
make
make install

Ser bra ut, sÄ varför inte testa detta pÄ 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

I det hÀr steget öppnar jag HaikuDepot och letar efter curses.
Det fanns nÄgot som gav mig en ledtrÄd för en mer korrekt förfrÄgan:

/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

Gick tillbaka till HaikuDepot, och hitta sjÀlvklart devel:msgpack_c_cpp_devel. Vad Àr det för konstiga namn?

/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

I det hÀr steget insÄg jag att flytten av programmet till Haiku krÀver betydligt mer kunskap Àn vad som behövs för en enkel omkompilering.
Jag pratade med vĂ€nliga utvecklare frĂ„n Haiku, det visade sig att det finns ett fel i msgpack, och efter nĂ„gra minuter ser jag en patch pĂ„ HaikuPorts. Jag ser verkligen hur det korrigerade paketet byggs hĂ€r (buildslave – virtuella maskiner).

Min femte dag med Haiku: lÄt oss portera lite program.
Bygger den korrigerade msgpack pÄ buildmaster

Under tiden skickar jag patchen till upstream för att lÀgga till stöd för Haiku i msgpack.

Fem minuter senare Àr den uppdaterade msgpack redan tillgÀnglig i 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.

Överraskande bra. Sa jag detta?!

ÅtervĂ€nder till den ursprungliga uppgiften:

/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

Just nu verkar det som att msgpack inte Àr boven. Jag kommenterar IMAXLABEL pÄ tty.c sÄ hÀr:

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

Resultatet:

osdep-unknown.c: I funktionen 'osdep_get_cwd':
osdep-unknown.c:32:19: varning: oanvÀnd parameter 'fd' [-Wunused-parameter]
osdep_get_cwd(int fd)
               ~~~~^~
make: *** Ingen regel för att göra mÄlet 'compat/forkpty-unknown.c', som behövs av 'compat/forkpty-unknown.o'.  Stopp.

HĂ€r gĂ„r vi igen
 Förresten:

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

mr. waddlesplash pekar pÄ vart man ska grÀva:

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

HĂ€r har jag lagt upp config.log.

Jag fick veta att det finns nÄgot mer med libresolv pÄ Haiku i libnetwork. Det verkar som om koden behöver justeras vidare. MÄste tÀnka...

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

Det stÀndiga frÄgan: vad hÀnder nu.

/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

Samma sak, men i profil. Sökte pÄ Google och hittade detta. Om man lÀgger till -lssp hjÀlper det 'ibland', jag testar:

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

Wow! Det startar! Men...

[tmate] ssh.tmate.io uppslagsfel. Försöker igen om 2 sekunder (ÄterstÀllningsfel i namnupplösning)

Jag ska försöka felsöka, filen finns hÀr:

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

"Bad port ID" – det Ă€r redan som ett visitkort haiku.Kanske nĂ„gon har en aning om vad som Ă€r fel och hur man rĂ€ttar till det? Om nĂ„got Ă€ndrar jag artikeln. LĂ€nk till GitHub.

Portering av GUI-applikationen till Qt.

VĂ€ljer en enkel QML-applikation.

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

Verkligen enkelt. Mindre Àn en minut!

Paketera applikationer i hpkg med hjÀlp av haikuporter och haikuports.

Vad ska jag börja med? Det finns ingen enkel dokumentation, jag gÄr till kanalen #haiku pÄ irc.freenode.net och hör:

  • Team paket — en lĂ„g nivĂ„ metod för att skapa paket. För det mesta rĂ€cker det med PackageInfo, som beskrivs i avsnittet "Att göra det till ett korrekt .hpkg-paket"
  • Jag behöver göra nĂ„got sĂ„dant
  • Det gĂ„r att anvĂ€nda hpkg-creator (det kraschar för mig, felrapporten)

Jag förstÄr inte vad jag ska göra. Jag antar att jag behöver en nybörjarguide i stil med "Hej, vÀrlden!", helst en video. Det skulle ocksÄ vara bra att fÄ en lÀtt tillgÄng till HaikuPorter, som i GNU hello.

Jag lÀser följande:

haikuporter Àr ett verktyg för att skapa gemensamma paketprojekt för Haiku. Det anvÀnder HaikuPorts-repositoriet som bas för alla paket. För att skapa paket anvÀnds haikuporter-recept.

Jag fÄr veta att:

Det Àr inte nödvÀndigt att ha recepten i HaikuPorts-lagret. Man kan skapa ett annat repository, placera recepten dÀr och sedan ange haikuporter till det.

Precis vad jag behöver — om man inte letar efter en offentlig lösning för paketet. Men det Ă€r ett Ă€mne för ett annat inlĂ€gg.

Installera haikuporter och 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/ # gör den körbar frÄn var som helst
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

Skriv ett recept

SUMMARY="Demo QtQuick-applikation"
DESCRIPTION="QtQuickApp Àr en demo QtQuick-applikation för testning av Haiku-portering och paketering"
HOMEPAGE="https://github.com/probonopd/QtQuickApp"
COPYRIGHT="Ingen"
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
}

Bygg receptet

Sparar filen med namnet QtQuickApp-1.0.recipe, och kör sedan haikuporter -S ./QuickApp-1.0.recipe. Kontrollera beroenden för alla paket i repositoriet haikuports, vilket tar lite tid. Jag gÄr och tar mig en kopp kaffe.

Varför ska denna kontroll göras pÄ min lokala maskin istÀllet för centralt pÄ servern en gÄng för alla?

Enligt mr. waddlesplash:

DĂ€rför att man kan skriva över vilken fil som helst i repositoriet 😉 Man kan optimera detta lite genom att berĂ€kna den nödvĂ€ndiga informationen nĂ€r det behövs, eftersom de senaste Ă€ndringarna Ă€r ganska sĂ€llsynta.

~/QtQuickApp> haikuporter QtQuickApp-1.0.recipe
Kontrollerar om nÄgra beroenden behöver uppdateras ...
Letar efter förÄldrade beroende-informationer ...
Fel: QtQuickApp hittades inte i repository

Det visar sig att det inte finns nÄgon vanlig receptfil som innehÄller koden för din applikation. Den mÄste förvaras i ett repository i HaikuPorts-format.

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

Denna faktum gör bygget mer krÄngligt. Jag gillar det inte sÀrskilt, men jag tror att det behövs för att sÄ smÄningom fÄ all öppen kÀllkod programvara i HaikuPorts.

Jag fÄr följande:

~\/QtQuickApp> haikuporter -S QtQuickApp-1.0.recipe
Kontrollerar om nÄgra beroendeinformationer behöver uppdateras ...
        uppdaterar beroendeinformationerna för QtQuickApp-1.0
Letar efter förÄldrad beroendeinformation ...
Fel: QtQuickApp-1.0.recipe hittades inte i trÀdet.

Vad Àr fel? Efter att ha lÀst irc gör jag:

~\/QtQuickApp> haikuporter -S QtQuickApp
Kontrollerar om nÄgra beroendeinformationer behöver uppdateras ...
        uppdaterar beroendeinformationerna för QtQuickApp-1.0
Letar efter förÄldrad beroendeinformation ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        \/boot\/home\/haikuports\/app-misc\/QtQuickApp\/QtQuickApp-1.0.recipe
----------------------------------------------------------------------Laddar ner: https:\/\/github.com\/probonopd\/QtQuickApp.git ...
--2019-07-14 16:12:44--  https:\/\/github.com\/probonopd\/QtQuickApp.git
Löser github.com... 140.82.118.3
Ansluter till github.com|140.82.118.3|:443... ansluten.
HTTP-förfrÄgan skickad, vÀntar pÄ svar... 301 Flyttad permanent
Plats: https:\/\/github.com\/probonopd\/QtQuickApp [följer]
--2019-07-14 16:12:45--  https:\/\/github.com\/probonopd\/QtQuickApp
ÅteranvĂ€nder existerande anslutning till github.com:443.
HTTP-förfrÄgan skickad, vÀntar pÄ svar... 200 OK
LÀngd: obestÀmd [text\/html]
Sparar till: ‘\/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’ sparad [90094]
Validerar checksum för QtQuickApp.git
Varning: ----- CHECKSUMMALMALL -----
Varning: CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"
Varning: -----------------------------
Fel: Ingen checksum hittades i receptet!

En intressant frĂ„ga uppstod. Om jag lĂ€gger till en checksum i receptet — kommer den att motsvara den senaste git-commit för kontinuerlig integration? (Utvecklaren bekrĂ€ftar: «Inget kommer att hĂ€nda. Recepten Ă€r utformade för att vara relativt stabila»).

För skojs skull lÀggs till i receptet:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Är fortfarande inte bra:

~\/QtQuickApp> haikuporter -S QtQuickApp
Kontrollerar om nÄgra beroendeinformationer behöver uppdateras ...
        uppdaterar beroendeinformationerna för QtQuickApp-1.0
Letar efter förÄldrad beroendeinformation ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        \/boot\/home\/haikuports\/app-misc\/QtQuickApp\/QtQuickApp-1.0.recipe
----------------------------------------------------------------------
Hoppar över nedladdning av kÀllan för QtQuickApp.git
Validerar checksum för QtQuickApp.git
Paketerar upp kÀllan för QtQuickApp.git
Fel: OigenkÀnd arkivtyp i filen \/boot\/home\/haikuports\/app-misc\/QtQuickApp\/download\/QtQuickApp.git

Vad handlar det om? Det hÀr Àr ett git-repo, koden finns redan dÀr direkt, inget behöver packas upp. Enligt min Äsikt bör verktyget vara tillrÀckligt smart för att inte behöva leta efter en uppackare nÀr det har en url frÄn GitHub.

Kanske fungerar uri git://

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

Nu klagar det sÄ hÀr:

Laddar ner: git://github.com/probonopd/QtQuickApp.git ...
Fel: Neddelning frÄn osÀkra kÀllor Àr avaktiverad i haikuports.conf!

Hmm, varför Àr allt sÄ komplicerat? Varför kan man inte "bara jobba"? I slutÀndan Àr det inte sÄ sÀllan man kan bygga nÄgot frÄn GitHub. Det handlar om verktyg som fungerar direkt, utan behov av konfigurering, eller som jag kallar det "kringlat".

Kanske fungerar det sÄ hÀr:

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

Nej. FÄr fortfarande det dÀr konstiga felet och gör, som beskrivs hÀr

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

Jag kommer lite lÀngre, men varför skriker det Ät mig (GitHub Àr ju inte sÀkert!) och försöker fortfarande packa upp nÄgot.

Enligt mr. waddlesplash:

Ja, orsaken Àr önskan att verifiera integriteten hos de data som anvÀnds för bygget. Ett alternativ Àr att kontrollera checksumma av arkivet, men man kan naturligtvis Àven hashera enskilda filer, vilket inte kommer att implementeras eftersom det tar betydligt mer tid. Följden av detta Àr "osÀkerheten" hos git och andra VCS. Troligtvis kommer det alltid att vara sÄ, eftersom det Àr ganska lÀtt att skapa ett arkiv pÄ GitHub och ofta snabbare. Och i framtiden kanske felmeddelandet inte blir sÄ skrikande... (vi utför fler sammanfogningar av sÄdana recept i HaikuPorts).

~QtQuickApp> haikuporter -S QtQuickApp
Kontrollerar om nÄgra beroende-info behöver uppdateras ...
Letar efter förÄldrad beroende-info ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------Laddar ner: git+https://github.com/probonopd/QtQuickApp.git ...
Varning: OSÄKRA KÄLLOR ÄR DÅLIGA OCH BÖR INTE ANVÄNDAS I PRODUKTION
Varning: FLYTTA TILL NEDLADDNING AV STATISK ARKIV MED CHECKSUM ASAP!
Klonar till ett tomt repository '/boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git'...
Packar upp kÀllan till QtQuickApp.git
tar: /boot/home/haikuports/app-misc/QtQuickApp/work-1.0/sources/QtQuickApp-1.0: Kan inte öppnas: Ingen sÄdan fil eller katalog
tar: Felet Àr inte ÄterstÀllbart: avslutar nu
Kommandot 'git archive HEAD | tar -x -C "/boot/home/haikuports/app-misc/QtQuickApp/work-1.0/sources/QtQuickApp-1.0"' ÄtervÀnde icke-noll avslutningsstatus 2

Av gammal vana gÄr jag och frÄgar trevliga mÀnniskor pÄ kanalen #haiku i nÀtverket irc.freenode.net. Och vart skulle jag vara utan dem? Efter en ledtrÄd insÄg jag att jag mÄste anvÀnda:

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

Det Ă€r klart att det gör vad det ska — laddar ner arkivet med kĂ€llkoden frĂ„n en viss revision. Det kĂ€nns dumt, enligt mig, och inte riktigt vad jag ville, nĂ€mligen — ladda ner den senaste revisionen frĂ„n master-grenen.

En av utvecklarna förklarade det sÄ hÀr:

Vi har vÄr egen CI, sÄ allt som lÀggs i haikuports-repositoriet kommer att paketeras för alla anvÀndare, och vi vill inte ta nÄgra risker med att bygga och leverera "allt i den senaste versionen frÄn upstream".

Jag förstÄr! I alla fall resulterade det i detta:

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

Det upprepas sÄ hÀr i det oÀndliga. Det verkar som ett fel (finns det en rapport? Jag har inte hittat nÄgon).

Med haikuporter och repository haikuports Jag kĂ€nner inte av nivĂ„erna av "det fungerar bara", men som utvecklare gillar jag vissa saker med att arbeta med Haiku. I stort sett liknar det Open Build Service — en uppsĂ€ttning verktyg för att bygga Linux-paket: extremt kraftfullt, med ett systematiskt tillvĂ€gagĂ„ngssĂ€tt, men överflödigt för min enklare applikation pĂ„ "hello world"-nivĂ„.

Återigen, enligt mr. waddlesplash:

Verkligen, HaikuPorter Àr ganska strikt som standard (plus det finns lint-lÀge och strikt lÀge som gör det Ànnu strÀngare!), men bara för att det skapar paket som fungerar, och inte bara för att skapa paket. DÀrför klagar det pÄ odeklarerade beroenden, felaktigt importerade bibliotek, felaktiga versioner, etc. MÄlet Àr att fÄnga alla problem, inklusive framtida, innan anvÀndaren fÄr reda pÄ dem (dÀrför gick det inte att installera avrdude, eftersom det i receptet faktiskt angavs ett beroende). Bibliotek Àr inte bara separata paket och inte ens definierade versioner av SO. HaikuPorter ser till att allt detta följs i recepten för att undvika runtime-fel.

I princip Àr denna strÀnghetsnivÄ motiverad vid skapandet av ett operativsystem, men jag tycker att den Àr överdriven för en "hello world"-applikation. Jag bestÀmde mig för att försöka nÄgot annat.

Bygg applikationer i hpkg-format, med kommandot "package create"

Kanske detta en enkel instruktion passar mig bÀttre?

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

summary "Demo QtQuick application"
description "QtQuickApp Àr en demonstrationsapplikation för QtQuick för att testa Haiku-portering och paketering"

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# Se nedan om du ocksÄ vill att applikationen
# ska visas i menyn

Överraskande snabbt, överraskande enkelt, överraskande effektivt. Precis som jag gillar det, fantastiskt!

Installation — vad och vart?

Jag flyttade filen QtQuickApp.hpkg till ~/config/packages, med hjÀlp av filhanteraren, efter vilket QtQuickApp magiskt dök upp i ~/config/apps.
Återigen överraskande snabbt, enkelt och effektivt. Fantastiskt, otroligt!

Men
 (vad skulle det annars vara!)

Applikationen syns fortfarande inte i listan över applikationer och i QuickLaunch. Jag tror att jag redan vet hur man ÄtgÀrdar det. I filhanteraren flyttar jag QtQuickApp.hpkg frÄn ~/config/packages till /system/packages.

Nej, den Àr fortfarande inte dÀr. Tydligen har jag (och instruktionen) missat nÄgot.

NĂ€r jag granskade fliken "InnehĂ„ll" i HaikuDepot för nĂ„gra andra applikationer sĂ„g jag att det finns filer av typen /data/mimedb/application/x-vnd... vad som Ă€r Ă€nnu mer anmĂ€rkningsvĂ€rt, /data/deskbar/menu/Applications/
.

NÄvÀl, vad ska jag lÀgga dÀr? LÄt mig se


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

Jag Àr ganska sÀker pÄ att det hÀr knepet kommer att fungera, men jag har frÄgor kvar: varför behövs det, vad anvÀnds det till? Jag tycker att det förstör den allmÀnna uppfattningen om att systemet Àr sÄ förfinat.

Som mr. waddlesplash förklarade:

Ibland finns det applikationer som andra applikationer behöver, men inte i menyn. Till exempel, LegacyPackageInstaller pÄ din skÀrmdump som hanterar .pkg-arkiv i BeOS-format. Man vill att anvÀndarna ska kunna installera dem, men deras nÀrvaro i menyn skulle leda till förvirring.

Jag har en kÀnsla av att det finns en enklare lösning, till exempel Hidden=true i filerna .desktop pÄ Linux. Varför inte göra "dold" information till en resurs och filsystemattribut?

Vad som sĂ€rskilt inte Ă€r förfinat — namnet (pĂ„ nĂ„gon) applikation som visar menyn, deskbar, Ă€r hĂ„rt kopplat i sökvĂ€gen.

mr. waddlesplash förklarar det hÀr:

"Deskbar" bör i det hÀr fallet förstÄs som en allmÀn term (ungefÀr pÄ samma sÀtt som "taskbar" relaterar till en Windows-applikation och till ett allmÀnt koncept). Och eftersom detta deskbar, istÀllet för "Deskbar", kan det ocksÄ förstÄs pÄ liknande sÀtt.

Min femte dag med Haiku: lÄt oss portera lite program.
2 "nÀstan identiska" kataloger med applikationer i dem

Varför finns det tvÄ kataloger med appar, och varför finns min QtQuickApplication i den ena men inte i den andra? (Eftersom detta inte Àr en systemkatalog utan en anvÀndarkatalog, som personligen skulle vara tydlig för mig).
Jag Àr verkligen förvirrad och tycker att vi bör enhetsdela detta.

Kommentar frÄn mr. waddlesplash

I katalogen Appar finns det appar som inte Àr nödvÀndiga i menyn. Men situationen med menyn behöver faktiskt förbÀttras, sÄ att den blir mer anpassningsbar.

Ansökan, eller sĂ„ kommer detta inte att hĂ€nda 😉

Jag har funderat: Ă€r det verkligen nödvĂ€ndigt att placera appar i /system/apps, om anvĂ€ndarna inte ska se dem dĂ€r – oönskat. Kanske Ă€r det bĂ€ttre att lĂ€gga dem pĂ„ ett annat stĂ€lle dĂ€r anvĂ€ndaren inte kommer att stöta pĂ„ dem? Precis som det görs i Mac OS X, dĂ€r innehĂ„llet i paket .*.app, som inte bör vara synligt för anvĂ€ndaren i /Applications, göms djupt i /System/Library/
“`.

Vad hÀnder med beroenden?

Jag tror att vi borde pÄ nÄgot sÀtt ange beroenden, eller hur? Kan Qt anses vara en obligatorisk del av installationen av Haiku som standard? Nej! Qt Àr inte förinstallerat. Kan paketbyggarprogrammet automatiskt identifiera beroenden genom att kontrollera ELF-filer? Jag har hört att HaikuPorter verkligen gör sÄ, men paket nej. Allt eftersom det bara Àr en "paketbyggare" som i sig sjÀlv bara skapar filer. hpkg.

Borde Haiku göras mer sofistikerad genom att införa en policy som sĂ€ger att ett paket inte fĂ„r ha beroenden frĂ„n paket som inte ingĂ„r i haikuports? (ĐœĐœĐ” бы таĐș Ń…ĐŸŃ‚Đ”Đ»ĐŸŃŃŒ, ĐżĐŸŃĐșĐŸĐ»ŃŒĐșу ĐżĐŸĐŽĐŸĐ±ĐœĐ°Ń ĐżĐŸĐ»ĐžŃ‚ĐžĐșа Đ·ĐœĐ°Ń‡ĐžŃ‚Đ”Đ»ŃŒĐœĐŸ ĐŸĐ±Đ»Đ”ĐłŃ‡Đ°Đ”Ń‚ Đ·Đ°ĐŽĐ°Ń‡Ńƒ — ŃĐžŃŃ‚Đ”ĐŒĐ° ŃĐŒĐŸĐłĐ»Đ° бы аĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐž Ń€Đ°Đ·Ń€Đ”ŃˆĐžŃ‚ŃŒ заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ паĐșДта, Đ·Đ°ĐłŃ€ŃƒĐ¶Đ°Đ”ĐŒĐŸĐłĐŸ ĐŸŃ‚ĐșуЎа ŃƒĐłĐŸĐŽĐœĐŸ, бДз ĐČĐŸĐ·ĐœĐž с ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœŃ‹ĐŒĐž ĐžŃŃ‚ĐŸŃ‡ĐœĐžĐșĐ°ĐŒĐž паĐșĐ”Ń‚ĐŸĐČ).

mr. waddlesplash förklarar:

Vi vill inte begrĂ€nsa utvecklarnas frihet sĂ„ mycket, eftersom det Ă€r uppenbart att om FöretagX vill stödja sin egen uppsĂ€ttning mjukvara med beroenden (och dĂ€rmed ett repo) – dĂ„ kan de helt fritt göra det.

I sĂ„ fall skulle det kanske vara bra att rekommendera externa paket att undvika beroenden frĂ„n nĂ„got som inte ingĂ„r i haikuports, genom att paketera allt nödvĂ€ndigt med applikationen. Men jag tror att detta Ă€r ett Ă€mne för en framtida artikel i den hĂ€r serien. [Författaren syftar pĂ„ AppImage? – anm. övers.]

LĂ€gg till en appikon

Vad hÀnder om jag vill lÀgga till en av de snygga inbyggda ikonerna i resurserna för min nyss skapade applikation? Det visar sig vara ett fascinerande Àmne, sÄ det kommer att bli huvudtemat för nÀsta artikel.

Hur organiserar man kontinuerlig byggnation av applikationer?

FörestÀll dig ett projekt liknande Inkscape (ja, jag Àr medveten om att det för tillfÀllet inte finns i Haiku, men det Àr enkelt att visa). De har ett kÀllkodsrepository. https://gitlab.com/inkscape/inkscape.
Varje gĂ„ng nĂ„gon sparar sina Ă€ndringar i repositoryn, startas byggpipeline som automatiskt testar Ă€ndringarna, bygger applikationen och paketerar den i olika format, inklusive AppImage för Linux (ett fristĂ„ende applikationspaket som kan laddas ner för lokal testning oavsett vad som kan eller inte kan installeras pĂ„ systemet). [jag visste det! — översĂ€ttarens kommentar]). PĂ„ liknande sĂ€tt sker allt vid varje begĂ€ran om sammanslagning av grenar, sĂ„ att man kan ladda ner en applikation byggd av koden som föreslagits i sammanslagningsbegĂ€ran, innan sammanslagningen.

Min femte dag med Haiku: lÄt oss portera lite program.
SammanslagningsbegÀran med byggstatus och möjlighet att ladda ner de byggda binÀrerna i hÀndelse av en framgÄngsrik byggning (markerad i grönt).

Byggningen körs i Docker-containrar. GitLab erbjuder gratis runners pÄ Linux, och jag tror dessutom att det Àr möjligt att ansluta egna runners (förresten, jag kan inte förestÀlla mig hur det skulle fungera för system som Haiku, som jag vet inte har Docker eller en motsvarighet, men för FreeBSD finns det ocksÄ ingen Docker, sÄ det hÀr problemet Àr inte unikt för Haiku).

Idealiskt sett skulle byggandet av applikationer för Haiku kunna utföras inuti en Docker-container för Linux. I det scenariot kan byggandet för Haiku integreras i existerande pipelines. Finns det korskompilatorer? Eller behöver man emulera hela Haiku inuti Docker-containern, med nĂ„got som QEMU/KVM (förutsatt att det kommer att fungera sĂ„ inom Docker)? Förresten anvĂ€nder mĂ„nga projekt liknande principer. Till exempel fungerar Scribus sĂ„ — det Ă€r redan tillgĂ€ngligt för Haiku. En dag kommer jag att kunna skicka sĂ„dana sammanslagningsbegĂ€randen till andra projekt för att lĂ€gga till stöd för Haiku.

En av utvecklarna förklarar:

För andra projekt som vill skapa paket pÄ egen hand stöds den vanliga metoden CMake/CPack. Andra byggsystem kan stödjas om paketbyggprogrammet anropas direkt, vilket Àr bra om folk Àr intresserade av det. Erfarenheten visar: hittills har det inte funnits nÄgot stort intresse, sÄ haikuporter har fungerat som vi tycker Àr praktiskt, men i slutÀndan bör bÄda metoderna fungera tillsammans. Vi bör tillhandahÄlla en uppsÀttning verktyg för korsbyggande av mjukvara frÄn Linux eller nÄgot annat serveroperativsystem (Haiku Àr inte avsedd att köras pÄ servrar).

Jag applÄderar stÄende. Vanliga Linux-anvÀndare bÀr pÄ all denna extra belastning och extra krav (sÀkerhet, strikt kontroll etc.) som behövs för serveroperativsystem, men inte för personliga. DÀrför hÄller jag helt med om att möjligheten att bygga applikationer för Haiku pÄ Linux Àr rÀtt vÀg.

Slutsats

Portning av POSIX-applikationer till Haiku Àr möjligt, men kan krÀva mer resurser Àn vanlig Äterbyggning. Jag skulle definitivt ha fastnat vid detta lÀnge om det inte var för hjÀlpen frÄn folk frÄn kanalen #haiku pÄ nÀtverket irc.freenode.net. Men Àven de sÄg inte alltid direkt vad som var fel.

Applikationer skrivna i Qt Àr ett lÀtt undantag. Jag byggde en enkel demonstrationsapplikation utan nÄgra större problem.

Att bygga paket för enkla applikationer Àr ocksÄ ganska enkelt, men bara för de "utslÀppta pÄ traditionellt sÀtt", d.v.s. de som har versionskontrollerade kÀllkodsarkiv avsedda för stöd i haikuports. För kontinuerlig byggnad (bygge vid varje commit) frÄn GitHub verkar allt inte sÄ enkelt. HÀr kÀnns Haiku mer som en Linux-distribution Àn resultatet pÄ Mac, dÀr ett enkelt knappltryck i XCode ger ett paket .*.app, redo att sÀttas in i diskavbilden. .dmg, förberett för uppladdning pÄ min webbplats.
Kontinuerlig byggning av applikationer baserat pÄ "server"-operativsystem, t.ex. Linux, kommer sannolikt att bli möjlig om det finns efterfrÄgan frÄn utvecklarna, men för tillfÀllet har projektet Haiku andra, mer akuta uppgifter.

Prova sjÀlv! Eftersom Haiku-projektet tillhandahÄller bilder för nedladdning frÄn DVD eller USB, som skapas dagligen. För installationen rÀcker det med att ladda ner en bild och skriva den pÄ ett USB-minne med hjÀlp av Etcher

Har du frÄgor? VÀlkommen till vÄr svensksprÄkiga telegramkanal.

Felkod: Hur man skjuter sig sjÀlv i foten i C och C++. En samling recept för Haiku OS

FrÄn författare översÀttning: detta Àr den femte artikeln i cykeln om Haiku.

Artikellista: Första Andra Tredje FjÀrde

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster