Hari kelima saya dengan Haiku: mari kita port beberapa program

Hari kelima saya dengan Haiku: mari kita port beberapa program

TL; DR: Seorang pemula melihat Haiku buat kali pertama, cuba memindahkan beberapa program dari dunia Linux.

Hari kelima saya dengan Haiku: mari kita port beberapa program
Program porting Haiku pertama saya, dibungkus dalam format hpkgnya

Baru-baru ini Saya menemui Haiku, sistem pengendalian yang sangat baik untuk PC.
Hari ini saya akan belajar cara memindahkan program baharu ke sistem pengendalian ini. Fokus utama ialah penerangan tentang pengalaman pertama bertukar kepada Haiku dari sudut pandangan pembangun Linux. Saya memohon maaf atas sebarang kesilapan bodoh yang saya lakukan sepanjang perjalanan, kerana belum seminggu saya memuat turun Haiku.

Saya ingin mencapai tiga matlamat:

  • Port aplikasi CLI mudah
  • Port aplikasi dari GUI ke Qt
  • Kemudian bungkusnya dalam format hpkg (kerana saya masih berfikir tentang menyesuaikan AppDir dan AppImage untuk Haiku...)

Mari kita mulakan. Dalam bahagian dokumentasi ΠΈ pembangunan, serta dalam wiki dari HaikuPorts saya menemui arah yang betul. Terdapat juga buku PDF dalam talian BeOS: Memindahkan Aplikasi Unix.
467 halaman - dan ini dari 1997! Seram untuk melihat ke dalam, tetapi saya berharap yang terbaik. Kata-kata pembangun adalah menggalakkan: "ia mengambil masa yang lama kerana BeOS tidak mematuhi POSIX," tetapi Haiku "sebahagian besarnya" sudah seperti itu.

Memindahkan aplikasi CLI mudah

Pemikiran pertama adalah untuk mengalihkan aplikasi avrdude, tetapi, ternyata, ini sudah pun selesai suatu masa dahulu.

Percubaan pertama: tiada apa yang perlu ditonton

Apa yang saya tidak faham ialah sudah Apl telah dialihkan ke Haiku selama lebih 10 tahun - walaupun pada hakikatnya OS itu sendiri belum lagi versi 1.0.

Percubaan kedua: perlu menulis semula

Jadi saya akan gunakan sentuh-770, CLI untuk mengawal pencetak Brother P-Touch 770 yang saya gunakan untuk mencetak label.
Saya mencetak pelbagai label padanya, dan anda mungkin sudah melihatnya dalam artikel sebelumnya. Sedikit lebih awal, saya menulis program pembungkus GUI kecil dalam Python (memandangkan ia dalam Gtk+, ia perlu ditulis semula, dan ini adalah sebab yang baik untuk belajar).

Hari kelima saya dengan Haiku: mari kita port beberapa program
Pencetak label Brother P-Touch 770. Adakah ia berfungsi dengan Haiku?

Pengurus pakej Haiku mengetahui tentang perpustakaan dan arahan, jadi jika saya mendapat mesej "tidak dapat mencari libintl" semasa menjalankan configure - Saya baru sahaja melancarkan pkgman install devel:libintl dan pakej yang diperlukan akan ditemui. Begitu juga pkgman install cmd:rsync. Nah, dll.

Kecuali apabila ini tidak berfungsi:

/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

Mungkin udev terlalu berasaskan Linux dan oleh itu tidak wujud untuk Haiku. Maksudnya saya perlu mengedit kod sumber yang saya cuba susun.
Eh, anda tidak boleh melompat ke atas kepala anda, dan saya pun tidak tahu dari mana hendak bermula.

Percubaan ketiga

Ia akan menjadi baik untuk mempunyai tmate untuk Haiku, maka saya akan membenarkan pembangun Haiku menyambung ke sesi terminal saya - sekiranya berlaku masalah. Arahannya agak mudah:

./autogen.sh
./configure
make
make install

Nampak bagus, jadi mengapa tidak mencubanya di 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

Dalam langkah ini saya membuka HaikuDepot dan mencari curses.
Sesuatu ditemui, yang memberi saya petunjuk untuk pertanyaan yang lebih cekap:

/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

Sekali lagi saya pergi ke HaikuDepot, dan, sudah tentu, mendapati devel:msgpack_c_cpp_devel. Apakah nama-nama pelik ini?

/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

