Ang aking ikalimang araw sa Haiku: mag-port tayo ng ilang mga programa

Ang aking ikalimang araw sa Haiku: mag-port tayo ng ilang mga programa

Tl; DR: Nakita ng isang newbie ang Haiku sa unang pagkakataon, sinusubukang i-port ang ilang mga programa mula sa mundo ng Linux.

Ang aking ikalimang araw sa Haiku: mag-port tayo ng ilang mga programa
Ang aking unang Haiku ported program, naka-package sa hpkg na format nito

Kamakailan lamang Natuklasan ko ang Haiku, isang nakakagulat na mahusay na operating system para sa mga PC.
Ngayon ay matututunan ko kung paano mag-port ng mga bagong program sa operating system na ito. Ang pangunahing pokus ay isang paglalarawan ng unang karanasan ng paglipat sa Haiku mula sa punto ng view ng isang developer ng Linux. Humihingi ako ng paumanhin para sa anumang mga katangahang pagkakamali na nagawa ko sa daan, dahil wala pang isang linggo mula noong una kong na-download ang Haiku.

Gusto kong makamit ang tatlong layunin:

  • Mag-port ng isang simpleng CLI application
  • Mag-port ng application mula sa GUI patungo sa Qt
  • Pagkatapos ay i-package ang mga ito sa hpkg na format (dahil iniisip ko pa rin ang tungkol sa pag-adapt ng AppDir at AppImage para sa Haiku...)

Magsimula na tayo. Sa mga seksyon ang babasahin ΠΈ kaunlaran, pati na rin sa wiki mula sa HaikuPorts nakita ko ang tamang direksyon. Mayroong kahit isang online na PDF book BeOS: Pag-port ng Unix Application.
467 mga pahina - at ito ay mula noong 1997! Nakakatakot tingnan ang loob, pero umaasa ako sa ikabubuti. Ang mga salita ng nag-develop ay nakapagpapatibay: "nagtagal ito dahil ang BeOS ay hindi sumusunod sa POSIX," ngunit ang Haiku "para sa karamihan" ay ganoon na.

Pag-port ng isang simpleng CLI application

Ang unang naisip ay i-port ang application avrdude, ngunit, tulad ng nangyari, ito na nagawa na matagal na panahon.

Unang pagsubok: walang panoorin

Ang hindi ko maintindihan ay na Na-port na ang mga app sa Haiku nang mahigit 10 taon - sa kabila ng katotohanan na ang OS mismo ay hindi pa bersyon 1.0.

Pangalawang pagtatangka: kailangang muling isulat

Kaya gagamitin ko ptouch-770, CLI para sa pagkontrol sa Brother P-Touch 770 printer na ginagamit ko sa pag-print ng mga label.
Nag-print ako ng iba't ibang mga label dito, at maaaring nakita mo na ito sa nakaraang artikulo. Medyo mas maaga, nagsulat ako ng isang maliit na programa ng pambalot ng GUI sa Python (dahil ito ay nasa Gtk+, kailangan itong muling isulat, at ito ay isang magandang dahilan upang matuto).

Ang aking ikalimang araw sa Haiku: mag-port tayo ng ilang mga programa
Brother P-Touch 770 label printer. Gagana ba ito sa Haiku?

Alam ng tagapamahala ng package ng Haiku ang tungkol sa mga aklatan at utos, kaya kung makatanggap ako ng mensaheng "hindi mahanap ang libintl" kapag tumatakbo configure - Kaka-launch ko lang pkgman install devel:libintl at makikita ang kinakailangang pakete. Ganun din pkgman install cmd:rsync. Well, atbp.

Maliban kapag hindi ito gumana:

/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

Marahil ang udev ay masyadong nakabatay sa Linux at samakatuwid ay hindi umiiral para sa Haiku. Na nangangahulugan na kailangan kong i-edit ang source code na sinusubukan kong i-compile.
Eh, you can’t jump over your head, at hindi ko rin alam kung saan magsisimula.

Pangatlong pagsubok

