Haiku ile beşinci günüm: hadi bazı programları aktaralım

Haiku ile beşinci günüm: hadi bazı programları aktaralım

TL; DR: Haiku'yu ilk kez bir acemi gördü, Linux dünyasından bazı programları taşımaya çalışırken.

Haiku ile beşinci günüm: hadi bazı programları aktaralım
HPkg formatında paketlenmiş ilk Haiku taşımalı programım

Geçenlerde PC'ler için şaşırtıcı derecede iyi bir işletim sistemi olan Haiku'yu keşfettim.
Bugün yeni programların bu işletim sistemine nasıl taşınacağını öğreneceğim. Ana odak noktası, bir Linux geliştiricisinin bakış açısından Haiku'ya geçişin ilk deneyiminin açıklamasıdır. Haiku'yu ilk indirdiğimden bu yana bir hafta bile geçmediğinden, yol boyunca yaptığım aptalca hatalar için özür dilerim.

Üç hedefe ulaşmak istiyorum:

  • Basit bir CLI uygulamasını taşıyın
  • Bir uygulamayı GUI'den Qt'ye taşıma
  • Daha sonra bunları hpkg formatında paketleyin (hala AppDir ve AppImage'ı Haiku için uyarlamayı düşündüğüm için...)

Başlayalım. Bölümlerde документация и gelişmeve benzeri wiki HaikuPorts'tan doğru yönü buldum. Çevrimiçi bir PDF kitabı bile var BeOS: Bir Unix Uygulamasını Taşıma.
467 sayfa - ve bu 1997'den! İçeriye bakmak korkutucu ama en iyisini umuyorum. Geliştiricinin sözleri cesaret verici: "BeOS POSIX uyumlu olmadığı için uzun zaman aldı" ama Haiku "çoğunlukla" zaten böyle.

Basit bir CLI uygulamasını taşıma

İlk düşünce uygulamayı taşımaktı Avrdude, ancak ortaya çıktığı gibi, bu zaten yaptın uzun zaman önce.

İlk deneme: izlenecek bir şey yok

Anlayamadığım şey şu ki zaten Uygulamalar 10 yılı aşkın süredir Haiku'ya taşınıyor - işletim sisteminin henüz 1.0 sürümü olmamasına rağmen.

İkinci deneme: yeniden yazmam gerekiyor

Bu yüzden kullanacağım ptouch-770, etiketleri yazdırmak için kullandığım Brother P-Touch 770 yazıcıyı kontrol etmek için CLI.
Üzerine çeşitli etiketler basıyorum, belki bir önceki yazımda görmüşsünüzdür. Biraz önce Python'da küçük bir GUI sarmalayıcı programı yazmıştım (Gtk+'da olduğundan yeniden yazılması gerekecek ve bu öğrenmek için iyi bir neden).

Haiku ile beşinci günüm: hadi bazı programları aktaralım
Brother P-Touch 770 etiket yazıcısı Haiku ile çalışır mı?

Haiku paket yöneticisi kitaplıkları ve komutları biliyor, bu nedenle çalıştırırken "libintl bulunamıyor" mesajı alırsam configure - Daha yeni başlıyorum pkgman install devel:libintl ve gerekli paket bulunacaktır. Aynı şekilde pkgman install cmd:rsync. Peki, vb.

Bunun işe yaramadığı durumlar dışında:

/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

Belki de udev fazla Linux tabanlıdır ve bu nedenle Haiku için mevcut değildir. Bu, derlemeye çalıştığım kaynak kodunu düzenlemem gerektiği anlamına geliyor.
Eh, kafanın üzerinden atlayamazsın ve nereden başlayacağımı bile bilmiyorum.

Üçüncü deneme

Sahip olmak güzel olurdu tmate Haiku için, bir şeyler ters giderse diye Haiku geliştiricilerinin terminal oturumuma bağlanmasına izin verirdim. Talimatlar oldukça basit:

./autogen.sh
./configure
make
make install

Güzel görünüyor, neden Haiku'da denemiyorsunuz?

/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 adımda HaikuDepot'u açıp arama yapıyorum curses.
Bana daha yetkin bir sorgu için ipucu veren bir şey bulundu:

/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

Tekrar HaikuDepot'a gittim ve tabii ki şunu buldum: devel:msgpack_c_cpp_devel. Nedir bu garip isimler?

/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 adımda, bir programı Haiku'ya taşımanın, basit bir yeniden yapılandırma için gerekenden çok daha fazla bilgi gerektirdiğini fark ettim.
Dost canlısı Haiku geliştiricileriyle konuştum, msgpack'te bir hata olduğu ortaya çıktı ve birkaç dakika sonra HaikuPorts'ta bir yama gördüm. Düzeltilmiş paketin nasıl olduğunu kendi gözlerimle görebiliyorum buraya gidiyorum (buildslave - sanal makineler).

Haiku ile beşinci günüm: hadi bazı programları aktaralım
Düzeltilmiş msgpack'in buildmaster'da oluşturulması

Arada sırada yukarı akışa bir yama gönderiyorum msgpack'e Haiku desteği eklemek için.

Beş dakika sonra güncellenen mesaj paketi Haiku'da zaten mevcuttur:

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

Beklenmedik derecede iyi. Bunu söylemiş miydim?!

Asıl soruna geri dönüyorum:

/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

Artık msgpack'in hatalı olmadığı anlaşılıyor. yorum yapıyorum IMAXLABEL в tty.c aşağıdaki gibidir:

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

Sonuç:

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.

Neyse yine başlıyoruz... Bu arada:

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

Bay. paytak paytak sıçrama size nereyi kazacağınızı söyler:

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

İşte yayınladım yapılandırma.log.

Bana libnetwork'te Haiku'daki libresolv'a ek olarak başka bir şeyin daha olduğunu açıkladılar. Görünüşe göre kodun daha fazla düzenlenmesi gerekiyor. Düşünmek gerek…

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

Ebedi soru: neler oluyor?

/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

Aynı şey, yalnızca profilde. Google'da arama yaptım ve bunu buldum. Eğer eklersen -lssp “bazen” yardımcı oluyor, deniyorum:

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

Vay! Başlıyor! Ancak…

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

Hata ayıklamayı deneyeceğim buraya dosyala:

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

"Kötü bağlantı noktası kimliği" zaten bir kartvizit gibidir haiku. Belki birisinin neyin yanlış olduğu ve nasıl düzeltileceği hakkında bir fikri vardır? Eğer öyleyse, makaleyi güncelleyeceğim. Bağlamak GitHub.

GUI uygulamasını Qt'ye taşıma.

Basit bir QML uygulaması seçiyorum.

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

Gerçekten basit. Bir dakikadan az!

Haikuporter ve haikuports kullanarak hpkg'da paketleme uygulamaları.

Neyle başlamalıyım? Basit bir belge yok, irc.freenode.net adresindeki #haiku kanalına gidiyorum ve şunu duyuyorum:

  • Ekip package - paket oluşturmanın düşük düzeyli bir yolu. "Uygun bir .hpkg paketine dönüştürme" bölümünde açıklandığı gibi, çoğunlukla PackageInfo onun için yeterlidir.
  • Bir şey yapmaya ihtiyacım var olduğunu
  • Kullanabilir hpkg yaratıcısı (benim için çöküyor, hata raporlama)

Ne yapılacağı belli değil. Sanırım Merhaba Dünya tarzı bir başlangıç ​​kılavuzuna, ideal olarak bir videoya ihtiyacım var. GNU hello'da yapıldığı gibi HaikuPorter'a da uygun bir giriş yapmak güzel olurdu.

Aşağıdakileri okuyorum:

haikuporter Haiku için ortak paket projeler oluşturmaya yönelik bir araçtır. Tüm paketler için HaikuPorts deposunu temel olarak kullanır. Haikuporter tarifleri paket oluşturmak için kullanılır.

Ek olarak şunu da öğreniyorum:

Tarifleri HaikuPorts deposunda saklamaya gerek yoktur. Başka bir depo oluşturabilir, tarifleri buraya koyabilir ve ardından haikuporter'ı oraya yönlendirebilirsiniz.

Tam da ihtiyacım olan şey; eğer paketi halka açık olarak yayınlamanın bir yolunu aramıyorsam. Ama bu başka bir yazının konusu.

Haikuporter ve haikuports'u yükleme

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

Tarif yazma

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
}

Tarifin bir araya getirilmesi

Dosyayı bu isimle kaydediyorum QtQuickApp-1.0.recipe, ardından başlatıyorum aikuporter -S ./QuickApp-1.0.recipe. Depodaki tüm paketler için bağımlılıklar kontrol edilir Haikuport'larBu biraz zaman alır. Gidip biraz kahve alacağım.

Bu kontrol neden herkes için merkezi olarak sunucuda değil de yerel makinemde yapılmalı?

Bay'a göre. :

Öyle ki depodaki herhangi bir dosyayı yeniden yazabilirsiniz 😉 Gerektiğinde gerekli bilgileri hesaplayarak bunu biraz optimize edebilirsiniz, çünkü yapılan son değişiklikler oldukça 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

Uygulamanızın kaynak kodunu içeren normal bir tarif dosyası diye bir şeyin olmadığı ortaya çıktı. HaikuPorts formatındaki bir depoda saklamanız gerekir.

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

Bu gerçek montajı daha hantal hale getiriyor. Bundan özellikle hoşlanmıyorum, ancak sonunda tüm açık kaynaklı yazılımların HaikuPorts'ta görünmesi için bunun gerekli olduğunu düşünüyorum.

Aşağıdakileri alıyorum:

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

Sorun nedir? İrc'yi okuduktan sonra şunları yapıyorum:

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

İlginç bir soru ortaya çıktı. Tarife bir sağlama toplamı eklersem sürekli entegrasyon için en son git taahhüdüyle eşleşecek mi? (Geliştirici şunu doğruluyor: "İşe yaramayacak. Tarifler nispeten kararlı olacak şekilde tasarlandı.")

Eğlenmek için tarife ekleyin:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Hala tatmin olmadı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 ne yapıyor? Sonuçta bu bir git deposu, kod zaten doğrudan orada, paketi açacak hiçbir şey yok. Benim bakış açıma göre araç, GitHub URL'sinin üzerindeyse paket açıcı aramayacak kadar akıllı olmalıdır.

Belki uri git:// işe yarayacaktır

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

Şimdi şöyle yakınıyor:

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

Hmm, neden her şey bu kadar karmaşık, neden “sadece çalışamıyorsun”? Sonuçta GitHub'dan bir şeyler oluşturmak o kadar da alışılmadık bir durum değil. İster kuruluma gerek kalmadan hemen çalışan araçlar, ister benim deyimimle " telaşlı" olsun.

Belki şu şekilde çalışacaktır:

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

Hayır. Hala bu garip hatayı alıyorum ve yapıyorum, burada açıklandığı gibi

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

Biraz daha ilerliyorum ama neden bana bağırıyor (GitHub güvenli değil!) ve hala bir şeyleri açmaya çalışıyor?

Göre Bay. paytak paytak sıçrama:

Evet, nedeni montaj için alınan verilerin bütünlüğünü kontrol etme arzusuydu. Seçeneklerden biri arşivin sağlama toplamını doğrulamaktır, ancak elbette tek tek dosyalara karma işlemi uygulayabilirsiniz, bu uygulanmayacaktır çünkü çok daha uzun sürüyor. Bunun sonucu git ve diğer VCS'nin "güvensizliğidir". GitHub'da arşiv oluşturmak oldukça kolay ve çoğu zaman daha hızlı olduğundan, bu büyük olasılıkla her zaman böyle olacaktır. Belki gelecekte hata mesajı bu kadar gösterişli olmayacaktır... (bu tür tarifleri artık HaikuPorts'ta birleştirmiyoruz).

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

Eski alışkanlıktan dolayı irc.freenode.net ağındaki #haiku kanalında iyi insanlara soruyorum. Peki onlar olmasaydı ben nerede olurdum? İpucundan sonra şunu kullanmam gerektiğini fark ettim:

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

Tamam, ne yaptığı belli oldu; belirli bir revizyonun kaynak kodunu içeren bir arşiv indiriyor. Benim açımdan aptalca ve tam olarak istediğim şey değil, yani en son revizyonu ana daldan indirmek.

Geliştiricilerden biri bunu şu şekilde açıkladı:

Kendi CI'mız var, dolayısıyla haikuports deposuna yerleştirilen her şey tüm kullanıcılar için paketlenecek ve "her şeyin en son sürüm yukarı akışında" toplanıp teslim edilmesi riskini almak istemiyoruz.

Anlaşıldı! Her durumda, olay şöyle 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 sonsuza kadar tekrarlanır. Görünüşe göre bu bir hata (bir uygulama var mı? Bulamadım).

С haikuporter ve depo Haikuport'lar "Sadece işe yarıyor" hissi vermiyor ama bir geliştirici olarak Haiku ile çalışmaktan hoşlandığım bazı şeyler var. Çoğunlukla, Linux yapıları oluşturmaya yönelik bir dizi araç olan Open Build Service'e benzer: sistematik bir yaklaşımla son derece güçlü, ancak benim küçük "merhaba dünya" uygulamam için aşırıya kaçıyor.

Yine Bay'a göre. :

Aslında, HaikuPorter varsayılan olarak oldukça katıdır (ayrıca onu daha da katı hale getirmek için bir tüy bırakma modu ve katı bir mod vardır!), ancak yalnızca paket oluşturmak yerine işe yarayacak paketler oluşturduğu için. Bu nedenle bildirilmemiş bağımlılıklardan, kitaplıkların düzgün şekilde içe aktarılmamasından, yanlış sürümlerden vs. şikayet ediyor. Amaç, gelecekteki sorunlar da dahil olmak üzere tüm sorunları, kullanıcı farkına varmadan yakalamaktır (bağımlılık aslında tarifte belirtildiği için avrdude'un kurulmasının mümkün olmamasının nedeni budur). Kitaplıklar yalnızca bireysel paketler veya hatta belirli SO sürümleri değildir. HaikuPorter, uygulama sırasında hataları önlemek için tariflerin kendisinde tüm bunlara uyulmasını sağlar.

Prensip olarak, bir işletim sistemi oluştururken bu düzeyde bir titizlik haklı görülebilir, ancak bir "merhaba dünya" uygulaması için bana gereksiz görünüyor. Başka bir şey denemeye karar verdim.

“Paket oluştur” komutunu kullanarak hpkg formatında uygulamalar oluşturma

belki bu Basit talimatlar benim için daha iyi sonuç verir mi?

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

Beklenmedik derecede hızlı, beklenmedik derecede basit, beklenmedik derecede etkili. Tam olarak hoşuma gitti, harika!

Kurulum - ne ve nerede?

QtQuickApp.hpkg dosyasını şuraya taşıdı: ~/config/packagesbir dosya yöneticisi kullanarak QtQuickApp sihirli bir şekilde ortaya çıktı ~/config/apps.
Yine beklenmedik derecede hızlı, basit ve etkili. İnanılmaz, inanılmaz!

Ama... (onlar olmasaydı biz nerede olurduk!)

Uygulama, uygulamalar menüsü listesinde ve QuickLaunch'ta hâlâ eksik. Sanırım bunu nasıl düzelteceğimi zaten biliyorum. Dosya yöneticisinde QtQuickApp.hpkg dosyasını ~/config/packages konumundan /system/packages konumuna taşıyorum.

Hayır, hâlâ kayıp. Görünüşe göre ben (ve talimatlar) bir şeyi kaçırdım.

Diğer bazı uygulamalar için HaikuDepot'taki "İçerikler" sekmesine baktığımda şöyle dosyalar olduğunu gördüm: /data/mimedb/application/x-vnd... daha da dikkat çekici olan şey ise /data/deskbar/menu/Applications/….

Peki oraya ne koymalıyım? Hadi...

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

Bu numaranın işe yarayacağından oldukça eminim ama hala sorular devam ediyor: Bu neden gerekli, ne için? Bunun, sistemin çok karmaşık olduğu yönündeki genel izlenimi mahvettiğini düşünüyorum.

Sayın'ın açıkladığı gibi. :

Bazen diğer uygulamaların ihtiyaç duyduğu ama menüde olmayan uygulamalar olabiliyor. Örneğin, ekran görüntünüzdeki LegacyPackageInstaller, BeOS formatındaki .pkg arşivlerini işliyor. Kullanıcıların bunları yüklemesini isterim ancak menüdeki varlıkları kafa karışıklığına yol açacaktır.

Bazı nedenlerden dolayı bana daha basit bir çözüm varmış gibi geliyor, örneğin Hidden=true dosyalarda .desktop Linux'ta. Neden "gizli" bilgiyi dosya sisteminin kaynağı ve niteliği yapmıyoruz?

Menüyü gösteren (bazı) uygulamaların adı özellikle incelikli değildir. deskbar, yol boyunca sıkı bir şekilde bağlanmış.

Bay. waddlesplash bunu şöyle açıklıyor:

Bu durumda "Masa çubuğu" bir tür genel terim olarak anlaşılmalıdır (hem Windows uygulamasını hem de genel kavramı ifade eden "görev çubuğu" ile aynı şekilde). Peki, bundan beri deskbar, “Masa Çubuğu” değil, bu da benzer şekilde anlaşılabilir.

Haiku ile beşinci günüm: hadi bazı programları aktaralım
İçlerindeki uygulamalarla 2 "neredeyse aynı" dizin

Neden uygulamaları içeren 2 dizin var ve ayrıca neden QtQuickApplication'ım birinde var, diğerinde yok? (Sonuçta, bu bir sistem sistemi değil, ikinci bir kullanıcı sistemidir ki bu benim için kişisel olarak anlaşılabilir bir durumdur).
Gerçekten kafam karıştı ve bunun birleştirilmesi gerektiğini düşünüyorum.

bay tarafından yapılan yorum paytak paytak sıçrama

Uygulamalar kataloğu, menüde gerekmeyen uygulamaları içerir. Ancak menüyü daha özelleştirilebilir hale getirmek için menüdeki durumun gerçekten iyileştirilmesi gerekiyor.

Başvuru yoksa olmaz 😉

Merak ettim: uygulamaları barındırmak gerçekten gerekli mi? /system/apps, kullanıcıların onları orada görmesi istenmeyen bir durumdur. Belki bunları kullanıcının karşılaşmayacağı başka bir yere yerleştirmek daha iyi olabilir? Tıpkı Mac OS X'te yapıldığı gibi, paketlerin içeriği .appKullanıcıya görünmemesi gereken /Applications, /System/Library/…“` derinliklerinde saklanıyor.

Peki ya bağımlılıklar?

Sanırım bağımlılıkları bir şekilde belirtmeye değer, değil mi? Qt varsayılan olarak Haiku kurulumunun zorunlu bir parçası olarak kabul edilebilir mi? Hayır! Qt varsayılan olarak kurulmaz. Bir paket oluşturucu, ELF dosyalarını kontrol ederek bağımlılıkları otomatik olarak algılayabilir mi? Bana HaikuPorter'ın bunu gerçekten yaptığı söylendi ama package HAYIR. Bunun nedeni, yalnızca kendi başına dosyalar oluşturan bir "paket oluşturucu" olmasıdır. hpkg.

Bir paketin Haiku dışındaki paketlere bağımlı olmaması gerektiğine dair bir politika eklenerek Haiku daha karmaşık hale getirilmeli mi? haikuports? (Bunu yapmak isterdim, çünkü böyle bir politika işleri çok daha kolaylaştıracaktır; sistem, ek paket kaynaklarıyla uğraşmadan, herhangi bir yerden indirilen her paketin bağımlılıklarını otomatik olarak çözebilecektir.)

Bay. waddlesplash şöyle açıklıyor:

Geliştiricilerin özgürlüğünü bu kadar sınırlamak istemeyiz çünkü CompanyX kendi yazılım setini bağımlılıklarla (ve dolayısıyla bir depoyla) desteklemek isterse bunu tamamen özgürce yapacağı açıktır.

Bu durumda, üçüncü taraf paketlerin, uygulamada ihtiyaç duyulan her şeyi tamamen paketleyerek haikuport'larda bulunmayan herhangi bir şeye bağımlılıktan kaçınmasını tavsiye etmek faydalı olabilir. Ancak bunun bu serideki gelecekteki bir makalenin konusu olduğunu düşünüyorum. [Yazar AppImage'a doğru mu gidiyor? - yaklaşık. çevirmen]

Uygulama simgesi ekleme

Yeni oluşturulan uygulamamın kaynaklarına güzel yerleşik simgelerden birini eklemek istersem ne olur? Bunun harika bir konu olduğu ortaya çıktı, bu yüzden bir sonraki makalenin temeli olacak.

Sürekli uygulama derlemeleri nasıl organize edilir?

Inkscape gibi bir proje hayal edin (evet, Haiku'da henüz mevcut olmadığının farkındayım, ancak üzerinde görüntülenmesi uygundur). Bir kaynak kodu deposu var https://gitlab.com/inkscape/inkscape.
Birisi değişikliklerini depoya aktardığında derleme hatları başlatılır, ardından değişiklikler otomatik olarak test edilir, oluşturulur ve uygulama, Linux için AppImage (ne olursa olsun yerel test için indirilebilen bağımsız bir uygulama paketi) dahil olmak üzere çeşitli paketler halinde paketlenir. sistemde ne yüklü olabilir ya da olmayabilir [Biliyordum! - yaklaşık. çevirmen]). Her şube birleştirme isteğinde aynı şey olur, böylece birleştirme işleminden önce birleştirme isteğinde önerilen koddan oluşturulan uygulamayı indirebilirsiniz.

Haiku ile beşinci günüm: hadi bazı programları aktaralım
İstekleri derleme durumlarıyla birleştirme ve derleme başarılı olursa derlenmiş ikili dosyaları indirme yeteneği (yeşil renkle işaretlenmiştir)

Derleme Docker kapsayıcılarında çalışır. GitLab, Linux'ta ücretsiz koşucular sunuyor ve kendi koşucularınızı dahil etmenin mümkün olabileceğini düşünüyorum (bu arada, Docker veya eşdeğeri olmadığını bildiğim Haiku gibi sistemler için bunun nasıl çalışacağını anlamıyorum, ancak ayrıca FreeBSD için Docker yoktur, dolayısıyla bu sorun Haiku'ya özgü değildir).

