Xayku bilan mening beshinchi kunim: keling, ba'zi dasturlarni o'tkazamiz

Xayku bilan mening beshinchi kunim: keling, ba'zi dasturlarni o'tkazamiz

TP; DR: Yangi boshlovchi birinchi marta Linux dunyosidan ba'zi dasturlarni ko'chirishga urinayotgan Xaykuni ko'rdi.

Xayku bilan mening beshinchi kunim: keling, ba'zi dasturlarni o'tkazamiz
Hpkg formatida qadoqlangan birinchi Haiku dasturim

Yaqinda Men kompyuterlar uchun hayratlanarli darajada yaxshi operatsion tizim Haiku-ni kashf qildim.
Bugun men ushbu operatsion tizimga yangi dasturlarni qanday portlashni o'rganaman. Asosiy e'tibor - Linux ishlab chiqaruvchisi nuqtai nazaridan Haiku-ga o'tishning birinchi tajribasining tavsifi. Yo'lda qilgan ahmoqona xatolarim uchun uzr so'rayman, chunki Xaykuni birinchi marta yuklab olganimga bir hafta ham bo'lgani yo'q.

Men uchta maqsadga erishmoqchiman:

  • Oddiy CLI ilovasini ulang
  • Ilovani GUI dan Qt ga o'tkazing
  • Keyin ularni hpkg formatida joylashtiring (chunki men hali ham AppDir va AppImage-ni Haiku uchun moslashtirish haqida o'ylayapman...)

Qani boshladik. Bo'limlarda hujjatlar ΠΈ ishlab chiqish, shuningdek Wiki HaikuPorts-dan men to'g'ri yo'nalishni topdim. Hatto onlayn PDF kitob ham mavjud BeOS: Unix ilovasini ko'chirish.
467 sahifa - va bu 1997 yildan! Ichkariga qarash qo'rqinchli, lekin men eng yaxshisiga umid qilaman. Ishlab chiquvchining so'zlari dalda beradi: "Bu uzoq vaqt talab qildi, chunki BeOS POSIX-ga mos kelmadi", lekin Haiku "ko'pincha" allaqachon shunday.

Oddiy CLI ilovasini portlash

Birinchi fikr ilovani portga o'tkazish edi avrdude, lekin, ma'lum bo'lishicha, bu allaqachon qildim uzoq vaqt oldin.

Birinchi urinib ko'ring: tomosha qilish uchun hech narsa yo'q

Men tushuna olmaydigan narsa bu allaqachon Ilovalar Haiku-ga 10 yildan ortiq vaqt davomida ko'chirildi - OTning o'zi hali 1.0 versiyasi bo'lmaganiga qaramay.

Ikkinchi urinish: qayta yozish kerak

Shunday qilib, men foydalanaman ptouch-770, Yorliqlarni chop etishda foydalanadigan Brother P-Touch 770 printerini boshqarish uchun CLI.
Men unga turli teglarni chop etaman va siz buni avvalgi maqolada ko'rgan bo'lishingiz mumkin. Biroz oldin, men Python-da kichik GUI o'rash dasturini yozdim (u Gtk+ da bo'lgani uchun uni qayta yozish kerak bo'ladi va bu o'rganish uchun yaxshi sababdir).

Xayku bilan mening beshinchi kunim: keling, ba'zi dasturlarni o'tkazamiz
Brother P-Touch 770 yorliqli printer. U Haiku bilan ishlaydimi?

Haiku paketi menejeri kutubxonalar va buyruqlar haqida biladi, shuning uchun ishlayotganimda "libintl topa olmayapman" xabarini olsam configure - Hozirgina ishga tushaman pkgman install devel:libintl va kerakli paket topiladi. Xuddi shunday pkgman install cmd:rsync. Xo'sh, va hokazo.

Bu ishlamagan hollar bundan mustasno:

/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

Ehtimol, udev juda Linux-ga asoslangan va shuning uchun Haiku uchun mavjud emas. Bu men kompilyatsiya qilmoqchi bo'lgan manba kodini tahrirlashim kerakligini anglatadi.
Eh, siz boshingizdan sakrab o'ta olmaysiz va men qaerdan boshlashni ham bilmayman.

Uchinchi urinish