Masarap magkaroon tmate para sa Haiku, pagkatapos ay papahintulutan ko ang mga developer ng Haiku na kumonekta sa aking terminal session - kung sakaling may magkamali. Ang mga tagubilin ay medyo simple:

./autogen.sh
./configure
make
make install

Mukhang maganda, kaya bakit hindi subukan ito sa 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

Sa hakbang na ito binuksan ko ang HaikuDepot at naghahanap curses.
May natagpuan, na nagbigay sa akin ng pahiwatig para sa isang mas mahusay na query:

/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

Muli akong nagpunta sa HaikuDepot, at, siyempre, natagpuan devel:msgpack_c_cpp_devel. Ano ang mga kakaibang pangalan na ito?

/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

Sa hakbang na ito, napagtanto ko na ang pag-port ng isang programa sa Haiku ay nangangailangan ng higit na kaalaman kaysa sa kinakailangan para sa isang simpleng muling pagtatayo.
Nakipag-usap ako sa magiliw na mga developer ng Haiku, lumalabas na mayroong isang bug sa msgpack, at pagkatapos ng ilang minuto ay nakakita ako ng isang patch sa HaikuPorts. Nakikita ko sa sarili kong mga mata kung paano ang naitama na pakete papunta dito (buildslave - mga virtual machine).

Ang aking ikalimang araw sa Haiku: mag-port tayo ng ilang mga programa
Pagbuo ng naitama na msgpack sa buildmaster

Sa pagitan ng mga oras na nagpapadala ako ng isang patch sa upstream upang magdagdag ng suporta sa Haiku sa msgpack.

Pagkalipas ng limang minuto, available na ang na-update na msgpack sa 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.

Hindi inaasahang mabuti. Sinabi ko ba iyon?!

Bumalik ako sa orihinal na problema:

/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

Ngayon mukhang walang kasalanan ang msgpack. nagkomento ako IMAXLABEL Π² tty.c ganito:

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

Resulta:

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.

Well, eto na naman... By the way:

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

Ginoo. waddlesplash nagsasabi sa iyo kung saan maghukay:

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

Dito ako nagpost config.log.

Ipinaliwanag nila sa akin na may iba pa sa libnetwork bilang karagdagan sa libresolv sa Haiku. Tila kailangan pang i-edit ang code. Kailangang isipin…

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

Ang walang hanggang tanong: ano ang nangyayari?

/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

Ang parehong bagay, lamang sa profile. Googled at natagpuan ito. Kung magdadagdag ka -lssp Nakakatulong ang "minsan", sinusubukan kong:

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

Wow! Nagsisimula na! Pero…

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

Susubukan kong i-debug file dito:

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

Ang β€œBad port ID” ay parang business card na haiku. Baka may ideya kung ano ang mali at paano ito ayusin? Kung gayon, ia-update ko ang artikulo. Link sa GitHub.

Pag-port ng GUI application sa Qt.

Pumili ako ng simpleng QML application.

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

Talagang simple. Wala pang isang minuto!

Packaging application sa hpkg gamit ang haikuporter at haikuports.

Ano ang dapat kong simulan? Walang simpleng dokumentasyon, pumunta ako sa #haiku channel sa irc.freenode.net at narinig ko:

  • Koponan package - isang mababang antas na paraan upang lumikha ng mga pakete. Para sa karamihan, ang PackageInfo ay sapat na para sa kanya, tulad ng inilarawan sa seksyong "Paggawa nito sa isang maayos na .hpkg na pakete"
  • May kailangan akong gawin tulad
  • Maaaring gamitin hpkg-tagalikha (nag-crash ito para sa akin, pag-uulat ng error)

Hindi malinaw kung ano ang gagawin. Kailangan ko yata ng Hello World style beginner's guide, ideal na isang video. Mainam na magkaroon din ng maginhawang pagpapakilala sa HaikuPorter, tulad ng ginagawa sa GNU hello.

Binabasa ko ang sumusunod:

haikuporter ay isang tool para sa paglikha ng mga karaniwang package project para sa Haiku. Ginagamit nito ang repositoryo ng HaikuPorts bilang batayan para sa lahat ng mga pakete. Ang mga recipe ng Haikuporter ay ginagamit upang lumikha ng mga pakete.

