Haiku ilə beşinci günüm: bəzi proqramları portlaşdıraq

Haiku ilə beşinci günüm: bəzi proqramları portlaşdıraq

TL; DR: Yeni başlayan bir şəxs Linux dünyasından bəzi proqramları daşımağa çalışan Haikunu ilk dəfə gördü.

Haiku ilə beşinci günüm: bəzi proqramları portlaşdıraq
Hpkg formatında paketlənmiş ilk Haiku proqramım

Son vaxtlar Mən kompüterlər üçün təəccüblü dərəcədə yaxşı əməliyyat sistemi olan Haiku-nu kəşf etdim.
Bu gün mən yeni proqramları bu əməliyyat sisteminə necə köçürməyi öyrənəcəyəm. Əsas diqqət Linux tərtibatçısının nöqteyi-nəzərindən Haiku-ya keçidin ilk təcrübəsinin təsviridir. Haiku-nu ilk yüklədiyim gündən bir həftə belə keçmədiyi üçün yol boyu etdiyim axmaq səhvlərə görə üzr istəyirəm.

Mən üç məqsədə çatmaq istəyirəm:

  • Sadə bir CLI tətbiqini port edin
  • Tətbiqi GUI-dən Qt-a köçürün
  • Sonra onları hpkg formatında paketləyin (çünki mən hələ də AppDir və AppImage-i Haiku üçün uyğunlaşdırmaq barədə düşünürəm...)

Gəlin başlayaq. Bölmələrdə sənədlər и inkişafıeləcə də wiki HaikuPorts-dan mən düzgün istiqamət tapdım. Hətta onlayn PDF kitabı da var BeOS: Unix Tətbiqinin Portasiyası.
467 səhifə - və bu 1997-ci ildən! İçəriyə baxmaq qorxuludur, amma ən yaxşısına ümid edirəm. Tərtibatçının sözləri ümidvericidir: "BeOS POSIX-ə uyğun olmadığı üçün uzun müddət çəkdi", lakin Haiku "çox hissəsi" artıq belədir.

Sadə bir CLI tətbiqinin daşınması

İlk düşüncə tətbiqi daşımaq idi avrdude, lakin, məlum oldu ki, bu artıqdır etdik uzun müddət əvvəl.

İlk cəhd: izləmək üçün heç bir şey yoxdur

Başa düşə bilmədiyim şey artıq budur Tətbiqlər 10 ildən çoxdur ki, Haiku-ya köçürülür - OS-nin özü hələ 1.0 versiyası olmasa da.

İkinci cəhd: yenidən yazmaq lazımdır

Mən istifadə edəcəm ptouch-770, etiketləri çap etmək üçün istifadə etdiyim Brother P-Touch 770 printerini idarə etmək üçün CLI.
Mən onun üzərində müxtəlif etiketlər çap edirəm və siz bunu əvvəlki məqalədə görmüş ola bilərsiniz. Bir az əvvəl, Python-da kiçik bir GUI sarma proqramı yazdım (Gtk+-da olduğu üçün onu yenidən yazmaq lazım olacaq və bu öyrənmək üçün yaxşı səbəbdir).

Haiku ilə beşinci günüm: bəzi proqramları portlaşdıraq
Brother P-Touch 770 etiket printeri Haiku ilə işləyəcəkmi?

Haiku paket meneceri kitabxanalar və əmrlər haqqında bilir, ona görə də işləyərkən "libintl tapa bilmirəm" mesajı alsam configure - Yenicə işə salıram pkgman install devel:libintl və tələb olunan paket tapılacaq. Eynilə pkgman install cmd:rsync. Yaxşı və s.

Bunun işləmədiyi hallar istisna olmaqla:

/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

Bəlkə də udev çox Linux əsaslıdır və buna görə də Haiku üçün mövcud deyil. Bu o deməkdir ki, mən tərtib etməyə çalışdığım mənbə kodunu redaktə etməliyəm.
Eh, sən başının üstündən atlaya bilməzsən və mən haradan başlayacağımı belə bilmirəm.

Üçüncü cəhd