İdeal olarak, Haiku uygulamaları Linux için bir Docker konteynerinin içinde oluşturulabilir. Bu durumda Haiku montajı mevcut boru hatlarına dahil edilebilir. Çapraz derleyiciler var mı? Yoksa QEMU/KVM gibi bir şey kullanarak (Docker içinde bu şekilde çalışacağını varsayarak) tüm Haiku'yu bir Docker konteynerinin içinde taklit etmeli miyim? Bu arada birçok proje benzer ilkeleri kullanıyor. Örneğin Scribus bunu yapıyor - bu Haiku için zaten mevcut. Bir gün gönderebileceğim gün gelecek böyle Haiku desteğini eklemek için istekleri diğer projelere çekin.

Geliştiricilerden biri şöyle açıklıyor:

Kendileri paket oluşturmak isteyen diğer projeler için normal CMake/CPack yöntemi desteklenir. Diğer derleme sistemleri, paketin derleme programını doğrudan çağırarak desteklenebilir; bu, eğer insanlar ilgilenirse sorun olmaz. Deneyimler şunu gösteriyor: Şu ana kadar çok fazla ilgi olmadı, dolayısıyla haikuporter bizim için uygun çalıştı, ancak sonuçta her iki yöntemin birlikte çalışması gerekiyor. Linux'tan veya başka herhangi bir sunucu işletim sisteminden çapraz yazılım oluşturma için bir dizi araç sunmalıyız (Haiku, sunucularda çalışacak şekilde tasarlanmamıştır).