Bo'lsa yaxshi bo'lardi tmate Xayku uchun, agar biror narsa noto'g'ri bo'lsa, men Haiku dasturchilariga terminal seansimga ulanishga ruxsat beraman. Ko'rsatmalar juda oddiy:

./autogen.sh
./configure
make
make install

Yaxshi ko'rinadi, nega uni Xaykuda sinab ko'rmaysiz?

/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

Ushbu bosqichda men HaikuDepotni ochaman va qidiraman curses.
Biror narsa topildi, bu menga yanada vakolatli so'rov uchun maslahat berdi:

/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

Yana HaikuDepotga bordim va, albatta, topdim devel:msgpack_c_cpp_devel. Bu g'alati ismlar nima?

/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

Ushbu bosqichda men dasturni Haiku-ga o'tkazish oddiy qayta qurish uchun kerak bo'lgandan ko'ra ko'proq bilim talab qilishini tushundim.
Men do'stona Haiku dasturchilari bilan suhbatlashdim, msgpack-da xatolik borligi ma'lum bo'ldi va bir necha daqiqadan so'ng men HaikuPorts-da yamoqni ko'raman. Qanday tuzatilgan paketni o'z ko'zim bilan ko'raman bu erga borish (buildslave - virtual mashinalar).

Xayku bilan mening beshinchi kunim: keling, ba'zi dasturlarni o'tkazamiz
Buildmaster-da tuzatilgan msgpackni yaratish

Vaqt oralig'ida men yuqori oqimga yamoq yuboraman msgpack-ga Haiku yordamini qo'shish uchun.

Besh daqiqadan so'ng yangilangan msgpack Haiku-da allaqachon mavjud:

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

Kutilmaganda yaxshi. Men aytganim shumi?!

Asl muammoga qaytaman:

/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

Endi msgpack aybdor emasga o'xshaydi. Men fikr bildiraman IMAXLABEL Π² tty.c shuning uchun:

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

natija:

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.

Xo'sh, yana boramiz... Aytgancha:

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

Janob. vaddlesplash qaerga qazish kerakligini aytadi:

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

Mana men e'lon qildim config.log.

Ular menga libnetworkda Xaykudagi libresolvdan tashqari yana bir narsa borligini tushuntirishdi. Ko'rinishidan, kodni yanada tahrirlash kerak. O'ylab ko'rish kerak…

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

Abadiy savol: nima bo'lyapti?

/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

Xuddi shu narsa, faqat profilda. Googled va buni topdi. Qo'shsangiz -lssp "ba'zan" yordam beradi, men harakat qilaman:

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

Voy-buy! Boshlanmoqda! Lekin…

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

Men disk raskadrovka qilishga harakat qilaman bu yerda fayl:

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

"Yomon port identifikatori" allaqachon tashrif qog'oziga o'xshaydi hayku. Ehtimol, kimdir nima noto'g'ri ekanligini va uni qanday tuzatish haqida fikrga egadir? Agar shunday bo'lsa, men maqolani yangilayman. ga havola GitHub.

GUI ilovasini Qt ga ko'chirish.

Men oddiy QML ilovasini tanlayman.

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

Haqiqatan ham oddiy. Bir daqiqadan kamroq vaqt!

haikuporter va haikuports yordamida hpkg da qadoqlash ilovalari.

Nimadan boshlashim kerak? Hech qanday oddiy hujjat yo'q, men irc.freenode.net saytidagi #haiku kanaliga boraman va eshitaman:

  • komanda package - paketlarni yaratishning past darajadagi usuli. "Uni tegishli .hpkg to'plamiga aylantirish" bo'limida ta'riflanganidek, ko'pincha PackageInfo uning uchun etarli.
  • Men nimadir qilishim kerak mavjud
  • Siz foydalanishingiz mumkin hpkg yaratuvchisi (bu men uchun buziladi, xato haqida xabar berish)

Nima qilish kerakligi aniq emas. O'ylaymanki, menga Salom Dunyo uslubidagi boshlang'ich qo'llanma kerak, eng yaxshisi video. GNU salomida bo'lgani kabi HaikuPorter bilan ham qulay tanishuv bo'lsa yaxshi bo'lardi.

Men quyidagilarni o'qidim:

haikuporter Haiku uchun umumiy paketli loyihalarni yaratish vositasidir. U barcha paketlar uchun asos sifatida HaikuPorts omboridan foydalanadi. Haikuporter retseptlari paketlarni yaratish uchun ishlatiladi.

Bundan tashqari, men quyidagilarni bilib oldim:

Retseptlarni HaikuPorts omborida saqlashning hojati yo'q. Siz boshqa omborni yaratishingiz, unga retseptlarni qo'yishingiz va keyin unga haikuporterni ko'rsatishingiz mumkin.

Menga kerak bo'lgan narsa - agar paketni ommaviy ravishda chiqarish yo'lini qidirmasangiz. Ammo bu boshqa post uchun mavzu.

Haikuporter va haikuportlarni o'rnatish

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

Retsept yozish

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
}

Retseptni yig'ish

Men faylni nomi ostida saqlayman QtQuickApp-1.0.recipe, shundan keyin men ishga tushiraman aikuporter -S ./QuickApp-1.0.recipe. Bog'liqliklar ombordagi barcha paketlar uchun tekshiriladi haikuports, bu biroz vaqt talab etadi. Men borib kofe olib kelaman.

Nima uchun bu tekshiruv hamma uchun bir marta serverda emas, balki mening mahalliy kompyuterimda amalga oshirilishi kerak?

janobga ko'ra. vaddlesplash:

Shunday qilib, siz ombordagi istalgan faylni qayta yozishingiz mumkin πŸ˜‰ Buni biroz optimallashtirishingiz mumkin, kerak bo'lganda kerakli ma'lumotlarni hisoblab chiqing, chunki oxirgi kiritilgan o'zgarishlar juda kam.

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

Ma'lum bo'lishicha, ilovangizning manba kodini o'z ichiga olgan oddiy retsept fayli kabi narsa yo'q. Siz uni HaikuPorts formatidagi omborda saqlashingiz kerak.

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

Bu fakt yig'ilishni yanada og'irlashtiradi. Bu menga unchalik yoqmaydi, lekin oxir-oqibat barcha ochiq kodli dasturiy ta'minot HaikuPorts-da paydo bo'lishi uchun bu zarur deb o'ylayman.

Men quyidagilarni olaman:

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

Nima bo'ldi? irc ni o'qiganimdan keyin men shunday qilaman:

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

Qiziqarli savol tug'ildi. Agar retseptga nazorat summasini qo'shsam - bu doimiy integratsiya uchun eng so'nggi git majburiyatiga mos keladimi? (Ishlab chiquvchi tasdiqlaydi: "Bu ishlamaydi. Retseptlar nisbatan barqaror bo'lishi uchun yaratilgan.")

O'yin-kulgi uchun retseptga qo'shing:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Hali ham qoniqmadim:

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

U nima qilyapti? Axir, bu git ombori, kod allaqachon to'g'ridan-to'g'ri mavjud, ochish uchun hech narsa yo'q. Mening fikrimcha, vosita GitHub url-dan yuqori bo'lsa, unpackerni qidirmaslik uchun etarlicha aqlli bo'lishi kerak.

Ehtimol, uri git:// ishlaydi

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

Endi u shunday shikoyat qiladi:

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

Hmm, nima uchun hamma narsa juda murakkab, nega siz "shunchaki ishlay olmaysiz"? Axir, GitHub-dan biror narsa yaratish odatiy hol emas. Bu o'rnatishga hojat qoldirmasdan darhol ishlaydigan vositalar bo'ladimi yoki men buni "bezovta" deb ataganimdek.

Ehtimol, u shunday ishlaydi:

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

Yoq. Men hali ham bu g'alati xatoni olaman va shunday qilaman, bu yerda tasvirlanganidek

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

Men biroz oldinga ketyapman, lekin nega u menga qichqirmoqda (GitHub xavfsiz emas!) Va hali ham biror narsani ochishga harakat qilmoqda.

Shunga ko'ra Janob. vaddlesplash:

Xo'sh, ha, sabab yig'ish uchun olingan ma'lumotlarning yaxlitligini tekshirish istagi edi. Variantlardan biri arxivning nazorat summasini tekshirishdir, lekin siz, albatta, amalga oshirilmaydigan individual fayllarni xeshlashingiz mumkin, chunki ancha uzoqroq vaqt talab etadi. Buning oqibati git va boshqa VCS ning "xavfsizligi". Bu har doim shunday bo'ladi, chunki GitHub-da arxiv yaratish juda oson va tez-tez tez. Xo'sh, kelajakda, ehtimol, xato xabari unchalik yorqin bo'lmaydi ... (biz endi HaikuPorts-da bunday retseptlarni birlashtirmaymiz).

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

Qadimgi odatim bo'yicha men irc.freenode.net tarmog'idagi #haiku kanalida yaxshi odamlardan so'rayman. Va ularsiz men qayerda bo'lardim? Maslahatdan keyin men foydalanishim kerakligini angladim:

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

Xo'sh, u nima qilishi aniq bo'ldi - u ma'lum bir tahrirning manba kodi bilan arxivni yuklab oladi. Bu mening nuqtai nazarimdan ahmoqlik va men xohlagan narsa emas, ya'ni master filialidan so'nggi versiyani yuklab olish.

Ishlab chiquvchilardan biri buni quyidagicha tushuntirdi:

Bizda o'z CI bor, shuning uchun haikuports omboriga joylashtirilgan hamma narsa barcha foydalanuvchilar uchun qadoqlangan bo'ladi va biz "hamma narsani oxirgi versiyada" to'plash va etkazib berish xavfini istamaymiz.

Tushundim! Har holda, shunday bo'ldi:

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 reklama infinitum takrorlaydi. Ko'rinishidan, bu xato (ilova bormi? Men uni topa olmadim).

Π‘ haikuporter va ombor haikuports Unda "shunchaki ishlaydi" degan tuyg'u yo'q, lekin dasturchi sifatida menga Xayku bilan ishlashning ba'zi jihatlari yoqadi. Ko'pincha, bu Open Build xizmatiga o'xshaydi, Linux tuzilmalarini yaratish uchun vositalar to'plami: juda kuchli, tizimli yondashuv bilan, lekin mening kichik "salom dunyo" ilovam uchun ortiqcha.

Yana, janobga ko'ra. vaddlesplash:

Haqiqatan ham, HaikuPorter sukut bo'yicha juda qattiq (shuningdek, uni yanada qattiqroq qilish uchun lint rejimi va qat'iy rejim mavjud!), lekin faqat paketlarni yaratish o'rniga ishlaydigan paketlarni yaratgani uchun. Shuning uchun u e'lon qilinmagan bog'liqliklar, to'g'ri import qilinmagan kutubxonalar, noto'g'ri versiyalar va boshqalar haqida shikoyat qiladi. Maqsad har qanday va barcha muammolarni, shu jumladan kelajakdagi muammolarni foydalanuvchi bu haqda bilishidan oldin (shuning uchun avrdude-ni o'rnatib bo'lmadi, chunki qaramlik aslida retseptda ko'rsatilgan). Kutubxonalar nafaqat alohida paketlar yoki hatto maxsus SO versiyalari. HaikuPorter bularning barchasi bajarilish vaqtida xatolikka yo'l qo'ymaslik uchun retseptlarning o'zida kuzatilishini ta'minlaydi.

Asosan, operatsion tizimni yaratishda bunday qat'iylik darajasi oqlanadi, ammo "salom dunyo" ilovasi uchun bu menga keraksiz ko'rinadi. Men boshqa narsani sinab ko'rishga qaror qildim.

"Paket yaratish" buyrug'i yordamida hpkg formatida ilovalarni yaratish

Balkim, bu Oddiy ko'rsatmalar men uchun yaxshiroq ishlaydimi?

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

Kutilmagan darajada tez, kutilmaganda oddiy, kutilmaganda samarali. Bu menga qanday yoqadi, ajoyib!

O'rnatish - nima va qaerda?

QtQuickApp.hpkg fayli quyidagi manzilga koΚ»chirildi ~/config/packagesfayl boshqaruvchisi yordamida, shundan so'ng QtQuickApp sehrli tarzda paydo bo'ldi ~/config/apps.
Shunga qaramay, kutilmaganda tez, oddiy va samarali. Ajoyib, aql bovar qilmaydigan!