Bilang karagdagan, nalaman ko na:

Hindi na kailangang mag-imbak ng mga recipe sa imbakan ng HaikuPorts. Maaari kang gumawa ng isa pang repository, ilagay ang mga recipe sa loob nito, at pagkatapos ay ituro ang haikuporter dito.

Ang kailangan ko lang - kung hindi naghahanap ng paraan para mailabas sa publiko ang package. Ngunit ito ay isang paksa para sa isa pang post.

Pag-install ng haikuporter at 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

Pagsusulat ng recipe

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
}

Pagtitipon ng recipe

I-save ko ang file sa ilalim ng pangalan QtQuickApp-1.0.recipe, pagkatapos ay inilunsad ko aikuporter -S ./QuickApp-1.0.recipe. Ang mga dependency ay sinusuri para sa lahat ng mga pakete sa repositoryo haikuports, na tumatagal ng ilang oras. Kukuha ako ng kape.

Bakit dapat gawin ang pagsusuring ito sa aking lokal na makina, at hindi sa server nang isang beses para sa lahat?

Ayon kay mr. waddlesplash:

Sa ganoong paraan maaari mong muling isulat ang anumang file sa repositoryo πŸ˜‰ Maaari mong i-optimize ito nang kaunti, kinakalkula ang kinakailangang impormasyon kung kinakailangan, dahil ang mga huling pagbabagong ginawa ay medyo bihira.

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

Lumalabas na walang isang regular na file ng recipe na naglalaman ng source code ng iyong application. Kailangan mong itago ito sa isang repository sa format na HaikuPorts.

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

Ang katotohanang ito ay ginagawang mas mahirap ang pagpupulong. Hindi ko ito gusto lalo na, ngunit sa tingin ko ito ay kinakailangan upang sa huli ang lahat ng open source software ay lalabas sa HaikuPorts.

Nakukuha ko ang sumusunod:

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

Ano ang mali? Pagkatapos basahin ang irc ginagawa ko:

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

Isang kawili-wiling tanong ang lumitaw. Kung magdagdag ako ng checksum sa recipe - tutugma ba ito sa pinakabagong git commit para sa patuloy na pagsasama? (Kinukumpirma ng developer: "Hindi ito gagana. Ang mga recipe ay idinisenyo upang maging medyo matatag.")

Para sa kasiyahan, idagdag sa recipe:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Hindi pa nasiyahan:

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

Ano ang ginagawa niya? Pagkatapos ng lahat, ito ay isang git repository, ang code ay naroroon nang direkta, walang dapat i-unpack. Mula sa aking pananaw, ang tool ay dapat sapat na matalino upang hindi maghanap ng isang unpacker kung ito ay nasa itaas ng GitHub url.

Marahil ay gagana ang uri git://

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

Ngayon nagrereklamo ito ng ganito:

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

Hmm, bakit napakakumplikado ng lahat, bakit hindi mo magawang "magtrabaho"? Pagkatapos ng lahat, hindi pangkaraniwan na bumuo ng isang bagay mula sa GitHub. Kung ito man ay mga tool na gumagana kaagad, nang hindi nangangailangan ng pag-setup, o bilang tinatawag ko itong "pagkakaabala".

Marahil ito ay gagana nang ganito:

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

Hindi. Nakukuha ko pa rin ang kakaibang error na ito at ginagawa ko, gaya ng inilarawan dito

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

Medyo lumayo pa ako, pero bakit ako sinisigawan nito (GitHub is not secure!) At sinusubukan pa ring mag-unpack ng isang bagay.

Ayon sa Ginoo. waddlesplash:

Well, oo, ang dahilan ay ang pagnanais na suriin ang integridad ng data na natanggap para sa pagpupulong. Ang isa sa mga pagpipilian ay upang i-verify ang checksum ng archive, ngunit maaari mong, siyempre, i-hash ang mga indibidwal na file, na hindi ipapatupad, dahil mas matagal. Ang kinahinatnan nito ay ang "insecurity" ng git at iba pang VCS. Ito ay malamang na palaging ang kaso, dahil ang paggawa ng isang archive sa GitHub ay medyo madali at madalas na mas mabilis. Buweno, sa hinaharap, marahil ang mensahe ng error ay hindi masyadong kahanga-hanga... (hindi na namin pinagsama-sama ang mga naturang recipe sa HaikuPorts).

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