Ayakta alkışlıyorum. Düzenli Linux kullanıcıları, bir sunucu işletim sistemi için gerekli olan ancak kişisel işletim sistemi için gerekli olmayan tüm bu ek yükü ve ek bagajı (güvenlik, sıkı kontrol vb.) Taşır. Bu yüzden Linux'ta Haiku uygulamaları oluşturabilmenin gidilecek yol olduğuna tamamen katılıyorum.

Sonuç

POSIX uygulamalarını Haiku'ya taşımak mümkündür ancak tipik bir yeniden yapılandırmadan daha pahalı olabilir. irc.freenode.net ağındaki #haiku kanalındaki insanların yardımı olmasaydı kesinlikle uzun süre bu işe takılıp kalırdım. Ancak onlar bile neyin yanlış olduğunu her zaman hemen göremiyorlardı.

Qt ile yazılan uygulamalar kolay bir istisnadır. Basit bir demo uygulamasını sorunsuzca bir araya getirdim.

Basit uygulamalar için bir paket oluşturmak da oldukça kolaydır, ancak yalnızca "geleneksel olarak yayımlananlar" için, yani. Haikuport'larda destek amaçlı sürümlendirilmiş kaynak kodu arşivlerine sahip olmak. GitHub ile sürekli bir derleme (her değişiklik taahhüdü için derleme) için her şey o kadar basit görünmüyor. Burada Haiku, Mac'teki sonuçtan çok bir Linux dağıtımına benziyor; burada XCode'daki "Oluştur" düğmesini tıkladığınızda bir paket alırsınız .app, disk görüntüsüne eklenmeye hazır .dmg, web sitemde indirilmeye hazırlandı.
Linux gibi bir "sunucu" işletim sistemine dayalı uygulamaların sürekli olarak oluşturulması, geliştiricilerden talep olması durumunda büyük olasılıkla mümkün olacaktır, ancak şu anda Haiku projesinin başka, daha acil görevleri vardır.

Kendin dene! Sonuçta, Haiku projesi DVD veya USB'den önyükleme için oluşturulan görüntüler sağlar günlük. Yüklemek için görüntüyü indirin ve kullanarak bir flash sürücüye yazın. hakkak

Sormak istediğiniz bir şey var mı? Sizi Rusça konuşulanlara davet ediyoruz telgraf kanalı.

Hataya genel bakış: C ve C++'da kendinizi ayağınızdan nasıl vurursunuz? Haiku OS tarif koleksiyonu

Itibaren yazar çeviri: Bu Haiku hakkındaki serinin beşinci makalesidir.

Makalelerin listesi: ilk İkinci Üçüncü Dördüncü

Kaynak: habr.com

Yorum ekle