Lekin... (ularsiz qayerda bo'lardik!)

Ilova hali ham ilovalar menyusi ro'yxatida va QuickLaunchda yo'q. Men buni qanday tuzatishni allaqachon bilaman deb o'ylayman. Fayl menejerida men QtQuickApp.hpkg ni ~/config/packages-dan /system/packages-ga o'tkazaman.

Yo'q, hali ham yo'q. Ko'rinishidan, men (yaxshi va ko'rsatmalar) nimanidir o'tkazib yubordim.

Boshqa ilovalar uchun HaikuDepot-dagi "Tarkib" yorlig'ini ko'rib chiqib, men shunga o'xshash fayllar mavjudligini ko'rdim. /data/mimedb/application/x-vnd... bundan ham e'tiborga molik narsa /data/deskbar/menu/Applications/….

Xo'sh, u erga nima qo'yishim kerak? Qo'ysangchi; qani endi...

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

Ishonchim komilki, bu hiyla ishlaydi, ammo savollar qoladi: bu nima uchun kerak, bu nima uchun? Menimcha, bu tizim juda murakkab degan umumiy taassurotni buzadi.

Janob tomonidan tushuntirilganidek. vaddlesplash:

Ba'zan boshqa ilovalarga kerak bo'lgan, ammo menyuda bo'lmagan ilovalar mavjud. Masalan, skrinshotingizda LegacyPackageInstaller, BeOS formatida .pkg arxivlarini qayta ishlash. Men foydalanuvchilarning ularni o'rnatishini xohlayman, lekin ularning menyuda mavjudligi chalkashlikka olib keladi.

Negadir menga oddiyroq yechim bordek tuyuladi, masalan Hidden=true fayllarda .desktop Linuxda. Nima uchun "yashirin" ma'lumotni fayl tizimining resursi va atributiga aylantirmaslik kerak?

Menyuni ko'rsatadigan (ba'zi) dasturning nomi, ayniqsa nozik emas, deskbar, yo'l bo'ylab qattiq bog'langan.

Janob. waddlesplash buni tushuntiradi:

Bu holda "ish stoli" umumiy atamaning bir turi sifatida tushunilishi kerak ("vazifa paneli" bilan bir xil tarzda Windows ilovasi va umumiy tushunchani anglatadi). Xo'sh, shundan beri deskbar, β€œIsh stoli” emas, buni ham xuddi shunday tushunish mumkin.

Xayku bilan mening beshinchi kunim: keling, ba'zi dasturlarni o'tkazamiz
2 ta "deyarli bir xil" kataloglar, ularda ilovalar mavjud