Dahil sa dating ugali, nagtatanong ako sa mabubuting tao sa #haiku channel sa irc.freenode.net network. At saan ako kung wala sila? Pagkatapos ng pahiwatig, natanto ko na dapat kong gamitin ang:

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

Okay, naging malinaw kung ano ang ginagawa nito - nagda-download ito ng archive na may source code ng isang partikular na rebisyon. Ito ay hangal, mula sa aking pananaw, at hindi eksakto kung ano ang gusto ko, ibig sabihin, upang i-download ang pinakabagong rebisyon mula sa master branch.

Ipinaliwanag ito ng isa sa mga developer sa ganitong paraan:

Mayroon kaming sariling CI, kaya lahat ng nakalagay sa haikuports repository ay ipapakete para sa lahat ng user, at ayaw naming ipagsapalaran ang pagkolekta at paghatid ng "lahat sa pinakabagong bersyon upstream."

Naiintindihan! Sa anumang kaso, ito ang nangyari:

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

Inuulit nito ang ad na ito na walang katapusan. Tila ito ay isang error (may aplikasyon ba? Hindi ko ito mahanap).

Π‘ haikuporter at imbakan haikuports Wala itong pakiramdam na "gumana lang", ngunit bilang isang developer, may ilang bagay na gusto ko tungkol sa pakikipagtulungan sa Haiku. Para sa karamihan, ito ay katulad ng Open Build Service, isang set ng mga tool para sa pagbuo ng Linux build: napakalakas, na may sistematikong diskarte, ngunit overkill para sa aking maliit na "hello world" na application.

Muli, ayon kay mr. waddlesplash:

Sa katunayan, ang HaikuPorter ay medyo mahigpit bilang default (kasama ang isang lint mode pati na rin ang isang mahigpit na mode upang gawin itong mas mahigpit!), ngunit dahil lamang ito ay lumilikha ng mga pakete na gagana, sa halip na lumikha lamang ng mga pakete. Kaya naman nagrereklamo siya tungkol sa mga hindi idineklara na dependency, mga library na hindi na-import nang maayos, mga maling bersyon, atbp. Ang layunin ay upang mahuli ang anuman at lahat ng mga problema, kabilang ang mga hinaharap, bago malaman ng gumagamit ang tungkol dito (ito ang dahilan kung bakit hindi posible na mag-install ng avrdude, dahil ang dependency ay aktwal na tinukoy sa recipe). Ang mga aklatan ay hindi lamang mga indibidwal na pakete o kahit na mga partikular na bersyon ng SO. Tinitiyak ng HaikuPorter na ang lahat ng ito ay sinusunod sa mga recipe mismo upang maiwasan ang mga error sa panahon ng pagpapatupad.

Sa prinsipyo, ang antas ng higpit na ito ay makatwiran kapag lumilikha ng isang operating system, ngunit tila hindi kailangan sa akin para sa isang "hello world" na application. Nagpasya akong sumubok ng iba.

Bumuo ng mga application sa hpkg na format gamit ang command na "package create".

Siguro ito Mas gagana ba sa akin ang mga simpleng tagubilin?

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

Hindi inaasahang mabilis, hindi inaasahang simple, hindi inaasahang epektibo. Eksakto kung paano ko ito nagustuhan, kamangha-manghang!

Pag-install - ano at saan?

Inilipat ang QtQuickApp.hpkg file sa ~/config/packagesgamit ang isang file manager, pagkatapos nito ay mahiwagang lumabas ang QtQuickApp ~/config/apps.
Muli, hindi inaasahang mabilis, simple at epektibo. Kahanga-hanga, hindi kapani-paniwala!

Ngunit... (saan tayo kung wala sila!)

