
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.

Mitt första portade program för Haiku, paketerat i dess hpkg-format.
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 och , samt i frÄn HaikuPorts hittade jag rÀtt riktning. Det finns till och med en PDF-bok online. .
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 , men det visade sig att det redan var för lÀnge sedan.
Första försöket: ingenting att se.
Vad jag inte kan förstĂ„ Ă€r att det redan har â 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 , 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).

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 foundKanske À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 installSer 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 foundI 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 foundGick 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 1I 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 (buildslave â virtuella maskiner).

Bygger den korrigerade msgpack pÄ buildmaster
Under tiden skickar jag patchen till upstream .
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 1Just 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... nopekar 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 .
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 foundSamma sak, men i profil. Sökte pÄ Google och . 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> ./tmateWow! 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, :
/Haiku/home/tmate> strace -f ./tmate >log 2>&1"Bad port ID" â det Ă€r redan som ett visitkort 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 .
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
- Det gÄr att anvÀnda (det kraschar för mig, )
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.confSkriv 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 , 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 repositoryDet 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.recipeDenna 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.gitVad 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,
sed -i -e 's|#ALLOW_UNSAFE_SOURCES|ALLOW_UNSAFE_SOURCES|g' /boot/home/config/settings/haikuports.confJag 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 :
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 2Av 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 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 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 dataJag À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.

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.

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 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 . För installationen rÀcker det med att ladda ner en bild och skriva den pÄ ett USB-minne med hjÀlp av
Har du frÄgor? VÀlkommen till vÄr svensksprÄkiga .
Felkod:
FrÄn översÀttning: detta Àr den femte artikeln i cykeln om Haiku.
Artikellista:
KĂ€lla: habr.com