Nima uchun ilovalarga ega 2 ta katalog mavjud va nega mening QtQuickApplication birida, lekin boshqasida emas? (Oxir oqibat, bu bitta tizim emas, balki shaxsan men uchun tushunarli bo'lgan ikkinchi foydalanuvchi).
Men chindan ham sarosimaga tushdim va men buni birlashtirish kerak deb o'ylayman.

janob tomonidan sharh. vaddlesplash

Ilovalar katalogida menyuda kerak bo'lmagan ilovalar mavjud. Lekin menyu bilan bog'liq vaziyat, albatta, uni yanada moslashtirish uchun yaxshilash kerak.

Ilova, aks holda bo'lmaydi πŸ˜‰

Men hayron bo'ldim: haqiqatan ham ilovalarni joylashtirish kerakmi? /system/apps, agar foydalanuvchilar ularni u erda ko'rsa, bu istalmagan. Ehtimol, ularni foydalanuvchi ularni uchratmaydigan boshqa joyga qo'yish yaxshidir? Xuddi Mac OS X da qilinganidek, paketlar mazmuni .app, bu foydalanuvchiga ko'rinmasligi kerak /Applications, /Tizim/Kutubxona/β€¦β€œ` tubida yashiringan.

Bog'liqliklar haqida nima deyish mumkin?

Menimcha, qandaydir tarzda bog'liqliklarni ko'rsatishga arziydi, to'g'rimi? Qt sukut bo'yicha Haiku o'rnatilishining majburiy qismi deb hisoblanishi mumkinmi? Yoq! Qt sukut bo'yicha o'rnatilmagan. Paket ishlab chiqaruvchisi ELF fayllarini tekshirish orqali bog'liqlikni avtomatik ravishda aniqlay oladimi? Menga HaikuPorter buni aslida qilishini aytishdi, lekin package Yo'q. Buning sababi, u faqat o'z-o'zidan fayllarni yaratadigan "paket yaratuvchisi" hpkg.

Paket Xaykudan tashqari paketlarga bog'liq bo'lmasligi kerakligi haqidagi siyosatni qo'shish orqali Xaykuni yanada murakkablashtirish kerakmi? haikuports? (Men xohlayman, chunki bunday siyosat ishlarni ancha osonlashtiradi - tizim qo'shimcha paket manbalari bilan aralashmasdan, istalgan joydan yuklab olingan har bir paketning bog'liqligini avtomatik ravishda hal qila oladi.)

Janob. waddlesplash tushuntiradi:

Biz ishlab chiquvchilarning erkinligini cheklamoqchi emasmiz, chunki agar CompanyX o'zining dasturiy ta'minot to'plamini bog'liqliklar (va shuning uchun ombor) bilan qo'llab-quvvatlamoqchi bo'lsa, u buni butunlay erkin bajarishi aniq.

Bunday holda, ilova bilan zarur bo'lgan barcha narsalarni to'liq o'rash orqali uchinchi tomon paketlariga haikuportlarga kiritilmagan narsalarga bog'liqlikdan qochish tavsiya etiladi. Ammo menimcha, bu ushbu turkumdagi kelajakdagi maqola uchun mavzu. [Muallif AppImage tomon ketyaptimi? - taxminan. tarjimon]

Ilova belgisini qo'shish

Yangi yaratilgan ilovamning resurslariga toza o'rnatilgan piktogrammalardan birini qo'shmoqchi bo'lsam-chi? Ma'lum bo'lishicha, bu ajoyib mavzu, shuning uchun u keyingi maqola uchun asos bo'ladi.

Uzluksiz ilovalarni yaratishni qanday tashkil qilish kerak?

Inkscape kabi loyihani tasavvur qiling (ha, men u Haiku'da hali mavjud emasligini bilaman, lekin uni ko'rsatish qulay). Ularda manba kodlari ombori mavjud https://gitlab.com/inkscape/inkscape.
Har safar kimdir omborga o'z o'zgartirishlarini kiritganida, quvurlarni qurish ishga tushiriladi, shundan so'ng o'zgarishlar avtomatik ravishda sinovdan o'tkaziladi, quriladi va dastur turli paketlarga, jumladan Linux uchun AppImage (lokal sinov uchun yuklab olinishi mumkin bo'lgan mustaqil dastur paketi) ichiga qadoqlanadi. tizimda nima o'rnatilishi yoki o'rnatilishi mumkin emas [Buni bilgandim! - taxminan. tarjimon]). Xuddi shu narsa har bir filialni birlashtirish so'rovida sodir bo'ladi, shuning uchun siz birlashma so'rovida taklif qilingan koddan tuzilgan dasturni birlashtirishdan oldin yuklab olishingiz mumkin.

Xayku bilan mening beshinchi kunim: keling, ba'zi dasturlarni o'tkazamiz
Qurilish holati va agar qurish muvaffaqiyatli bo'lsa, tuzilgan ikkilik fayllarni yuklab olish imkoniyati bilan so'rovlarni birlashtiring (yashil rang bilan belgilangan)

Qurilish Docker konteynerlarida ishlaydi. GitLab Linux-da bepul yuguruvchilarni taklif qiladi va menimcha, o'z yuguruvchilaringizni kiritish mumkin bo'lishi mumkin (Aytgancha, bu Haiku kabi tizimlar uchun qanday ishlashini tushunmayapman, men bilaman Docker yoki ekvivalenti yo'q, lekin shuningdek, FreeBSD uchun Docker yo'q, shuning uchun bu muammo faqat Xaykuga xos emas).

Ideal holda, Haiku ilovalari Linux uchun Docker konteyneri ichida tuzilishi mumkin. Bunday holda, Haiku uchun yig'ish mavjud quvurlarga kiritilishi mumkin. O'zaro kompilyatorlar bormi? Yoki QEMU/KVM kabi biror narsa yordamida Docker konteyneridagi barcha Haiku-ni taqlid qilishim kerakmi (agar u Docker ichida shunday ishlaydi deb faraz qilsam)? Aytgancha, ko'plab loyihalar shunga o'xshash printsiplardan foydalanadi. Masalan, Scribus buni amalga oshiradi - u allaqachon Xayku uchun mavjud. Bir kun keladi, men yuboraman shunday Haiku yordamini qo'shish uchun boshqa loyihalarga so'rovlarni torting.

Ishlab chiquvchilardan biri tushuntiradi:

Paketlarni o'zlari yaratmoqchi bo'lgan boshqa loyihalar uchun odatiy CMake/CPack usuli qo'llab-quvvatlanadi. Boshqa qurish tizimlarini to'g'ridan-to'g'ri to'plamni qurish dasturiga qo'ng'iroq qilish orqali qo'llab-quvvatlash mumkin, agar odamlar unga qiziqsa yaxshi bo'ladi. Tajriba shuni ko'rsatadiki, hozirgacha unchalik katta qiziqish yo'q edi, shuning uchun haikuporter biz uchun qulay bo'lib ishladi, ammo, oxir-oqibat, ikkala usul ham birgalikda ishlashi kerak. Biz Linux yoki boshqa server operatsion tizimidan (Haiku serverlarda ishlash uchun mo'ljallanmagan) o'zaro dasturiy ta'minotni yaratish uchun vositalar to'plamini joriy qilishimiz kerak.

Men tik turib olqishlayman. Muntazam Linux foydalanuvchilari ushbu qo'shimcha yuk va qo'shimcha yuklarni (xavfsizlik, qat'iy nazorat va h.k.) olib yuradilar, ular shaxsiy tizim uchun emas, balki server operatsion tizimi uchun zarurdir. Shunday qilib, men Linuxda Haiku ilovalarini yaratish imkoniyatiga ega bo'lish yo'li ekanligiga to'liq qo'shilaman.

xulosa

POSIX ilovalarini Haiku-ga ko'chirish mumkin, lekin odatdagi qayta qurishdan qimmatroq bo'lishi mumkin. Agar irc.freenode.net tarmog'idagi #haiku kanali odamlari yordami bo'lmaganida, men, albatta, uzoq vaqt bu bilan qotib qolgan bo'lardim. Ammo ular ham nima bo'lganini har doim ham darhol ko'rishmagan.

Qt-da yozilgan ilovalar oson istisno. Men hech qanday muammosiz oddiy demo ilovani jamladim.

Oddiy ilovalar uchun paketni yaratish ham juda oson, lekin faqat "an'anaviy ravishda chiqarilgan"lar uchun, ya'ni. haikuportlarda qo'llab-quvvatlash uchun mo'ljallangan versiyali manba kodi arxivlariga ega. GitHub bilan uzluksiz qurish (har bir o'zgarishlar uchun tuzilish) uchun hamma narsa unchalik oddiy emasdek tuyuladi. Bu erda Xayku o'zini Mac-dagi natijadan ko'ra ko'proq Linux distribyutsiyasiga o'xshatadi, bu erda XCode-dagi "Build" tugmasini bosganingizda siz paketga ega bo'lasiz. .app, disk tasviriga kiritishga tayyor .dmg, veb-saytimda yuklab olish uchun tayyorlangan.
"Server" operatsion tizimiga asoslangan ilovalarni doimiy ravishda yaratish, masalan, Linux, agar ishlab chiquvchilar tomonidan talab bo'lsa, mumkin bo'ladi, ammo hozirda Xayku loyihasida boshqa, yanada dolzarb vazifalar mavjud.

O'zingiz sinab ko'ring! Axir, Haiku loyihasi yaratilgan DVD yoki USB-dan yuklash uchun tasvirlarni taqdim etadi Ejednevno. O'rnatish uchun rasmni yuklab oling va uni flesh-diskga yozing Etcher

Savollaringiz bormi? Sizni rusiyzabonlarga taklif qilamiz telegram kanali.

Xatolar haqida umumiy ma'lumot: C va C++ da oyog'ingizga qanday otish kerak. Haiku OS retseptlar to'plami

dan muallif tarjima: bu Xayku haqidagi turkumdagi beshinchi maqola.

Maqolalar ro'yxati: birinchi ikkinchi uchinchi To'rtinchi

Manba: www.habr.com

a Izoh qo'shish