Olsa yaxşı olardı tmate Haiku üçün, onda mən Haiku tərtibatçılarına terminal sessiyama qoşulmağa icazə verərdim - nəsə səhv olarsa. Təlimatlar olduqca sadədir:

./autogen.sh
./configure
make
make install

Yaxşı görünür, niyə onu Haiku-da sınamayasınız?

/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

Bu addımda HaikuDepot-u açıb axtarış edirəm curses.
Daha səriştəli sorğu üçün ipucu verən bir şey tapıldı:

/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

Yenə HaikuDepot-a getdim və təbii ki, tapdım devel:msgpack_c_cpp_devel. Bu qəribə adlar nədir?

/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

Bu addımda mən başa düşdüm ki, proqramı Haiku-ya köçürmək sadə yenidənqurma üçün lazım olduğundan daha çox bilik tələb edir.
Mən mehriban Haiku tərtibatçıları ilə danışdım, məlum oldu ki, msgpack-də xəta var və bir neçə dəqiqədən sonra HaikuPorts-da yamaq görürəm. Paketin necə düzəldildiyini öz gözlərimlə görə bilərəm bura gedir (buildslave - virtual maşınlar).

Haiku ilə beşinci günüm: bəzi proqramları portlaşdıraq
Buildmaster-də düzəldilmiş mesaj paketinin qurulması

Arada mən yuxarıya yamaq göndərirəm msgpack-ə Haiku dəstəyi əlavə etmək üçün.

Beş dəqiqə sonra, yenilənmiş mesaj paketi artıq Haiku-da mövcuddur:

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

Gözlənilmədən yaxşı. Mən bunu dedim?!

Orijinal problemə qayıdıram:

/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

İndi deyəsən msgpack günahkar deyil. şərh edirəm IMAXLABEL в tty.c beləliklə:

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

Nəticə:

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.

Yaxşı, yenə gedirik... Yeri gəlmişkən:

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

Cənab. vaddlesplash haranı qazacağınızı söyləyir:

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

Burda yazmışam config.log.

Onlar mənə izah etdilər ki, libnetwork-də Haiku-da libresolvdən başqa başqa bir şey var. Görünür, kodu daha da redaktə etmək lazımdır. Düşünmək lazımdır…

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

Əbədi sual: nə baş verir?

/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

Eyni şey, yalnız profildə. Googled və bunu tapdı. əlavə etsəniz -lssp "bəzən" kömək edir, mən çalışıram:

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

Heyrət! Vay! Başlayır! Amma…

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

Mən debug etməyə çalışacağam burada fayl:

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

“Bad port ID” artıq vizit kartı kimidir hayku. Bəlkə kimsə nəyin səhv olduğunu və onu necə düzəltmək barədə bir fikri var? Əgər belədirsə, məqaləni yeniləyəcəm. -a keçid Github.

GUI tətbiqini Qt-a köçürmək.

Mən sadə QML tətbiqini seçirəm.

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

Həqiqətən sadə. Bir dəqiqədən az!

haikuporter və haikuports istifadə edərək hpkg-da qablaşdırma proqramları.

Nədən başlamalıyam? Sadə sənədləşmə yoxdur, irc.freenode.net saytında #haiku kanalına gedirəm və eşidirəm:

  • Komanda package - paketlər yaratmaq üçün aşağı səviyyəli bir yol. Əksər hallarda, PackageInfo onun üçün kifayətdir, bunu "Müvafiq .hpkg paketinə çevirmək" bölməsində təsvir edilmişdir.
  • Mən bir şey etməliyəm budur
  • Siz istifadə edə bilərsiniz hpkg yaradıcısı (mənim üçün çökür, səhv hesabatı)

Nə edəcəyi aydın deyil. Düşünürəm ki, mənə Hello World üslubunda başlayanlar üçün bələdçi lazımdır, ideal olaraq video. GNU hello-da olduğu kimi HaikuPorter-ə də rahat giriş olsa yaxşı olardı.

Aşağıdakıları oxuyuram:

haikuporter Haiku üçün ümumi paket layihələri yaratmaq üçün bir vasitədir. O, bütün paketlər üçün əsas kimi HaikuPorts repozitoriyasından istifadə edir. Paketlər yaratmaq üçün Haikuporter reseptlərindən istifadə olunur.

Bundan əlavə, mən bunu öyrənirəm:

Reseptləri HaikuPorts yaddaşında saxlamağa ehtiyac yoxdur. Başqa bir repozitoriya yarada, reseptləri ora qoya və sonra haikuporteri ona yönəldə bilərsiniz.

Sadəcə mənə lazım olan şey - paketi açıq şəkildə buraxmaq üçün bir yol axtarmırsınızsa. Ancaq bu başqa bir yazının mövzusudur.

Haikuporter və haikuportların quraşdırılması

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

Resept yazmaq

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
}

Reseptin yığılması

Faylı adı altında saxlayıram QtQuickApp-1.0.recipe, bundan sonra işə salıram aikuporter -S ./QuickApp-1.0.recipe. Asılılıqlar depodakı bütün paketlər üçün yoxlanılır haikuports, bu bir az vaxt aparır. Mən gedib kofe götürəcəyəm.

Nə üçün bu yoxlama hər kəs üçün bir dəfə serverdə deyil, yerli maşınımda aparılmalıdır?

Cənab görə. vaddlesplash:

Bununla siz depoda istənilən faylı yenidən yaza bilərsiniz 😉 Lazım olanda lazımi məlumatları hesablayaraq bunu bir az optimallaşdıra bilərsiniz, çünki edilən son dəyişikliklər olduqca nadirdir.

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

Tətbiqinizin mənbə kodunu ehtiva edən adi resept faylı kimi bir şey olmadığı ortaya çıxır. Siz onu HaikuPorts formatında depoda saxlamalısınız.

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

Bu fakt montajı daha da çətinləşdirir. Xüsusilə xoşuma gəlmir, amma düşünürəm ki, bütün açıq mənbə proqram təminatı HaikuPorts-da görünəcək.

Mən aşağıdakıları əldə edirəm:

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

Səhv nədir? irc oxuduqdan sonra mən:

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

Maraqlı sual yaranıb. Reseptə yoxlama məbləği əlavə etsəm - bu, davamlı inteqrasiya üçün ən son git öhdəliyinə uyğun olacaqmı? (Tərtibatçı təsdiqləyir: "Bu işləməyəcək. Reseptlər nisbətən sabit olmaq üçün hazırlanmışdır.")

Əyləncə üçün reseptə əlavə edin:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Hələ də razı deyiləm:

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

O nə edir? Axı, bu bir git deposudur, kod artıq birbaşa oradadır, açmaq üçün heç bir şey yoxdur. Mənim fikrimcə, alət GitHub url-dən yuxarı olarsa, qablaşdırma aparan axtarmamaq üçün kifayət qədər ağıllı olmalıdır.

Bəlkə uri git:// işləyəcək

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

İndi belə şikayət edir:

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

Hmm, niyə hər şey bu qədər mürəkkəbdir, niyə "sadəcə işləyə" bilmirsən? Axı, GitHub-dan bir şey qurmaq o qədər də qeyri-adi deyil. İstər quraşdırmaya ehtiyac olmadan dərhal işləyən alətlər olsun, istərsə də mən bunu "qıcıqlandırmaq" adlandırıram.

Bəlkə belə işləyəcək:

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

Xeyr. Mən hələ də bu qəribə səhvi alıram və edirəm burada təsvir edildiyi kimi

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

Mən bir az irəliləyirəm, amma niyə mənə qışqırır (GitHub təhlükəsiz deyil!) və hələ də nəyisə açmağa çalışır.

Uyğun olaraq Cənab. vaddlesplash:

Bəli, səbəb montaj üçün alınan məlumatların bütövlüyünü yoxlamaq istəyi idi. Seçimlərdən biri arxivin yoxlama məbləğini yoxlamaqdır, lakin siz, əlbəttə ki, həyata keçirilməyəcək fərdi faylları hash edə bilərsiniz, çünki daha çox vaxt aparır. Bunun nəticəsi git və digər VCS-nin “təhlükəsizliyi”dir. Bu, çox güman ki, həmişə belə olacaq, çünki GitHub-da arxiv yaratmaq olduqca asan və çox vaxt daha sürətlidir. Yaxşı, gələcəkdə, bəlkə də səhv mesajı o qədər də parlaq olmayacaq... (biz artıq HaikuPorts-da belə reseptləri birləşdirmirik).

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

Köhnə vərdişimdən irc.freenode.net şəbəkəsindəki #haiku kanalında yaxşı insanlardan soruşuram. Və onlar olmasaydı mən harda olardım? İpucudan sonra istifadə etməli olduğumu başa düşdüm:

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

Tamam, bunun nə etdiyi aydın oldu - müəyyən bir revizyonun mənbə kodu ilə arxivi yükləyir. Mənim nöqteyi-nəzərdən axmaqlıqdır və tam istədiyim kimi deyil, yəni master filialından ən son versiyanı yükləmək.

Tərtibatçılardan biri bunu belə izah etdi:

Bizim öz CI-miz var, ona görə də haikuports repozitoriyasına yerləşdirilən hər şey bütün istifadəçilər üçün paketlənəcək və biz “hər şeyi yuxarıda ən son versiyada” toplamaq və çatdırmaq üçün risk etmək istəmirik.

Anladım! Hər halda, belə oldu:

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

Bu reklamı sonsuza qədər təkrarlayır. Görünür, bu xətadır (proqram var? Mən onu tapa bilmədim).

С haikuporter və anbar haikuports Onun "sadəcə işləyir" hissi yoxdur, lakin bir tərtibatçı kimi Haiku ilə işləməkdə xoşuma gələn bəzi şeylər var. Əksər hallarda, o, Açıq Quraşdırma Xidmətinə bənzəyir, Linux konstruksiyalarını qurmaq üçün alətlər dəsti: son dərəcə güclü, sistematik yanaşma ilə, lakin mənim kiçik "salam dünya" tətbiqim üçün həddən artıq çox.

Yenə də mr. vaddlesplash:

Həqiqətən, HaikuPorter standart olaraq olduqca sərtdir (üstəlik onu daha da sərtləşdirmək üçün lint rejimi və ciddi rejim var!), lakin yalnız paketlər yaratmaq əvəzinə işləyəcək paketlər yaratdığına görə. Buna görə də o, elan edilməmiş asılılıqlardan, kitabxanaların düzgün idxal edilməməsindən, səhv versiyalardan və s. Məqsəd, istifadəçi bu barədə bilməmişdən əvvəl hər hansı və bütün problemləri, o cümlədən gələcəkləri tutmaqdır (buna görə avrdude quraşdırmaq mümkün olmadı, çünki asılılıq əslində reseptdə göstərilmişdir). Kitabxanalar təkcə fərdi paketlər və ya hətta xüsusi SO versiyaları deyil. HaikuPorter icra zamanı səhvlərə yol verməmək üçün bütün bunların reseptlərin özündə müşahidə olunmasını təmin edir.

Prinsipcə, bu sərtlik səviyyəsi əməliyyat sistemi yaradanda özünü doğruldur, lakin “salam dünya” tətbiqi üçün mənə lazımsız görünür. Başqa bir şey sınamaq qərarına gəldim.

“Paket yarat” əmrindən istifadə edərək hpkg formatında proqramların qurulması

Ola bilər, bu Sadə təlimatlar mənim üçün daha yaxşı işləyəcəkmi?

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

Gözlənilmədən sürətli, gözlənilmədən sadə, gözlənilmədən təsirli. Tam olaraq necə xoşuma gəldi, heyrətamiz!

Quraşdırma - nə və harada?

QtQuickApp.hpkg faylı bu yerə köçürüldü ~/config/packagesbir fayl meneceri istifadə edərək, bundan sonra QtQuickApp sehrli şəkildə göründü ~/config/apps.
Yenə gözlənilmədən sürətli, sadə və effektiv. Heyrətamiz, inanılmaz!

Amma... (onlarsız biz harada olardıq!)