Pada langkah ini, saya menyedari bahawa memindahkan program ke Haiku memerlukan lebih banyak pengetahuan daripada yang diperlukan untuk membina semula yang mudah.
Saya bercakap dengan pembangun Haiku yang mesra, ternyata terdapat pepijat dalam msgpack, dan selepas beberapa minit saya melihat tampung dalam HaikuPorts. Saya dapat melihat dengan mata saya sendiri bagaimana pakej yang diperbetulkan pergi ke sini (buildslave - mesin maya).

Hari kelima saya dengan Haiku: mari kita port beberapa program
Membina msgpack yang diperbetulkan pada buildmaster

Di antara masa saya menghantar tampalan ke hulu untuk menambah sokongan Haiku pada msgpack.

Lima minit kemudian, msgpack yang dikemas kini sudah tersedia dalam 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.

Tidak disangka baik. Adakah saya berkata begitu?!

Saya kembali kepada masalah asal:

/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

Sekarang nampaknya msgpack tidak bersalah. Saya mengulas IMAXLABEL Π² tty.c seperti ini:

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

Keputusan:

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.

Baiklah, kita sambung lagi... By the way:

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

Encik. waddlesplash memberitahu anda di mana untuk menggali:

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

Di sini saya siarkan config.log.

Mereka menjelaskan kepada saya bahawa terdapat sesuatu yang lain dalam libnetwork selain libresolv pada Haiku. Nampaknya kod itu perlu diedit lagi. Perlu difikirkan…

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

Soalan abadi: apa yang sedang berlaku?

/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

Perkara yang sama, hanya dalam profil. Googled dan jumpa ni. Jika anda menambah -lssp "kadang-kadang" membantu, saya cuba:

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

Wah! Ia bermula! Tetapi…

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

Saya akan cuba nyahpepijat fail di sini:

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

"ID port buruk" sudah seperti kad perniagaan haiku. Mungkin seseorang mempunyai idea apa yang salah dan bagaimana untuk memperbaikinya? Jika ya, saya akan mengemas kini artikel itu. Pautan ke GitHub.

Memindahkan aplikasi GUI ke Qt.

Saya memilih aplikasi QML yang mudah.

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

Mudah sungguh. Kurang daripada satu minit!

Aplikasi pembungkusan dalam hpkg menggunakan haikuporter dan haikuports.

Apa yang harus saya mulakan? Tiada dokumentasi mudah, saya pergi ke saluran #haiku di irc.freenode.net dan mendengar:

  • Pasukan package - cara peringkat rendah untuk membuat pakej. Untuk sebahagian besar, PackageInfo sudah mencukupi untuknya, seperti yang diterangkan dalam bahagian "Membuatnya menjadi pakej .hpkg yang betul"
  • Saya perlu buat sesuatu seperti itu
  • Boleh gunakan hpkg-pencipta (ia ranap untuk saya, pelaporan ralat)

Tidak jelas apa yang perlu dilakukan. Saya rasa saya memerlukan panduan pemula gaya Hello World, idealnya video. Adalah baik untuk mempunyai pengenalan yang mudah kepada HaikuPorter, seperti yang dilakukan dalam hello GNU.

Saya sedang membaca perkara berikut:

haikuporter ialah alat untuk mencipta projek pakej biasa untuk Haiku. Ia menggunakan repositori HaikuPorts sebagai asas untuk semua pakej. Resipi Haikuporter digunakan untuk membuat pakej.

Di samping itu, saya mendapati bahawa:

Tidak perlu menyimpan resipi dalam simpanan HaikuPorts. Anda boleh membuat repositori lain, letakkan resipi di dalamnya, dan kemudian arahkan haikuporter kepadanya.

Hanya apa yang saya perlukan - jika tidak mencari cara untuk mengeluarkan pakej secara terbuka. Tetapi ini adalah topik untuk jawatan lain.

Memasang haikuporter dan 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

Menulis resepi

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
}

Memasang resipi

Saya simpan fail di bawah nama QtQuickApp-1.0.recipe, selepas itu saya melancarkan aikuporter -S ./QuickApp-1.0.recipe. Ketergantungan disemak untuk semua pakej dalam repositori haikuports, yang mengambil sedikit masa. Saya akan pergi mengambil kopi.

Mengapakah semakan ini perlu dilakukan pada mesin tempatan saya, dan bukan secara berpusat pada pelayan sekali untuk semua orang?

Menurut mr. waddlesplash:

Dengan itu anda boleh menulis semula mana-mana fail dalam repositori πŸ˜‰ Anda boleh mengoptimumkan ini sedikit, mengira maklumat yang diperlukan apabila diperlukan, kerana perubahan terakhir yang dibuat agak jarang berlaku.

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

Ternyata tidak ada fail resipi biasa yang mengandungi kod sumber aplikasi anda. Anda perlu menyimpannya dalam repositori dalam format HaikuPorts.

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

Fakta ini menjadikan perhimpunan lebih menyusahkan. Saya tidak begitu menyukainya, tetapi saya fikir ia perlu supaya akhirnya semua perisian sumber terbuka akan muncul dalam HaikuPorts.

Saya mendapat perkara berikut:

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

apa salahnya Selepas membaca irc saya lakukan:

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

Satu persoalan yang menarik telah timbul. Jika saya menambah checksum pada resipi - adakah ia sepadan dengan komit git terkini untuk penyepaduan berterusan? (Pembangun mengesahkan: "Ia tidak akan berfungsi. Resipi direka bentuk untuk menjadi agak stabil.")

Untuk keseronokan, tambah pada resipi:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Masih tidak berpuas hati:

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

Apa yang dia buat? Lagipun, ini adalah repositori git, kod itu sudah ada secara langsung, tiada apa yang perlu dibongkar. Dari sudut pandangan saya, alat itu harus cukup pintar untuk tidak mencari pembongkar jika ia berada di atas url GitHub.

Mungkin uri git:// akan berfungsi

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

Sekarang ia mengeluh seperti ini:

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

Hmm, kenapa semuanya rumit, kenapa anda tidak boleh "bekerja" sahaja? Lagipun, ia bukan sesuatu yang luar biasa untuk membina sesuatu daripada GitHub. Sama ada alat yang berfungsi serta-merta, tanpa memerlukan persediaan, atau seperti yang saya panggil "kecoh".

Mungkin ia akan berfungsi seperti ini:

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

Tidak. Saya masih mendapat ralat aneh ini dan lakukan, seperti yang diterangkan di sini

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

Saya bergerak lebih jauh, tetapi mengapa ia menjerit kepada saya (GitHub tidak selamat!) dan masih cuba membongkar sesuatu.

Menurut Encik. waddlesplash:

Nah, ya, sebabnya ialah keinginan untuk memeriksa integriti data yang diterima untuk pemasangan. Salah satu pilihan adalah untuk mengesahkan jumlah semak arkib, tetapi anda boleh, tentu saja, mencincang fail individu, yang tidak akan dilaksanakan, kerana ia mengambil masa yang lebih lama. Akibat daripada ini adalah "ketidakamanan" git dan VCS lain. Ini kemungkinan besar akan selalu berlaku, kerana membuat arkib pada GitHub agak mudah dan selalunya lebih pantas. Nah, pada masa hadapan, mungkin mesej ralat tidak akan begitu mencolok... (kami tidak lagi menggabungkan resipi sedemikian dalam 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

Daripada kebiasaan lama, saya pergi bertanya kepada orang baik di saluran #haiku di rangkaian irc.freenode.net. Dan di manakah saya tanpa mereka? Selepas pembayang, saya menyedari bahawa saya harus menggunakan:

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

Okay, ia menjadi jelas apa yang dilakukan - ia memuat turun arkib dengan kod sumber semakan tertentu. Ia bodoh, dari sudut pandangan saya, dan bukan apa yang saya mahu, iaitu, memuat turun semakan terkini dari cawangan induk.

Salah seorang pembangun menjelaskannya dengan cara ini:

Kami mempunyai CI kami sendiri, jadi semua yang diletakkan dalam repositori haikuports akan dibungkus untuk semua pengguna, dan kami tidak mahu mengambil risiko mengumpul dan menghantar "semuanya dalam versi huluan terkini."

Faham! Walau apa pun, inilah yang berlaku:

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

Ia mengulangi iklan ini infinitum. Nampaknya ini adalah ralat (adakah aplikasi? Saya tidak dapat mencarinya).

Π‘ haikuporter dan repositori haikuports Ia tidak mempunyai rasa "hanya berfungsi", tetapi sebagai pembangun, ada beberapa perkara yang saya suka tentang bekerja dengan Haiku. Untuk sebahagian besar, ia serupa dengan Perkhidmatan Binaan Terbuka, satu set alat untuk membina binaan Linux: sangat berkuasa, dengan pendekatan yang sistematik, tetapi berlebihan untuk aplikasi kecil saya "hello world".

Sekali lagi, menurut mr. waddlesplash:

Sesungguhnya, HaikuPorter agak ketat secara lalai (ditambah terdapat mod lint serta mod ketat untuk menjadikannya lebih ketat!), tetapi hanya kerana ia mencipta pakej yang akan berfungsi, bukannya hanya mencipta pakej. Itulah sebabnya dia mengadu tentang kebergantungan yang tidak diisytiharkan, perpustakaan tidak diimport dengan betul, versi yang tidak betul, dsb. Matlamatnya adalah untuk menangkap mana-mana dan semua masalah, termasuk yang akan datang, sebelum pengguna mengetahui tentangnya (inilah sebabnya tidak mungkin untuk memasang avrdude, kerana kebergantungan sebenarnya dinyatakan dalam resipi). Perpustakaan bukan hanya pakej individu atau versi SO tertentu. HaikuPorter memastikan bahawa semua ini diperhatikan dalam resipi itu sendiri untuk mengelakkan ralat semasa pelaksanaan.

Pada dasarnya, tahap ketegasan ini wajar apabila mencipta sistem pengendalian, tetapi nampaknya tidak perlu bagi saya untuk aplikasi "hello world". Saya memutuskan untuk mencuba sesuatu yang lain.

Membina aplikasi dalam format hpkg menggunakan arahan "buat pakej".

Mungkin, эта Adakah arahan mudah berfungsi dengan lebih baik untuk saya?

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

Tak sangka cepat, tak sangka ringkas, tak sangka berkesan. Tepat sekali saya menyukainya, menakjubkan!

Pemasangan - apa dan di mana?

Memindahkan fail QtQuickApp.hpkg ke ~/config/packagesmenggunakan pengurus fail, selepas itu QtQuickApp secara ajaib muncul ~/config/apps.
Sekali lagi, tanpa diduga cepat, mudah dan berkesan. Hebat, luar biasa!

Tetapi... (di manakah kita tanpa mereka!)

Apl itu masih tiada daripada senarai menu apl dan QuickLaunch. Saya rasa saya sudah tahu bagaimana untuk membetulkannya. Dalam pengurus fail saya memindahkan QtQuickApp.hpkg dari ~/config/packages ke /system/packages.

Tidak, masih hilang. Nampaknya, saya (baik, dan arahan) terlepas sesuatu.

Setelah melihat tab "Kandungan" dalam HaikuDepot untuk beberapa aplikasi lain, saya melihat bahawa terdapat fail seperti /data/mimedb/application/x-vnd... apa yang lebih luar biasa ialah /data/deskbar/menu/Applications/….

Nah, apa yang perlu saya letakkan di sana? Ayuh...

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

Saya agak pasti bahawa helah ini akan berfungsi, tetapi persoalannya kekal: mengapa ini perlu, untuk apa? Saya fikir ini merosakkan tanggapan keseluruhan bahawa sistem itu sangat canggih.

Seperti yang dijelaskan oleh En. waddlesplash:

Kadangkala terdapat aplikasi yang diperlukan oleh aplikasi lain tetapi tiada dalam menu. Contohnya, LegacyPackageInstaller dalam tangkapan skrin anda, memproses arkib .pkg dalam format BeOS. Saya ingin pengguna memasangnya, tetapi kehadiran mereka dalam menu akan membawa kepada kekeliruan.

Atas sebab tertentu nampaknya saya ada penyelesaian yang lebih mudah, sebagai contoh Hidden=true dalam fail .desktop pada Linux. Mengapa tidak menjadikan maklumat "tersembunyi" sebagai sumber dan atribut sistem fail?

Apa yang tidak halus adalah nama (beberapa) aplikasi yang menunjukkan menu, deskbar, terikat tegar di sepanjang jalan.

Encik. waddlesplash menerangkan ini:

"Deskbar" dalam kes ini harus difahami sebagai sejenis istilah umum (dengan cara yang sama seperti "bar tugas", yang merujuk kepada kedua-dua aplikasi Windows dan konsep umum). Nah, sejak ini deskbar, bukan "Deskbar", ini juga boleh difahami dengan cara yang sama.

Hari kelima saya dengan Haiku: mari kita port beberapa program
2 direktori "hampir serupa" dengan aplikasi di dalamnya

Mengapakah terdapat 2 direktori dengan aplikasi, dan juga mengapa QtQuickApplication saya berada dalam satu, tetapi tidak dalam yang lain? (Lagipun, ini bukan satu sistem, tetapi pengguna kedua, yang boleh saya fahami secara peribadi).
Saya benar-benar keliru dan saya fikir ini harus disatukan.

komen oleh mr. waddlesplash

Katalog Apps mengandungi aplikasi yang tidak diperlukan dalam menu. Tetapi keadaan dengan menu benar-benar perlu diperbaiki, untuk menjadikannya lebih disesuaikan.

Permohonan, atau ia tidak akan berlaku πŸ˜‰

Saya tertanya-tanya: adakah ia benar-benar perlu untuk menjadi tuan rumah aplikasi /system/apps, jika pengguna melihatnya di sana, ia adalah tidak diingini. Mungkin lebih baik untuk meletakkannya di tempat lain di mana pengguna tidak akan menemuinya? Sama seperti ia dilakukan dalam Mac OS X, di mana kandungan pakej .app, yang tidak sepatutnya kelihatan kepada pengguna dalam /Applications, bersembunyi di kedalaman /System/Library/β€¦β€œ`.

Bagaimana pula dengan tanggungan?

Saya fikir ia berbaloi untuk menentukan kebergantungan entah bagaimana, bukan? Bolehkah Qt dianggap sebagai bahagian wajib pemasangan Haiku secara lalai? Tidak! Qt tidak dipasang secara lalai. Bolehkah pembina pakej mengesan kebergantungan secara automatik dengan menyemak fail ELF? Saya diberitahu bahawa HaikuPorter sebenarnya melakukan ini, tetapi package Tidak. Itu kerana ia hanyalah "pembina pakej" yang hanya mencipta fail sendiri hpkg.

Patutkah Haiku dibuat lebih canggih dengan menambahkan dasar bahawa pakej tidak seharusnya mempunyai kebergantungan pada pakej di luar Haiku? haikuports? (Saya mahu begitu kerana dasar sedemikian akan menjadikan perkara lebih mudahβ€”sistem akan dapat menyelesaikan kebergantungan secara automatik untuk setiap pakej yang dimuat turun dari mana-mana sahaja, tanpa bermain-main dengan sumber pakej tambahan.)

Encik. waddlesplash menerangkan:

Kami tidak mahu mengehadkan kebebasan pembangun begitu banyak, kerana jelas sekali jika CompanyX mahu menyokong set perisiannya sendiri dengan kebergantungan (dan oleh itu repositori), ia akan melakukannya secara bebas sepenuhnya.

Dalam kes itu, mungkin patut mengesyorkan bahawa pakej pihak ketiga mengelakkan pergantungan pada apa-apa yang tidak termasuk dalam haikuports dengan membungkus sepenuhnya semua yang diperlukan dengan aplikasi. Tetapi saya fikir ini adalah topik untuk artikel akan datang dalam siri ini. [Adakah pengarang menuju ke AppImage? - lebih kurang penterjemah]

Menambah ikon aplikasi

Bagaimana jika saya ingin menambah salah satu ikon terbina dalam yang kemas pada sumber aplikasi saya yang baru dibuat? Ternyata ini adalah topik yang menakjubkan, jadi ia akan menjadi asas untuk artikel seterusnya.

Bagaimana untuk mengatur binaan aplikasi berterusan?

Bayangkan projek seperti Inkscape (ya, saya sedar bahawa ia belum lagi tersedia dalam Haiku, tetapi ia mudah untuk dipaparkan padanya). Mereka mempunyai repositori kod sumber https://gitlab.com/inkscape/inkscape.
Setiap kali seseorang melakukan perubahan mereka pada repositori, saluran paip binaan dilancarkan, selepas itu perubahan itu diuji secara automatik, dibina dan aplikasi dibungkus ke dalam pelbagai pakej, termasuk AppImage untuk Linux (pakej aplikasi kendiri yang boleh dimuat turun untuk ujian tempatan tanpa mengira apa yang mungkin dipasang atau tidak pada sistem [Saya tahu! - lebih kurang penterjemah]). Perkara yang sama berlaku dengan setiap permintaan cantum cawangan, jadi anda boleh memuat turun aplikasi yang dibina daripada kod yang dicadangkan dalam permintaan cantum sebelum bergabung.

Hari kelima saya dengan Haiku: mari kita port beberapa program
Gabungkan permintaan dengan status binaan dan keupayaan untuk memuat turun binari yang disusun jika binaan berjaya (ditandakan dengan warna hijau)

Binaan berjalan dalam bekas Docker. GitLab menawarkan pelari percuma di Linux, dan saya fikir ia mungkin mungkin untuk memasukkan pelari anda sendiri (dengan cara ini, saya tidak nampak bagaimana ini akan berfungsi untuk sistem seperti Haiku, yang saya tahu tidak mempunyai Docker atau setara, tetapi juga untuk FreeBSD tidak ada Docker, jadi masalah ini bukan unik untuk Haiku).

Sebaik-baiknya, aplikasi Haiku boleh dibina di dalam bekas Docker untuk Linux. Dalam keadaan ini, pemasangan untuk Haiku boleh diperkenalkan ke dalam saluran paip sedia ada. Adakah terdapat penyusun silang? Atau adakah saya patut meniru semua Haiku di dalam bekas Docker menggunakan sesuatu seperti QEMU/KVM (dengan mengandaikan ia akan berfungsi seperti itu di dalam Docker)? By the way, banyak projek menggunakan prinsip yang sama. Contohnya, Scribus melakukan ini - ia sudah tersedia untuk Haiku. Satu hari nanti tiba masa saya boleh hantar itu Tarik permintaan ke projek lain untuk menambah sokongan Haiku.

Salah seorang pemaju menerangkan:

Untuk projek lain yang ingin membuat pakej sendiri, kaedah CMake/CPack biasa disokong. Sistem binaan lain boleh disokong dengan memanggil program binaan pakej secara terus, yang tidak mengapa jika orang berminat dengannya. Pengalaman menunjukkan: setakat ini tidak ada banyak minat, jadi haikuporter berfungsi dengan mudah untuk kami, tetapi, akhirnya, kedua-dua kaedah harus berfungsi bersama. Kita harus memperkenalkan satu set alat untuk perisian binaan silang daripada Linux atau mana-mana sistem pengendalian pelayan lain (Haiku tidak direka untuk dijalankan pada pelayan).

Saya memberi tepukan gemuruh. Pengguna Linux biasa membawa semua beban tambahan dan bagasi tambahan ini (keselamatan, kawalan ketat, dll.) yang diperlukan untuk sistem pengendalian pelayan, tetapi bukan untuk sistem pengendalian peribadi. Jadi saya benar-benar bersetuju bahawa dapat membina aplikasi Haiku di Linux adalah cara untuk pergi.

Kesimpulan

Memindahkan aplikasi POSIX ke Haiku adalah mungkin, tetapi mungkin lebih mahal daripada binaan semula biasa. Saya pasti akan terperangkap dengan perkara ini untuk masa yang lama jika bukan kerana bantuan orang dari saluran #haiku di rangkaian irc.freenode.net. Tetapi walaupun mereka tidak selalu segera melihat apa yang salah.

Aplikasi yang ditulis dalam Qt adalah pengecualian yang mudah. Saya menyusun aplikasi demo yang mudah tanpa sebarang masalah.

Membina pakej untuk aplikasi mudah juga agak mudah, tetapi hanya untuk yang "dilepaskan secara tradisional", i.e. mempunyai arkib kod sumber versi yang bertujuan untuk sokongan dalam haikuports. Untuk binaan berterusan (bina untuk setiap komit perubahan) dengan GitHub, semuanya nampaknya tidak begitu mudah. Di sini Haiku berasa lebih seperti pengedaran Linux daripada hasil pada Mac, di mana apabila anda mengklik butang "Bina" dalam XCode anda mendapat pakej .app, sedia untuk dimasukkan ke dalam imej cakera .dmg, disediakan untuk dimuat turun di tapak web saya.
Pembinaan aplikasi yang berterusan berdasarkan sistem pengendalian "pelayan", contohnya, Linux, kemungkinan besar akan menjadi mungkin jika terdapat permintaan daripada pembangun, tetapi pada masa ini projek Haiku mempunyai tugas lain yang lebih mendesak.

Cubalah sendiri! Lagipun, projek Haiku menyediakan imej untuk but daripada DVD atau USB, yang dihasilkan setiap hari. Untuk memasang, hanya muat turun imej dan tulis pada pemacu kilat menggunakan penggores

Adakah anda mempunyai sebarang soalan? Kami menjemput anda untuk berbahasa Rusia saluran telegram.

Gambaran keseluruhan ralat: Bagaimana untuk menembak kaki sendiri dalam C dan C++. Koleksi resipi Haiku OS

Dari pengarang terjemahan: ini adalah artikel kelima dalam siri tentang Haiku.

Senarai artikel: Pertama Yang kedua Ketiga Keempat

Sumber: www.habr.com

Tambah komen