Nawawala pa rin ang app sa listahan ng menu ng apps at QuickLaunch. Parang alam ko na kung paano ayusin. Sa file manager inilipat ko ang QtQuickApp.hpkg mula sa ~/config/packages patungo sa /system/packages.

Wala, kulang pa. Tila, ako (well, at ang mga tagubilin) ​​ay nakaligtaan ng isang bagay.

Nang tumingin ako sa tab na "Mga Nilalaman" sa HaikuDepot para sa ilang iba pang mga application, nakita ko na may mga file tulad ng /data/mimedb/application/x-vnd... ang mas kapansin-pansin ay /data/deskbar/menu/Applications/….

Well, ano ang dapat kong ilagay doon? Halika...

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

Sigurado ako na gagana ang trick na ito, ngunit nananatili ang mga tanong: bakit kailangan ito, para saan ito? Sa tingin ko, sinisira nito ang pangkalahatang impresyon na ang sistema ay napaka sopistikado.

Tulad ng ipinaliwanag ni Mr. waddlesplash:

Minsan may mga application na kailangan ng ibang mga application ngunit wala sa menu. Halimbawa, ang LegacyPackageInstaller sa iyong screenshot, pinoproseso ang mga .pkg na archive sa BeOS na format. Gusto kong i-install sila ng mga user, ngunit ang kanilang presensya sa menu ay hahantong sa pagkalito.

Para sa ilang kadahilanan tila sa akin na mayroong isang mas simpleng solusyon, halimbawa Hidden=true sa mga file .desktop sa Linux. Bakit hindi gawing mapagkukunan at katangian ng file system ang "nakatagong" impormasyon?

Ang lalong hindi banayad ay ang pangalan ng (ilang) application na nagpapakita ng menu, deskbar, mahigpit na nakatali sa daan.

Ginoo. Ipinapaliwanag ito ni waddlesplash:

Ang "Deskbar" sa kasong ito ay dapat na maunawaan bilang isang uri ng pangkalahatang termino (sa halos parehong paraan tulad ng "taskbar", na tumutukoy sa parehong Windows application at pangkalahatang konsepto). Well, mula noon deskbar, hindi "Deskbar", maaari din itong maunawaan sa katulad na paraan.

Ang aking ikalimang araw sa Haiku: mag-port tayo ng ilang mga programa
2 "halos magkapareho" na mga direktoryo na may mga application sa kanila

Bakit may 2 direktoryo na may mga application, at bakit ang aking QtQuickApplication ay nasa isa, ngunit hindi sa isa? (Pagkatapos ng lahat, ito ay hindi isang sistema ng isa, ngunit isang pangalawang gumagamit ng isa, na kung saan ay maaaring maunawaan sa akin ng personal).
Ako ay talagang naguguluhan at sa tingin ko ito ay dapat na pinag-isa.

komento ni mr. waddlesplash

Ang Apps catalog ay naglalaman ng mga application na hindi kailangan sa menu. Ngunit ang sitwasyon sa menu ay talagang kailangang mapabuti, upang gawin itong mas napapasadya.

Application, o hindi ito mangyayari πŸ˜‰

