Hari kelima saya dengan Haiku: mari porting beberapa program

Hari kelima saya dengan Haiku: mari porting beberapa program

TL; DR: Seorang pemula melihat Haiku untuk pertama kalinya, mencoba mem-porting beberapa program dari dunia Linux.

Hari kelima saya dengan Haiku: mari porting beberapa program
Program porting Haiku pertama saya, dikemas dalam format hpkg-nya

Baru-baru ini Saya menemukan Haiku, sistem operasi yang sangat bagus untuk PC.
Hari ini saya akan belajar cara mem-porting program baru ke sistem operasi ini. Fokus utamanya adalah gambaran pengalaman pertama beralih ke Haiku dari sudut pandang seorang pengembang Linux. Saya minta maaf atas kesalahan bodoh yang saya buat selama ini, karena belum genap seminggu sejak saya pertama kali mengunduh Haiku.

Saya ingin mencapai tiga tujuan:

  • Port aplikasi CLI sederhana
  • Port aplikasi dari GUI ke Qt
  • Kemudian kemas dalam format hpkg (karena saya masih berpikir untuk mengadaptasi AppDir dan AppImage untuk Haiku...)

Mari kita mulai. Di beberapa bagian dokumentasi и pengembangan, begitu juga di wiki dari HaikuPorts saya menemukan arah yang benar. Bahkan ada buku PDF online BeOS: Memindahkan Aplikasi Unix.
467 halaman - dan ini dari tahun 1997! Menakutkan melihat ke dalam, tapi saya berharap yang terbaik. Kata-kata pengembangnya membesarkan hati: “butuh waktu lama karena BeOS tidak sesuai dengan POSIX,” tetapi Haiku “sebagian besar” sudah seperti itu.

Porting aplikasi CLI sederhana

Pikiran pertama adalah mem-porting aplikasi avrdude, tapi ternyata, ini sudah terjadi selesai dahulu kala.

Percobaan pertama: tidak ada yang perlu ditonton

Apa yang saya tidak dapat mengerti adalah hal itu Aplikasi telah di-porting ke Haiku selama lebih dari 10 tahun - terlepas dari kenyataan bahwa OS itu sendiri bahkan belum versi 1.0.

Upaya kedua: perlu menulis ulang

Jadi saya akan menggunakan ptouch-770, CLI untuk mengontrol printer Brother P-Touch 770 yang saya gunakan untuk mencetak label.
Saya mencetak berbagai label di atasnya, dan Anda mungkin sudah melihatnya di artikel sebelumnya. Beberapa saat sebelumnya, saya menulis program pembungkus GUI kecil dengan Python (karena menggunakan Gtk+, program tersebut harus ditulis ulang, dan ini adalah alasan bagus untuk mempelajarinya).

Hari kelima saya dengan Haiku: mari porting beberapa program
Printer label Brother P-Touch 770. Apakah dapat digunakan dengan Haiku?

Manajer paket Haiku mengetahui tentang perpustakaan dan perintah, jadi jika saya mendapat pesan "tidak dapat menemukan libintl" saat menjalankannya configure - Aku baru saja meluncurkannya pkgman install devel:libintl dan paket yang diperlukan akan ditemukan. Juga pkgman install cmd:rsync. Yah, dll.

Kecuali jika ini tidak berhasil:

/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 berbasis Linux dan karenanya tidak ada untuk Haiku. Artinya saya perlu mengedit kode sumber yang saya coba kompilasi.
Eh, kamu tidak bisa melompati kepalamu, dan aku bahkan tidak tahu harus mulai dari mana.

Percobaan ketiga

Akan menyenangkan untuk memilikinya tmate untuk Haiku, maka saya akan mengizinkan pengembang Haiku untuk terhubung ke sesi terminal saya - jika terjadi kesalahan. Petunjuknya cukup sederhana:

./autogen.sh
./configure
make
make install

Kelihatannya bagus, jadi mengapa tidak mencobanya 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

Pada langkah ini saya membuka HaikuDepot dan mencari curses.
Sesuatu ditemukan, yang memberi saya petunjuk untuk pertanyaan yang lebih kompeten:

/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 tentu saja menemukannya devel:msgpack_c_cpp_devel. Apa nama-nama aneh 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 menyadari bahwa mem-porting program ke Haiku memerlukan lebih banyak pengetahuan daripada yang dibutuhkan untuk membangun kembali secara sederhana.
Saya berbicara dengan pengembang Haiku yang ramah, ternyata ada bug di msgpack, dan setelah beberapa menit saya melihat patch di HaikuPorts. Saya bisa melihat dengan mata kepala sendiri bagaimana paketnya diperbaiki pergi ke sini (buildslave - mesin virtual).

Hari kelima saya dengan Haiku: mari porting beberapa program
Membangun msgpack yang diperbaiki di buildmaster

Di sela-sela waktu saya mengirim patch ke upstream untuk menambahkan dukungan Haiku ke msgpack.

Lima menit kemudian, msgpack yang diperbarui sudah tersedia di 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.

Sangat bagus. Itukah yang aku katakan?!

Saya kembali ke masalah awal:

/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 sepertinya msgpack tidak salah. saya berkomentar IMAXLABEL в tty.c sebagai berikut:

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

Hasilnya:

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, ini dia lagi... Ngomong-ngomong:

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

Tn. waddlesplash memberitahu Anda di mana harus 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 memposting config.log.

Mereka menjelaskan kepada saya bahwa ada hal lain di libnetwork selain libresolv di Haiku. Rupanya kode tersebut perlu diedit lebih lanjut. Perlu berpikir…

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

Pertanyaan abadi: apa yang terjadi?

/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

Hal yang sama, hanya di profil. Mencari di Google dan menemukan ini. Jika Anda menambahkan -lssp "terkadang" membantu, saya mencoba:

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

Wow! Ini dimulai! Tetapi…

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

Saya akan mencoba melakukan debug mengajukan di sini:

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

“ID port buruk” sudah seperti kartu nama haiku. Mungkin ada yang tahu apa yang salah dan bagaimana cara memperbaikinya? Jika iya, saya akan memperbarui artikelnya. Tautan ke GitHub.

Porting aplikasi GUI ke Qt.

Saya memilih aplikasi QML sederhana.

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

Sangat sederhana. Kurang dari semenit!

Aplikasi pengemasan di hpkg menggunakan haikuporter dan haikuports.

Apa yang harus saya mulai? Tidak ada dokumentasi sederhana, saya membuka saluran #haiku di irc.freenode.net dan mendengar:

  • Tim package - cara tingkat rendah untuk membuat paket. Secara umum, PackageInfo sudah cukup baginya, seperti yang dijelaskan di bagian "Menjadikannya paket .hpkg yang tepat"
  • Saya perlu melakukan sesuatu seperti itu
  • Bisa digunakan hpkg-pencipta (itu crash untuk saya, pelaporan kesalahan)

Tidak jelas apa yang harus dilakukan. Saya kira saya memerlukan panduan pemula gaya Hello World, idealnya sebuah video. Akan menyenangkan juga jika ada pengenalan mudah tentang HaikuPorter, seperti yang dilakukan di GNU hello.

Saya membaca yang berikut ini:

haikuporter adalah alat untuk membuat proyek paket umum untuk Haiku. Ia menggunakan repositori HaikuPorts sebagai basis untuk semua paket. Resep Haikuporter digunakan untuk membuat paket.

Selain itu, saya menemukan bahwa:

Tidak perlu menyimpan resep di penyimpanan HaikuPorts. Anda dapat membuat repositori lain, memasukkan resep ke dalamnya, lalu mengarahkan haikuporter ke sana.

Yang saya perlukan - jika tidak mencari cara untuk merilis paket tersebut ke publik. Tapi ini adalah topik untuk postingan lain.

Menginstal 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 resep

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
}

Merakit resepnya

Saya menyimpan file tersebut dengan nama QtQuickApp-1.0.recipe, setelah itu saya meluncurkannya aikuporter -S ./QuickApp-1.0.recipe. Ketergantungan diperiksa untuk semua paket di repositori haikuports, yang memerlukan waktu. Aku akan pergi mengambil kopi.

Mengapa pemeriksaan ini harus dilakukan di mesin lokal saya, dan tidak secara terpusat di server satu kali untuk semua orang?

Menurut Pak. percikan waddle:

Dengan demikian Anda dapat menulis ulang file apa pun di repositori 😉 Anda dapat sedikit mengoptimalkannya, menghitung informasi yang diperlukan bila diperlukan, karena perubahan terakhir yang dilakukan cukup jarang.

~/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 file resep biasa yang berisi kode sumber aplikasi Anda. Anda harus menyimpannya di 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 membuat perakitan menjadi lebih rumit. Saya tidak terlalu menyukainya, tapi menurut saya itu perlu agar pada akhirnya semua perangkat lunak open source akan muncul di HaikuPorts.

Saya mendapatkan yang berikut ini:

~/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 yang salah? Setelah membaca irc saya melakukan:

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

Sebuah pertanyaan menarik muncul. Jika saya menambahkan checksum ke resep - apakah itu akan cocok dengan git commit terbaru untuk integrasi berkelanjutan? (Pengembang mengonfirmasi: “Ini tidak akan berhasil. Resepnya dirancang agar relatif stabil.”)

Untuk bersenang-senang, tambahkan ke resepnya:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Masih belum puas:

~/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 lakukan? Lagi pula, ini adalah repositori git, kodenya langsung ada di sana, tidak ada yang perlu dibongkar. Dari sudut pandang saya, alat tersebut harus cukup pintar untuk tidak mencari unpacker jika berada di atas url GitHub.

Mungkin uri git:// akan berhasil

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 sekali, kenapa tidak bisa “bekerja saja”? Lagi pula, membangun sesuatu dari GitHub bukanlah hal yang aneh. Entah itu alat yang langsung berfungsi, tanpa perlu setup, atau yang saya sebut "rewel".

Mungkin ini akan berfungsi seperti ini:

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

Tidak. Saya masih mendapatkan kesalahan aneh ini dan melakukan, seperti yang dijelaskan di sini

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

Saya bergerak sedikit lebih jauh, tetapi mengapa ia meneriaki saya (GitHub tidak aman!) dan masih mencoba membongkar sesuatu.

Menurut Tn. waddlesplash:

Ya, alasannya adalah keinginan untuk memeriksa integritas data yang diterima untuk perakitan. Salah satu opsinya adalah memverifikasi checksum arsip, tetapi Anda tentu saja dapat melakukan hash pada file individual, yang tidak akan diterapkan, karena dibutuhkan waktu lebih lama. Konsekuensi dari hal ini adalah “ketidakamanan” git dan VCS lainnya. Kemungkinan besar hal ini akan selalu terjadi, karena membuat arsip di GitHub cukup mudah dan seringkali lebih cepat. Nah, di masa depan, mungkin pesan kesalahannya tidak akan terlalu mencolok... (kami tidak lagi menggabungkan resep seperti itu di 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

Karena kebiasaan lama, saya bertanya kepada orang-orang baik di saluran #haiku di jaringan irc.freenode.net. Dan di manakah saya tanpa mereka? Setelah petunjuknya, saya menyadari bahwa saya harus menggunakan:

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

Oke, sudah jelas fungsinya - ia mengunduh arsip dengan kode sumber revisi tertentu. Itu bodoh, dari sudut pandang saya, dan tidak persis seperti yang saya inginkan, yaitu mengunduh revisi terbaru dari cabang master.

Salah satu pengembang menjelaskannya sebagai berikut:

Kami memiliki CI kami sendiri, jadi semua yang ditempatkan di repositori haikuports akan dikemas untuk semua pengguna, dan kami tidak ingin mengambil risiko mengumpulkan dan mengirimkan “semuanya dalam versi upstream terbaru.”

Dipahami! Bagaimanapun, inilah yang terjadi:

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

Ini mengulangi hal ini tanpa batas. Ternyata ini error (apa ada aplikasinya? Saya tidak bisa menemukannya).

С haikuporter dan repositori haikuports Ini tidak memiliki kesan "hanya berfungsi", tetapi sebagai pengembang, ada beberapa hal yang saya sukai tentang bekerja dengan Haiku. Secara umum, ini mirip dengan Open Build Service, seperangkat alat untuk membangun build Linux: sangat kuat, dengan pendekatan sistematis, tetapi berlebihan untuk aplikasi kecil "hello world" saya.

Sekali lagi, menurut Pak. percikan waddle:

Memang benar, HaikuPorter cukup ketat secara default (ditambah ada mode lint serta mode ketat untuk membuatnya lebih ketat!), tetapi hanya karena ia membuat paket yang berfungsi, bukan sekadar membuat paket. Itu sebabnya dia mengeluh tentang dependensi yang tidak dideklarasikan, perpustakaan tidak diimpor dengan benar, versi yang salah, dll. Tujuannya adalah untuk mengetahui setiap dan semua masalah, termasuk masalah di masa depan, sebelum pengguna mengetahuinya (inilah sebabnya avrdude tidak dapat diinstal, karena ketergantungan sebenarnya ditentukan dalam resep). Perpustakaan bukan hanya paket individual atau bahkan versi SO tertentu. HaikuPorter memastikan bahwa semua ini diperhatikan dalam resep itu sendiri untuk menghindari kesalahan selama eksekusi.

Pada prinsipnya, tingkat ketelitian ini dibenarkan saat membuat sistem operasi, tetapi bagi saya tampaknya hal itu tidak diperlukan untuk aplikasi “hello world”. Saya memutuskan untuk mencoba sesuatu yang lain.

Membangun aplikasi dalam format hpkg menggunakan perintah “package create”.

Mungkin, ini Apakah instruksi sederhana akan bekerja lebih baik bagi 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

Cepat tak terduga, sederhana tak terduga, efektif tak terduga. Persis seperti yang saya suka, luar biasa!

Instalasi - apa dan di mana?

Memindahkan file QtQuickApp.hpkg ke ~/config/packagesmenggunakan pengelola file, setelah itu QtQuickApp muncul secara ajaib ~/config/apps.
Sekali lagi, cepat, sederhana, dan efektif. Luar biasa, luar biasa!

Tapi... (apa jadinya kita tanpa mereka!)

Aplikasi masih hilang dari daftar menu aplikasi dan QuickLaunch. Saya rasa saya sudah tahu cara memperbaikinya. Di pengelola file saya memindahkan QtQuickApp.hpkg dari ~/config/packages ke /system/packages.

Tidak, masih hilang. Rupanya, saya (dan instruksinya) melewatkan sesuatu.

Setelah melihat tab "Isi" di HaikuDepot untuk beberapa aplikasi lain, saya melihat ada file seperti /data/mimedb/application/x-vnd... yang lebih luar biasa lagi adalah /data/deskbar/menu/Applications/….

Nah, apa yang harus saya taruh di sana? Ayo...

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

Saya cukup yakin trik ini akan berhasil, namun pertanyaannya tetap ada: mengapa ini perlu, untuk apa? Saya rasa hal ini merusak kesan keseluruhan bahwa sistem ini begitu canggih.

Seperti yang dijelaskan oleh Bpk. percikan waddle:

Terkadang ada aplikasi yang dibutuhkan aplikasi lain namun tidak ada di menu. Misalnya, LegacyPackageInstaller di tangkapan layar Anda, memproses arsip .pkg dalam format BeOS. Saya ingin pengguna menginstalnya, tetapi kehadirannya di menu akan menimbulkan kebingungan.

Untuk beberapa alasan, menurut saya ada solusi yang lebih sederhana, misalnya Hidden=true dalam file .desktop di Linux. Mengapa tidak menjadikan informasi "tersembunyi" sebagai sumber daya dan atribut sistem file?

Yang paling tidak kentara adalah nama (beberapa) aplikasi yang menampilkan menu, deskbar, diikat dengan kaku di sepanjang jalan.

Tn. waddlesplash menjelaskan ini:

"Deskbar" dalam hal ini harus dipahami sebagai semacam istilah umum (sama seperti "taskbar", yang mengacu pada aplikasi Windows dan konsep umum). Nah, sejak ini deskbar, bukan “Deskbar”, ini juga dapat dipahami dengan cara yang sama.

Hari kelima saya dengan Haiku: mari porting beberapa program
2 direktori "hampir identik" dengan aplikasi di dalamnya

Mengapa ada 2 direktori dengan aplikasi, dan juga mengapa QtQuickApplication saya ada di satu direktori, tetapi tidak di direktori lain? (Lagi pula, ini bukan satu sistem, tetapi pengguna kedua, yang dapat dimengerti oleh saya pribadi).
Saya benar-benar bingung dan menurut saya ini harusnya disatukan.

komentar dari Pak. waddlesplash

Katalog Aplikasi berisi aplikasi yang tidak diperlukan dalam menu. Namun situasi menunya benar-benar perlu diperbaiki agar lebih bisa disesuaikan.

Aplikasi, atau itu tidak akan terjadi 😉

Saya bertanya-tanya: apakah benar-benar perlu meng-host aplikasi /system/apps, jika pengguna melihatnya di sana, itu tidak diinginkan. Mungkin akan lebih baik untuk menempatkannya di tempat lain di mana pengguna tidak akan menemukannya? Sama seperti yang dilakukan di Mac OS X, dimana isi paketnya .app, yang seharusnya tidak terlihat oleh pengguna di /Applications, bersembunyi di kedalaman /System/Library/…“`.

Bagaimana dengan ketergantungan?

Saya pikir ada baiknya menentukan dependensinya, bukan? Bisakah Qt dianggap sebagai bagian wajib dari instalasi Haiku secara default? Tidak! Qt tidak diinstal secara default. Bisakah pembuat paket secara otomatis mendeteksi ketergantungan dengan memeriksa file ELF? Saya diberitahu bahwa HaikuPorter sebenarnya melakukan ini, tapi package TIDAK. Itu karena ini hanyalah "pembuat paket" yang hanya membuat file sendiri hpkg.

Haruskah Haiku dibuat lebih canggih dengan menambahkan kebijakan bahwa suatu paket tidak boleh memiliki ketergantungan pada paket di luar Haiku? haikuports? (Saya ingin melakukannya, karena kebijakan seperti itu akan membuat segalanya lebih mudah - sistem akan dapat secara otomatis menyelesaikan ketergantungan setiap paket yang diunduh dari mana saja, tanpa harus repot dengan sumber paket tambahan.)

Tn. waddlesplash menjelaskan:

Kami tidak ingin terlalu membatasi kebebasan pengembang, karena jelas bahwa jika CompanyX ingin mendukung perangkat lunaknya sendiri dengan dependensi (dan juga repositori), ia akan melakukannya dengan bebas sepenuhnya.

Dalam hal ini, mungkin ada baiknya merekomendasikan agar paket pihak ketiga menghindari ketergantungan pada apa pun yang tidak termasuk dalam haikuports dengan mengemas secara lengkap semua yang diperlukan dengan aplikasi tersebut. Namun menurut saya ini adalah topik untuk artikel mendatang dalam seri ini. [Apakah penulis sedang menuju AppImage? — kira-kira. Penerjemah]

Menambahkan ikon aplikasi

Bagaimana jika saya ingin menambahkan salah satu ikon bawaan yang rapi ke sumber daya aplikasi yang baru saya buat? Ternyata ini topik yang luar biasa, sehingga akan menjadi dasar untuk artikel selanjutnya.

Bagaimana cara mengatur pembangunan aplikasi yang berkelanjutan?

Bayangkan sebuah proyek seperti Inkscape (ya, saya tahu bahwa proyek tersebut belum tersedia di Haiku, tetapi lebih mudah untuk menampilkannya). Mereka memiliki repositori kode sumber https://gitlab.com/inkscape/inkscape.
Setiap kali seseorang melakukan perubahannya ke repositori, pipeline build diluncurkan, setelah itu perubahan tersebut secara otomatis diuji, dibuat, dan aplikasi dikemas ke dalam berbagai paket, termasuk AppImage untuk Linux (paket aplikasi mandiri yang dapat diunduh untuk pengujian lokal apa pun apa yang mungkin atau mungkin tidak diinstal pada sistem [Aku tahu itu! — kira-kira. Penerjemah]). Hal yang sama terjadi pada setiap permintaan penggabungan cabang, sehingga Anda dapat mengunduh aplikasi yang dibuat dari kode yang diusulkan dalam permintaan penggabungan sebelum penggabungan.

Hari kelima saya dengan Haiku: mari porting beberapa program
Gabungkan permintaan dengan status build dan kemampuan untuk mengunduh binari yang dikompilasi jika build berhasil (ditandai dengan warna hijau)

Build berjalan di container Docker. GitLab menawarkan runner gratis di Linux, dan menurut saya dimungkinkan untuk menyertakan runner Anda sendiri (omong-omong, saya tidak mengerti cara kerjanya untuk sistem seperti Haiku, yang saya tahu tidak memiliki Docker atau yang setara, tapi juga untuk FreeBSD tanpa Docker, jadi masalah ini tidak hanya terjadi pada Haiku).

Idealnya, aplikasi Haiku dapat dibangun di dalam container Docker untuk Linux. Dalam situasi ini, perakitan Haiku dapat dimasukkan ke dalam jaringan pipa yang sudah ada. Apakah ada kompiler silang? Atau haruskah saya meniru semua Haiku di dalam wadah Docker menggunakan sesuatu seperti QEMU/KVM (dengan asumsi itu akan berfungsi seperti itu di dalam Docker)? Omong-omong, banyak proyek menggunakan prinsip serupa. Misalnya, Scribus melakukan ini - sudah tersedia untuk Haiku. Suatu hari akan tiba saatnya saya dapat mengirim demikian Tarik permintaan ke proyek lain untuk menambahkan dukungan Haiku.

Salah satu pengembang menjelaskan:

Untuk proyek lain yang ingin membuat paket sendiri, metode CMake/CPack reguler didukung. Sistem pembangunan lain dapat didukung dengan memanggil program pembangunan paket secara langsung, yang tidak masalah jika orang tertarik dengannya. Pengalaman menunjukkan: sejauh ini belum banyak peminatnya, jadi haikuporter bekerja senyaman mungkin bagi kami, namun, pada akhirnya, kedua metode tersebut harus bekerja sama. Kita harus memperkenalkan seperangkat alat untuk membuat perangkat lunak lintas bangunan dari Linux atau sistem operasi server lainnya (Haiku tidak dirancang untuk berjalan di server).

Saya memberikan tepuk tangan meriah. Pengguna Linux biasa membawa semua beban tambahan dan bagasi tambahan (keamanan, kontrol ketat, dll.) yang diperlukan untuk sistem operasi server, tetapi tidak untuk sistem operasi pribadi. Jadi saya sepenuhnya setuju bahwa mampu membangun aplikasi Haiku di Linux adalah cara yang tepat.

Kesimpulan

Memindahkan aplikasi POSIX ke Haiku dimungkinkan, tetapi mungkin lebih mahal daripada membangun kembali pada umumnya. Saya pasti akan terjebak dengan ini untuk waktu yang lama jika bukan karena bantuan orang-orang dari saluran #haiku di jaringan irc.freenode.net. Namun mereka pun tidak selalu langsung melihat apa yang salah.

Aplikasi yang ditulis dalam Qt adalah pengecualian mudah. Saya membuat aplikasi demo sederhana tanpa masalah.

Membangun paket untuk aplikasi sederhana juga cukup mudah, tetapi hanya untuk aplikasi yang “dirilis secara tradisional”, mis. memiliki arsip kode sumber berversi yang ditujukan untuk dukungan di haikuports. Untuk pembangunan berkelanjutan (membangun untuk setiap penerapan perubahan) dengan GitHub, semuanya tampak tidak sesederhana itu. Di sini Haiku terasa lebih seperti distribusi Linux daripada hasil di Mac, di mana ketika Anda mengklik tombol “Build” di XCode Anda mendapatkan sebuah paket .app, siap untuk dimasukkan ke dalam image disk .dmg, siap untuk diunduh di situs web saya.
Pembangunan aplikasi yang berkelanjutan berdasarkan sistem operasi "server", misalnya Linux, kemungkinan besar akan dimungkinkan jika ada permintaan dari pengembang, tetapi saat ini proyek Haiku memiliki tugas lain yang lebih mendesak.

Cobalah sendiri! Bagaimanapun, proyek Haiku menyediakan gambar untuk boot dari DVD atau USB, yang dihasilkan harian. Untuk menginstal, cukup unduh gambar dan tulis ke flash drive menggunakan Penggores

Apakah Anda memiliki pertanyaan? Kami mengundang Anda ke berbahasa Rusia saluran telegram.

Ikhtisar kesalahan: Cara menembak diri sendiri di C dan C++. Kumpulan resep Haiku OS

Dari penulis terjemahan: ini adalah artikel kelima dalam seri tentang Haiku.

Daftar artikel: Pertama Kedua Третья Keempat

Sumber: www.habr.com

Tambah komentar