Proqram hələ də proqramlar menyusu siyahısında və QuickLaunch-da yoxdur. Düşünürəm ki, bunu necə düzəltməyi artıq bilirəm. Fayl menecerində QtQuickApp.hpkg-ni ~/config/packages-dən /system/packages-ə köçürürəm.

Xeyr, hələ də itkin. Görünür, mən (yaxşı və təlimatlar) bir şeyi qaçırdım.

Bəzi digər proqramlar üçün HaikuDepot-da "Məzmun" sekmesine baxaraq gördüm ki, bu kimi fayllar var. /data/mimedb/application/x-vnd... daha da diqqət çəkəni budur /data/deskbar/menu/Applications/….

Yaxşı, ora nə qoymalıyam? Buyurun...

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

Əminəm ki, bu hiylə işləyəcək, amma suallar qalır: bu nə üçün lazımdır, nə üçündür? Düşünürəm ki, bu, sistemin bu qədər mürəkkəb olması ilə bağlı ümumi təəssüratı məhv edir.

Cənab tərəfindən izah edildiyi kimi. vaddlesplash:

Bəzən digər proqramların ehtiyac duyduğu, lakin menyuda olmayan proqramlar var. Məsələn, ekran görüntüsündə LegacyPackageInstaller, BeOS formatında .pkg arxivlərini emal edir. İstərdim ki, istifadəçilər onları quraşdırsınlar, lakin onların menyuda olması çaşqınlığa səbəb olacaq.

Nədənsə mənə elə gəlir ki, məsələn, daha sadə həll yolu var Hidden=true fayllarda .desktop Linux-da. Niyə “gizli” məlumatı fayl sisteminin resursu və atributuna çevirməyək?

Xüsusilə incə olmayan, menyunu göstərən (bəzi) tətbiqin adıdır, deskbar, yol boyu möhkəm bağlandı.

Cənab. waddlesplash bunu belə izah edir:

Bu vəziyyətdə "Masa paneli" bir növ ümumi termin kimi başa düşülməlidir (həm Windows tətbiqinə, həm də ümumi konsepsiyaya istinad edən "tapşırıq paneli" ilə eyni şəkildə). Yaxşı, bundan bəri deskbar, “Masa paneli” deyil, bu da oxşar şəkildə başa düşülə bilər.

Haiku ilə beşinci günüm: bəzi proqramları portlaşdıraq
Tətbiqləri olan 2 "demək olar ki, eyni" kataloq

Niyə tətbiqləri olan 2 qovluq var və mənim QtQuickApplication niyə birində var, digərində yox? (Axı bu, bir sistem deyil, şəxsən mənim üçün başa düşülən ikinci istifadəçidir).
Mən həqiqətən çaşqınam və düşünürəm ki, bu vahid olmalıdır.

şərhi cənab vaddlesplash

Proqramlar kataloqu menyuda lazım olmayan proqramları ehtiva edir. Ancaq menyu ilə bağlı vəziyyət həqiqətən yaxşılaşdırılmalıdır, daha çox fərdiləşdirilə bilər.

Müraciət, yoxsa baş tutmayacaq 😉