Naisip ko: kailangan ba talagang mag-host ng mga aplikasyon /system/apps, kung makikita sila ng mga user doon, ito ay hindi kanais-nais. Siguro mas mainam na ilagay ang mga ito sa ibang lugar kung saan hindi sila makakatagpo ng gumagamit? Tulad ng ginagawa sa Mac OS X, kung saan ang mga nilalaman ng mga pakete .app, na hindi dapat makita ng user sa /Applications, nagtatago sa kaibuturan ng /System/Library/β€¦β€œ`.

Paano ang mga dependencies?

Sa tingin ko ito ay nagkakahalaga ng pagtukoy ng mga dependencies sa anumang paraan, tama? Maaari bang ituring ang Qt bilang isang mandatoryong bahagi ng pag-install ng Haiku bilang default? Hindi! Hindi naka-install ang Qt bilang default. Maaari bang awtomatikong makita ng isang tagabuo ng package ang mga dependencies sa pamamagitan ng pagsuri sa mga ELF file? Sinabihan ako na talagang ginagawa ito ng HaikuPorter, ngunit package Hindi. Iyon ay dahil isa lamang itong "tagabuo ng pakete" na gumagawa lamang ng mga file nang mag-isa hpkg.

Dapat bang gawing mas sopistikado ang Haiku sa pamamagitan ng pagdaragdag ng isang patakaran na ang isang pakete ay hindi dapat magkaroon ng mga dependency sa mga pakete sa labas ng Haiku? haikuports? (Gusto ko, dahil ang ganitong patakaran ay magpapadali sa mga bagay-bagay - magagawa ng system na awtomatikong maresolba ang mga dependency ng bawat package na na-download mula sa kahit saan, nang hindi nakikialam sa mga karagdagang source ng package.)

Ginoo. paliwanag ni waddlesplash:

Hindi namin gustong limitahan ang kalayaan ng mga developer, dahil malinaw na kung gusto ng CompanyX na suportahan ang sarili nitong hanay ng software na may mga dependency (at samakatuwid ay isang repositoryo), ganap itong malayang gagawin.

Sa kasong iyon, maaaring sulit na irekomenda na ang mga third-party na pakete ay maiwasan ang mga dependency sa anumang hindi kasama sa haikuports sa pamamagitan ng ganap na pag-package ng lahat ng kailangan kasama ng application. Ngunit sa tingin ko ito ay isang paksa para sa hinaharap na artikulo sa seryeng ito. [Ang may-akda ba ay patungo sa AppImage? β€” tinatayang. tagasalin]

Pagdaragdag ng icon ng application

Paano kung gusto kong magdagdag ng isa sa mga maayos na built-in na icon sa mga mapagkukunan ng aking bagong likhang application? Ito ay lumabas na ito ay isang kamangha-manghang paksa, kaya ito ang magiging batayan para sa susunod na artikulo.

Paano ayusin ang tuluy-tuloy na pagbuo ng application?

Isipin ang isang proyekto tulad ng Inkscape (oo, alam kong hindi pa ito magagamit sa Haiku, ngunit ito ay maginhawa upang ipakita dito). Mayroon silang source code repository https://gitlab.com/inkscape/inkscape.
Sa bawat oras na may isang taong gumawa ng kanilang mga pagbabago sa repository, inilulunsad ang mga pipeline ng build, pagkatapos nito ay awtomatikong susuriin, binuo, at ang application ay naka-package sa iba't ibang mga pakete, kabilang ang AppImage para sa Linux (isang standalone application package na maaaring ma-download para sa lokal na pagsubok anuman ang kung ano ang maaaring mai-install o hindi sa system [Sabi ko na nga ba! β€” tinatayang. tagasalin]). Ang parehong bagay ay nangyayari sa bawat kahilingan sa pagsasanib ng sangay, upang ma-download mo ang binuong application mula sa code na iminungkahi sa kahilingan sa pagsasama bago pagsamahin.

Ang aking ikalimang araw sa Haiku: mag-port tayo ng ilang mga programa
Pagsamahin ang mga kahilingan sa mga status ng build at ang kakayahang mag-download ng mga pinagsama-samang binary kung matagumpay ang build (minarkahan ng berde)

Ang build ay tumatakbo sa mga lalagyan ng Docker. Nag-aalok ang GitLab ng mga libreng runner sa Linux, at sa palagay ko posibleng isama ang sarili mong mga runner (nga pala, hindi ko nakikita kung paano ito gagana para sa mga system tulad ng Haiku, na alam kong walang Docker o katumbas, ngunit para din sa FreeBSD ay walang Docker, kaya ang problemang ito ay hindi natatangi sa Haiku).

Sa isip, ang mga Haiku application ay maaaring itayo sa loob ng isang Docker container para sa Linux. Sa sitwasyong ito, ang pagpupulong para sa Haiku ay maaaring ipasok sa mga kasalukuyang pipeline. Mayroon bang mga cross compiler? O dapat ko bang tularan ang lahat ng Haiku sa loob ng isang lalagyan ng Docker gamit ang isang bagay tulad ng QEMU/KVM (sa pag-aakalang gagana ito sa loob ng Docker)? Sa pamamagitan ng paraan, maraming mga proyekto ang gumagamit ng mga katulad na prinsipyo. Halimbawa, ginagawa ito ng Scribus - available na ito para sa Haiku. Darating ang araw na makakapagpadala ako tulad nito Hilahin ang mga kahilingan sa iba pang mga proyekto upang magdagdag ng suporta sa Haiku.

Ipinaliwanag ng isa sa mga developer:

Para sa iba pang mga proyekto na nagnanais na lumikha ng mga pakete sa kanilang sarili, ang regular na paraan ng CMake/CPack ay sinusuportahan. Maaaring suportahan ang iba pang mga build system sa pamamagitan ng direktang pagtawag sa build program ng package, na mainam kung interesado ang mga tao dito. Ipinapakita ng karanasan: sa ngayon ay walang gaanong interes, kaya ang haikuporter ay nagtrabaho bilang maginhawa para sa amin, ngunit, sa huli, ang parehong mga pamamaraan ay dapat gumana nang magkasama. Dapat nating ipakilala ang isang hanay ng mga tool para sa cross-building software mula sa Linux o anumang iba pang operating system ng server (Ang Haiku ay hindi idinisenyo upang tumakbo sa mga server).

Nagbibigay ako ng standing ovation. Ang mga regular na gumagamit ng Linux ay nagdadala ng lahat ng karagdagang pagkarga at karagdagang bagahe (seguridad, mahigpit na kontrol, atbp.) na kinakailangan para sa isang operating system ng server, ngunit hindi para sa personal. Kaya lubos akong sumasang-ayon na ang kakayahang bumuo ng Haiku apps sa Linux ay ang paraan upang pumunta.

Konklusyon

Posible ang pag-port ng mga POSIX application sa Haiku, ngunit maaaring mas mahal kaysa sa karaniwang muling pagtatayo. Tiyak na mananatili ako dito sa mahabang panahon kung hindi dahil sa tulong ng mga tao mula sa #haiku channel sa irc.freenode.net network. Ngunit kahit na hindi nila laging nakikita kung ano ang mali.

Ang mga application na nakasulat sa Qt ay isang madaling pagbubukod. Pinagsama-sama ko ang isang simpleng demo application nang walang anumang problema.

Ang pagbuo ng isang pakete para sa mga simpleng application ay medyo madali, ngunit para lamang sa mga "tradisyonal na inilabas", i.e. pagkakaroon ng mga bersyon na source code archive na nilayon para sa suporta sa haikuports. Para sa tuluy-tuloy na build (bumuo para sa bawat commit ng mga pagbabago) sa GitHub, ang lahat ay tila hindi gaanong simple. Dito, ang Haiku ay parang isang pamamahagi ng Linux kaysa sa resulta sa isang Mac, kung saan kapag na-click mo ang "Build" na buton sa XCode makakakuha ka ng isang pakete .app, handa nang ipasok sa isang disk image .dmg, na inihanda para sa pag-download sa aking website.
Ang tuluy-tuloy na pagbuo ng mga application batay sa isang "server" na operating system, halimbawa, Linux, ay malamang na magiging posible kung may pangangailangan mula sa mga developer, ngunit sa sandaling ito ang proyekto ng Haiku ay may iba pang mas mabigat na gawain.

Subukan ito sa iyong sarili! Pagkatapos ng lahat, ang proyekto ng Haiku ay nagbibigay ng mga larawan para sa pag-boot mula sa DVD o USB, na nabuo araw-araw. Upang i-install, i-download lamang ang imahe at isulat ito sa isang flash drive gamit Etcher

May tanong ka ba? Inaanyayahan ka namin sa nagsasalita ng Ruso channel ng telegram.

Pangkalahatang-ideya ng error: Paano i-shoot ang iyong sarili sa paa sa C at C++. Koleksyon ng mga recipe ng Haiku OS

Mula sa may-akda pagsasalin: ito ang ikalimang artikulo sa serye tungkol sa Haiku.

Listahan ng mga artikulo: Muna Ang pangalawang Ang ikatlo Pang-apat

Pinagmulan: www.habr.com

Magdagdag ng komento