Maraqlandım: həqiqətən tətbiqləri yerləşdirmək lazımdırmı? /system/apps, istifadəçilər onları orada görürsə, bu arzuolunmazdır. Bəlkə onları istifadəçinin qarşılaşmayacağı başqa yerdə yerləşdirmək daha yaxşı olardı? Eynilə Mac OS X-də edildiyi kimi, paketlərin məzmunu .appistifadəçiyə görünməməli olan /Applications, /Sistem/Kitabxana/…“` dərinliklərində gizlənir.

Bəs asılılıqlar haqqında?

Düşünürəm ki, asılılıqları bir şəkildə göstərməyə dəyər, elə deyilmi? Qt standart olaraq Haiku quraşdırılmasının məcburi hissəsi hesab edilə bilərmi? Xeyr! Qt standart olaraq quraşdırılmayıb. Paket qurucusu ELF fayllarını yoxlayaraq asılılıqları avtomatik aşkarlaya bilərmi? Mənə dedilər ki, HaikuPorter bunu həqiqətən edir, amma package Yox. Bunun səbəbi, sadəcə öz-özünə faylları yaradan "paket qurucusu" olmasıdır hpkg.

Paketin Haiku xaricindəki paketlərdən asılılığının olmaması siyasətini əlavə etməklə Haiku daha təkmilləşdirilməlidirmi? haikuports? (Mən istərdim, çünki belə bir siyasət işi xeyli asanlaşdırar - sistem əlavə paket mənbələri ilə qarışmadan istənilən yerdən endirilən hər paketin asılılıqlarını avtomatik həll edə bilər.)

Cənab. waddlesplash izah edir:

Tərtibatçıların azadlığını o qədər də məhdudlaşdırmaq istəməzdik, çünki aydındır ki, CompanyX asılılıqlarla (və buna görə də repozitoriya ilə) öz proqram təminatı dəstini dəstəkləmək istəsə, bunu tamamilə sərbəst edəcək.

Bu halda, üçüncü tərəf paketlərinin proqrama lazım olan hər şeyi tam şəkildə qablaşdıraraq, haikuportlara daxil olmayan hər hansı bir şeydən asılılığın qarşısını almağı tövsiyə etməyə dəyər ola bilər. Ancaq düşünürəm ki, bu, bu seriyada gələcək məqalə üçün mövzudur. [Müəllif AppImage-ə doğru gedirmi? - təqribən. tərcüməçi]

Tətbiq ikonasının əlavə edilməsi

Yeni yaradılmış tətbiqimin resurslarına səliqəli daxili nişanlardan birini əlavə etmək istəsəm nə etməli? Belə çıxır ki, bu heyrətamiz mövzudur, ona görə də növbəti məqalə üçün əsas olacaq.

Davamlı proqram qurmalarını necə təşkil etmək olar?

Inkscape kimi bir layihəni təsəvvür edin (bəli, onun Haiku-da hələ mövcud olmadığını bilirəm, lakin onu nümayiş etdirmək rahatdır). Onların mənbə kodu deposu var https://gitlab.com/inkscape/inkscape.
Hər dəfə kimsə repozitoriyada öz dəyişikliklərini etdikdə boru kəmərlərinin qurulması işə salınır, bundan sonra dəyişikliklər avtomatik olaraq sınaqdan keçirilir, qurulur və proqram Linux üçün AppImage daxil olmaqla müxtəlif paketlərə paketlənir (yerli test üçün yüklənə bilən müstəqil proqram paketi). sistemdə nə quraşdırıla bilər və ya olmaya bilər [Onu bilirdim! - təqribən. tərcüməçi]). Eyni şey, hər bir filialın birləşmə sorğusu ilə baş verir, beləliklə, birləşmədən əvvəl birləşmə sorğusunda təklif olunan koddan qurulmuş proqramı yükləyə bilərsiniz.

Haiku ilə beşinci günüm: bəzi proqramları portlaşdıraq
Quraşdırma uğurlu olarsa (yaşıl rənglə işarələnmiş) tərtib statusları və tərtib edilmiş ikili faylları yükləmək imkanı ilə sorğuları birləşdirin.

Quraşdırma Docker konteynerlərində işləyir. GitLab Linux-da pulsuz qaçışçılar təklif edir və məncə, öz qaçışlarınızı da daxil etmək mümkün ola bilər (yeri gəlmişkən, bunun Docker və ya ekvivalentinin olmadığını bildiyim Haiku kimi sistemlər üçün necə işləyəcəyini anlamıram, lakin həmçinin FreeBSD üçün Docker yoxdur, ona görə də bu problem yalnız Haiku üçün deyil).

İdeal olaraq, Haiku proqramları Linux üçün Docker konteynerində qurula bilər. Bu vəziyyətdə, Haiku üçün montaj mövcud boru kəmərlərinə daxil edilə bilər. Çarpaz kompilyatorlar varmı? Yoxsa QEMU/KVM kimi bir şeydən istifadə edərək bütün Haiku-nu Docker konteynerində təqlid etməliyəm (docker daxilində bu şəkildə işləyəcəyini güman edirəm)? Yeri gəlmişkən, bir çox layihələr oxşar prinsiplərdən istifadə edir. Məsələn, Scribus bunu edir - o, artıq Haiku üçün mövcuddur. Gün gələcək, göndərə biləcəyəm belədir Haiku dəstəyi əlavə etmək üçün digər layihələrə sorğuları çəkin.

Tərtibatçılardan biri izah edir:

Paketləri özləri yaratmaq istəyən digər layihələr üçün adi CMake/CPack metodu dəstəklənir. Digər qurma sistemləri paketin qurma proqramına birbaşa zəng etməklə dəstəklənə bilər, insanlar onunla maraqlansalar yaxşıdır. Təcrübə göstərir ki, indiyə qədər maraq o qədər də çox deyildi, ona görə də haikuporter bizim üçün rahat işlədi, amma nəticədə hər iki üsul birlikdə işləməlidir. Linux və ya hər hansı digər server əməliyyat sistemindən (Haiku serverlərdə işləmək üçün nəzərdə tutulmayıb) çarpaz proqram təminatı üçün alətlər dəsti təqdim etməliyik.

Mən ayaqda alqışlayıram. Daimi Linux istifadəçiləri şəxsi sistem üçün deyil, server əməliyyat sistemi üçün lazım olan bütün bu əlavə yükü və əlavə baqajı (təhlükəsizlik, ciddi nəzarət və s.) daşıyırlar. Beləliklə, mən tamamilə razıyam ki, Linux-da Haiku proqramlarını qura bilmək ən yaxşı yoldur.

Nəticə

POSIX proqramlarını Haiku-ya köçürmək mümkündür, lakin adi yenidənqurmadan daha bahalı ola bilər. Əgər irc.freenode.net şəbəkəsindəki #haiku kanalından olan insanların köməyi olmasaydı, mən uzun müddət bununla bağlı qalacaqdım. Ancaq hətta onlar həmişə nəyin səhv olduğunu dərhal görmürdülər.

Qt ilə yazılmış proqramlar asan istisnadır. Heç bir problem olmadan sadə bir demo tətbiqi yığdım.

Sadə tətbiqlər üçün paket qurmaq da olduqca asandır, lakin yalnız "ənənəvi olaraq buraxılmış" olanlar üçün, yəni. haikuportlarda dəstək üçün nəzərdə tutulmuş versiyalı mənbə kodu arxivlərinə malik olmaq. GitHub ilə davamlı bir qurma (hər dəyişiklik üçün qurulma) üçün hər şey o qədər də sadə görünmür. Burada Haiku özünü Mac-dakı nəticədən daha çox Linux paylanması kimi hiss edir, burada XCode-da “Quraşdır” düyməsini kliklədiyiniz zaman paket əldə edirsiniz. .app, disk şəklinə daxil edilməyə hazırdır .dmg, veb saytımda yükləmək üçün hazırlanmışdır.
"Server" əməliyyat sisteminə, məsələn, Linux-a əsaslanan proqramların davamlı qurulması, çox güman ki, tərtibatçılar tərəfindən tələb olunarsa, mümkün olacaq, lakin hazırda Haiku layihəsinin başqa, daha aktual vəzifələri var.

Özünüz cəhd edin! Axı, Haiku layihəsi yaradılan DVD və ya USB-dən yükləmək üçün şəkillər təqdim edir gündəlik. Quraşdırmaq üçün sadəcə şəkli yükləyin və istifadə edərək flash sürücüyə yazın Etcher

Hər hansı bir sualınız var? Sizi rusdilli kursa dəvət edirik telegram kanalı.

Xətanın icmalı: C və C++ dillərində ayağınıza necə atəş açmaq olar. Haiku OS resept kolleksiyası

Etibarən müəllif tərcümə: bu, Haiku haqqında silsilədə beşinci məqalədir.

Məqalələrin siyahısı: Ilk İkinci Üçüncü Dördüncü

Mənbə: www.habr.com

Добавить комментарий