يومي الخامس مع هايكو: لننقل بعض البرامج

يومي الخامس مع هايكو: لننقل بعض البرامج

TL؛ DR: رأى مبتدئ هايكو لأول مرة، وهو يحاول نقل بعض البرامج من عالم Linux.

يومي الخامس مع هايكو: لننقل بعض البرامج
أول برنامج منقول من Haiku، معبأ بتنسيق hpkg

مؤخرا لقد اكتشفت Haiku، وهو نظام تشغيل جيد بشكل مدهش لأجهزة الكمبيوتر.
سأتعلم اليوم كيفية نقل البرامج الجديدة إلى نظام التشغيل هذا. ينصب التركيز الرئيسي على وصف التجربة الأولى للتحول إلى Haiku من وجهة نظر مطور Linux. أعتذر عن أي أخطاء غبية ارتكبتها على طول الطريق، لأنه لم يمر أسبوع منذ أن قمت بتنزيل Haiku لأول مرة.

أريد تحقيق ثلاثة أهداف:

  • منفذ تطبيق CLI بسيط
  • نقل تطبيق من واجهة المستخدم الرسومية إلى Qt
  • ثم قم بتعبئتها بتنسيق hpkg (بما أنني لا أزال أفكر في تكييف AppDir وAppImage مع Haiku...)

هيا بنا نبدأ. في الأقسام الوثائق и تطوير، وكذلك في ويكي من HaikuPorts وجدت الاتجاه الصحيح. حتى أن هناك كتاب PDF على الإنترنت BeOS: ترقية تطبيق يونكس.
467 صفحة - وهذا من عام 1997! إنه أمر مخيف أن ننظر إلى الداخل، لكنني آمل الأفضل. كلمات المطور مشجعة: "لقد استغرق الأمر وقتًا طويلاً لأن BeOS لم يكن متوافقًا مع POSIX"، ولكن Haiku "في الغالب" هو هكذا بالفعل.

نقل تطبيق CLI بسيط

كانت الفكرة الأولى هي نقل التطبيق avrdude، ولكن، كما اتضح فيما بعد، هذا هو بالفعل قد فعلت منذ وقت طويل.

المحاولة الأولى: لا يوجد شيء للمشاهدة

ما لا أستطيع أن أفهمه هو ذلك بالفعل لقد تم نقل التطبيقات إلى Haiku لأكثر من 10 سنوات - على الرغم من أن نظام التشغيل نفسه لم يصل حتى إلى الإصدار 1.0 بعد.

المحاولة الثانية: بحاجة إلى إعادة الكتابة

لذلك سأستخدم بتتش-770، CLI للتحكم في طابعة Brother P-Touch 770 التي أستخدمها لطباعة الملصقات.
أقوم بطباعة ملصقات مختلفة عليها، وربما تكون قد شاهدتها بالفعل في المقالة السابقة. قبل ذلك بقليل، كتبت برنامجًا صغيرًا لتغليف واجهة المستخدم الرسومية بلغة Python (نظرًا لأنه موجود في Gtk+، فسيتعين إعادة كتابته، وهذا سبب وجيه للتعلم).

يومي الخامس مع هايكو: لننقل بعض البرامج
طابعة الملصقات Brother P-Touch 770. هل ستعمل مع Haiku؟

يعرف مدير حزم Haiku المكتبات والأوامر، لذلك إذا تلقيت رسالة "لا يمكن العثور على libintl" عند التشغيل configure - أنا فقط إطلاق pkgman install devel:libintl وسيتم العثور على الحزمة المطلوبة. على نفس المنوال pkgman install cmd:rsync. حسنًا ، إلخ.

إلا عندما لا يعمل هذا:

/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

ربما يعتمد udev على نظام Linux بشكل كبير وبالتالي فهو غير موجود لـ Haiku. مما يعني أنني بحاجة إلى تعديل كود المصدر الذي أحاول تجميعه.
إيه، لا يمكنك القفز فوق رأسك، ولا أعرف حتى من أين أبدأ.

المحاولة الثالثة

سيكون من الجميل أن يكون tmate بالنسبة لـ Haiku، سأسمح لمطوري Haiku بالاتصال بجلستي الطرفية - في حالة حدوث خطأ ما. التعليمات بسيطة للغاية:

./autogen.sh
./configure
make
make install

تبدو جيدة، فلماذا لا تجربها على هايكو؟

/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

في هذه الخطوة أفتح HaikuDepot وأبحث curses.
تم العثور على شيء ما، مما أعطاني تلميحًا لاستعلام أكثر كفاءة:

/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

ذهبت مرة أخرى إلى HaikuDepot، وبالطبع وجدتها devel:msgpack_c_cpp_devel. ما هذه الأسماء الغريبة؟

/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

في هذه الخطوة، أدركت أن نقل برنامج إلى Haiku يتطلب معرفة أكثر بكثير مما هو مطلوب لإعادة بناء بسيطة.
لقد تحدثت مع مطوري Haiku الودودين، واتضح أن هناك خطأ في msgpack، وبعد بضع دقائق رأيت تصحيحًا في HaikuPorts. أستطيع أن أرى بأم عيني كيف تم تصحيح الحزمة الذهاب هنا (Buildslave - الأجهزة الافتراضية).

يومي الخامس مع هايكو: لننقل بعض البرامج
بناء msgpack المصحح على buildmaster

بين الأوقات أقوم بإرسال التصحيح إلى المنبع لإضافة دعم Haiku إلى msgpack.

وبعد خمس دقائق، أصبحت حزمة الرسائل المحدثة متاحة بالفعل في Haiku:

/Haiku/home/tmate> pkgman update
(...)
The following changes will be made:
  in system:
    upgrade package msgpack_c_cpp-3.1.1-1 to 3.2.0-2 from repository HaikuPorts
    upgrade package msgpack_c_cpp_devel-3.1.1-1 to 3.2.0-2 from repository HaikuPorts
Continue? [yes/no] (yes) : y
100% msgpack_c_cpp-3.2.0-2-x86_64.hpkg [13.43 KiB]
(...)
[system] Done.

جيد بشكل غير متوقع. هل قلت ذلك؟!

أعود إلى المشكلة الأصلية:

/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

الآن يبدو أن msgpack ليس على خطأ. أنا أعلق IMAXLABEL в tty.c على النحو التالي:

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

النتيجة:

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.

حسنًا، ها نحن ذا مرة أخرى... بالمناسبة:

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

السيد. com.waddlesplash يخبرك أين تحفر:

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

هنا نشرت config.log.

لقد أوضحوا لي أن هناك شيئًا آخر في libnetwork بالإضافة إلى libresolv على Haiku. يبدو أن الكود يحتاج إلى مزيد من التعديل. بحاجة الي التفكير…

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

السؤال الأبدي: ماذا يحدث؟

/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

نفس الشيء، فقط في الملف الشخصي. جوجلد و وجدت هذا. اذا اضفت -lssp "أحيانًا" يساعد، أحاول:

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

رائع! إنها تبدأ! لكن…

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

سأحاول التصحيح الملف هنا:

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

"معرف المنفذ السيئ" يشبه بالفعل بطاقة العمل هايكو. ربما شخص ما لديه فكرة ما هو الخطأ وكيفية اصلاحها؟ إذا كان الأمر كذلك، سأقوم بتحديث المقال. رابط ل GitHub جيثب:.

نقل تطبيق واجهة المستخدم الرسومية إلى Qt.

اخترت تطبيق QML بسيط.

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

حقا بسيطة. أقل من دقيقة!

تطبيقات التعبئة والتغليف في hpkg باستخدام haikuporter وhaikuports.

ما الذي يجب أن أبدأ به؟ لا يوجد توثيق بسيط، أذهب إلى قناة #haiku على irc.freenode.net وأسمع:

  • فريق package - طريقة منخفضة المستوى لإنشاء الحزم. بالنسبة للجزء الأكبر، فإن PackageInfo يكفي لها، كما هو موضح في القسم "تحويلها إلى حزمة .hpkg مناسبة"
  • أحتاج لفعل شئ هو
  • يمكن استخدامها hpkg-creator (إنه يتعطل بالنسبة لي، الإبلاغ عن الأخطاء)

ليس من الواضح ما يجب القيام به. أعتقد أنني بحاجة إلى دليل للمبتدئين بأسلوب Hello World، ومن الأفضل أن يكون مقطع فيديو. سيكون من الجيد أيضًا الحصول على مقدمة مناسبة لـ HaikuPorter، كما هو الحال في GNU hello.

أنا أقرأ ما يلي:

haikuporter هي أداة لإنشاء مشاريع حزمة مشتركة لهايكو. ويستخدم مستودع HaikuPorts كقاعدة لجميع الحزم. تُستخدم وصفات Haikuporter لإنشاء الطرود.

بالإضافة إلى ذلك، أكتشف أن:

ليست هناك حاجة لتخزين الوصفات في مخزن HaikuPorts. يمكنك إنشاء مستودع آخر، ووضع الوصفات فيه، ثم توجيه haikuporter إليه.

فقط ما أحتاجه - إذا لم أكن أبحث عن طريقة لإصدار الحزمة علنًا. لكن هذا موضوع لمقالة أخرى.

تركيب haikuporter وhaikuports

cd /boot/home/
git clone https://github.com/haikuports/haikuporter --depth=50
git clone https://github.com/haikuports/haikuports --depth=50
ln -s /boot/home/haikuporter/haikuporter /boot/home/config/non-packaged/bin/ # make it runnable from anywhere
cd haikuporter
cp haikuports-sample.conf /boot/home/config/settings/haikuports.conf
sed -i -e 's|/mydisk/haikuports|/boot/home/haikuports|g' /boot/home/config/settings/haikuports.conf

كتابة وصفة

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
}

تجميع الوصفة

قمت بحفظ الملف تحت إسم QtQuickApp-1.0.recipe، وبعد ذلك أبدأ aikuporter -S ./QuickApp-1.0.recipe. يتم فحص التبعيات لجميع الحزم الموجودة في المستودع haikuports، الأمر الذي يستغرق بعض الوقت. سأذهب للحصول على بعض القهوة.

لماذا بحق السماء يجب أن يتم هذا الفحص على جهازي المحلي، وليس مركزيًا على الخادم مرة واحدة للجميع؟

وفقا للسيد. واد سبلاش:

بحيث يمكنك إعادة كتابة أي ملف في المستودع 😉 يمكنك تحسين ذلك قليلاً، وحساب المعلومات الضرورية عند الحاجة، لأن التغييرات الأخيرة التي تم إجراؤها نادرة جدًا.

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

اتضح أنه لا يوجد شيء اسمه ملف وصفة عادي يحتوي على الكود المصدري لتطبيقك. تحتاج إلى الاحتفاظ به في مستودع بتنسيق HaikuPorts.

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

هذه الحقيقة تجعل التجميع أكثر تعقيدًا. أنا لا أحب ذلك بشكل خاص، ولكن أعتقد أنه ضروري حتى تظهر في النهاية جميع البرامج مفتوحة المصدر في HaikuPorts.

أحصل على ما يلي:

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

ما هو الخطأ؟ بعد قراءة irc أفعل:

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

لقد نشأ سؤال مثير للاهتمام. إذا أضفت مجموعًا اختباريًا إلى الوصفة - فهل سيتطابق مع أحدث التزام من git للتكامل المستمر؟ (يؤكد المطور: "لن ينجح الأمر. الوصفات مصممة لتكون مستقرة نسبيًا.")

للمتعة، أضف إلى الوصفة:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

لا تزال غير راضية:

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

ماذا يفعل؟ بعد كل شيء، هذا مستودع git، الكود موجود بالفعل مباشرة، لا يوجد شيء لتفريغه. من وجهة نظري، يجب أن تكون الأداة ذكية بما يكفي حتى لا تبحث عن أداة فك الحزم إذا كانت أعلى عنوان URL الخاص بـ GitHub.

ربما uri git:// ستعمل

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

الآن يشكو مثل هذا:

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

حسنًا، لماذا كل شيء معقد للغاية، لماذا لا يمكنك "العمل فقط"؟ بعد كل شيء، ليس من غير المألوف بناء شيء ما من GitHub. سواء كانت الأدوات التي تعمل على الفور، دون الحاجة إلى الإعداد، أو كما أسميها "الضجة".

ربما ستعمل مثل هذا:

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

لا. مازلت أتلقى هذا الخطأ الغريب وأفعله، كما هو موضح هنا

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

أنا أتقدم قليلاً، ولكن لماذا يصرخ في وجهي (GitHub غير آمن!) وما زال يحاول فك شيء ما.

وفق السيد. com.waddlesplash:

حسنا، نعم، كان السبب هو الرغبة في التحقق من سلامة البيانات الواردة للتجميع. أحد الخيارات هو التحقق من المجموع الاختباري للأرشيف، ولكن يمكنك بالطبع تجزئة الملفات الفردية، والتي لن يتم تنفيذها، لأن يستغرق وقتا أطول بكثير. والنتيجة هي "انعدام الأمن" لـ git و VCS الأخرى. من المرجح أن يكون هذا هو الحال دائمًا، نظرًا لأن إنشاء أرشيف على GitHub أمر سهل للغاية وغالبًا ما يكون أسرع. حسنًا، في المستقبل، ربما لن تكون رسالة الخطأ مبهرجة جدًا... (لم نعد ندمج مثل هذه الوصفات في HaikuPorts).

~/QtQuickApp> haikuporter -S QtQuickApp
Checking if any dependency-infos need to be updated ...
Looking for stale dependency-infos ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------Downloading: git+https://github.com/probonopd/QtQuickApp.git ...
Warning: UNSAFE SOURCES ARE BAD AND SHOULD NOT BE USED IN PRODUCTION
Warning: PLEASE MOVE TO A STATIC ARCHIVE DOWNLOAD WITH CHECKSUM ASAP!
Cloning into bare repository '/boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git'...
Unpacking source of QtQuickApp.git
tar: /boot/home/haikuports/app-misc/QtQuickApp/work-1.0/sources/QtQuickApp-1.0: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now
Command 'git archive HEAD | tar -x -C "/boot/home/haikuports/app-misc/QtQuickApp/work-1.0/sources/QtQuickApp-1.0"' returned non-zero exit status 2

من عادتي القديمة، أذهب لأسأل الأشخاص الطيبين على قناة #haiku على شبكة irc.freenode.net. وأين سأكون بدونهم؟ بعد التلميح، أدركت أنه يجب علي استخدام:

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

حسنًا، أصبح من الواضح ما يفعله - فهو يقوم بتنزيل أرشيف يحتوي على الكود المصدري لمراجعة معينة. إنه أمر غبي، من وجهة نظري، وليس بالضبط ما أردت، وهو تنزيل أحدث مراجعة من الفرع الرئيسي.

وأوضح أحد المطورين ذلك بهذه الطريقة:

لدينا CI الخاص بنا، لذا فإن كل ما يتم وضعه في مستودع haikuports سيتم تجميعه لجميع المستخدمين، ولا نريد المخاطرة بجمع وتسليم "كل شيء في الإصدار الأحدث من المنبع".

مفهوم! وعلى كل حال فهذا ما حدث:

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

ويكرر هذا الإعلان إلى ما لا نهاية. يبدو أن هذا خطأ (هل يوجد تطبيق؟ لم أتمكن من العثور عليه).

С haikuporter والمستودع haikuports ليس لديها طابع "العمل فقط"، ولكن كمطور، هناك بعض الأشياء التي أحبها في العمل مع Haiku. في أغلب الأحيان، يشبه خدمة Open Build Service، وهي مجموعة من الأدوات لبناء إصدارات Linux: قوية للغاية، مع أسلوب منهجي، ولكنها مبالغة في تطبيقي الصغير "hello World".

مرة أخرى، وفقا للسيد. واد سبلاش:

في الواقع، HaikuPorter صارم تمامًا افتراضيًا (بالإضافة إلى وجود وضع lint بالإضافة إلى وضع صارم لجعله أكثر صرامة!)، ولكن فقط لأنه ينشئ حزمًا ستعمل، وليس مجرد إنشاء حزم. ولهذا السبب يشتكي من التبعيات غير المعلنة، وعدم استيراد المكتبات بشكل صحيح، والإصدارات غير الصحيحة، وما إلى ذلك. الهدف هو اكتشاف أي وجميع المشاكل، بما في ذلك المشاكل المستقبلية، قبل أن يعرف المستخدم عنها (ولهذا السبب لم يكن من الممكن تثبيت avrdude، لأن التبعية تم تحديدها بالفعل في الوصفة). المكتبات ليست مجرد حزم فردية أو حتى إصدارات SO محددة. يضمن HaikuPorter ملاحظة كل ذلك في الوصفات نفسها لتجنب الأخطاء أثناء التنفيذ.

من حيث المبدأ، هذا المستوى من الصرامة له ما يبرره عند إنشاء نظام تشغيل، لكنه يبدو غير ضروري بالنسبة لي لتطبيق "hello World". قررت تجربة شيء آخر.

إنشاء التطبيقات بتنسيق hpkg باستخدام أمر "package create".

ربما هذا هل التعليمات البسيطة ستعمل بشكل أفضل بالنسبة لي؟

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

سريع بشكل غير متوقع، بسيط بشكل غير متوقع، فعال بشكل غير متوقع. بالضبط كيف أحب ذلك، مذهل!

التثبيت - ماذا وأين؟

تم نقل الملف QtQuickApp.hpkg إلى ~/config/packagesباستخدام مدير الملفات، وبعد ذلك ظهر QtQuickApp بطريقة سحرية ~/config/apps.
مرة أخرى، سريع وبسيط وفعال بشكل غير متوقع. مدهش غير معقول!

ولكن... (أين سنكون بدونهم!)

لا يزال التطبيق مفقودًا من قائمة التطبيقات وQuickLaunch. أعتقد أنني أعرف بالفعل كيفية إصلاحه. في مدير الملفات أقوم بنقل QtQuickApp.hpkg من ~/config/packages إلى /system/packages.

لا، لا يزال مفقودا. على ما يبدو، أنا (حسنا، والتعليمات) فاتني شيئا.

بعد أن نظرت إلى علامة التبويب "المحتويات" في HaikuDepot لبعض التطبيقات الأخرى، رأيت أن هناك ملفات مثل /data/mimedb/application/x-vnd... ما هو أكثر من رائع هو /data/deskbar/menu/Applications/….

حسنًا، ماذا يجب أن أضع هناك؟ تعال...

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

أنا متأكد تمامًا من أن هذه الخدعة ستنجح، لكن الأسئلة تظل قائمة: لماذا هذا ضروري، وما الغرض منه؟ أعتقد أن هذا يفسد الانطباع العام بأن النظام متطور للغاية.

كما أوضح السيد . واد سبلاش:

في بعض الأحيان توجد تطبيقات تحتاجها تطبيقات أخرى ولكنها غير موجودة في القائمة. على سبيل المثال، LegacyPackageInstaller في لقطة الشاشة الخاصة بك، يعالج أرشيفات .pkg بتنسيق BeOS. أود أن يقوم المستخدمون بتثبيتها، لكن وجودها في القائمة سيؤدي إلى الارتباك.

لسبب ما يبدو لي أن هناك حل أبسط، على سبيل المثال Hidden=true في الملفات .desktop على لينكس. لماذا لا تجعل المعلومات "المخفية" موردًا وسمة لنظام الملفات؟

الأمر غير الدقيق بشكل خاص هو اسم (بعض) التطبيقات التي تعرض القائمة، deskbar، مربوطة بشكل صارم على طول الطريق.

السيد. يشرح Waddlesplash هذا:

ينبغي فهم "شريط المكتب" في هذه الحالة على أنه نوع من المصطلح العام (بنفس الطريقة مثل "شريط المهام"، الذي يشير إلى كل من تطبيق Windows والمفهوم العام). حسنا، منذ هذا deskbar، وليس "Deskbar"، ويمكن أيضًا فهم ذلك بطريقة مماثلة.

يومي الخامس مع هايكو: لننقل بعض البرامج
2 دليلين "متطابقين تقريبًا" مع التطبيقات الموجودة بهما

لماذا يوجد دليلان يحتويان على التطبيقات، وأيضًا لماذا يوجد QtQuickApplication الخاص بي في أحدهما وليس في الآخر؟ (بعد كل شيء، هذا ليس نظاما واحدا، ولكن المستخدم الثاني، والذي سيكون مفهوما بالنسبة لي شخصيا).
أنا في حيرة من أمري وأعتقد أن هذا يجب أن يكون موحدًا.

تعليق بواسطة السيد. com.waddlesplash

يحتوي كتالوج التطبيقات على تطبيقات غير مطلوبة في القائمة. لكن الوضع مع القائمة يحتاج حقًا إلى تحسين، لجعله أكثر قابلية للتخصيص.

التطبيق وإلا لن يحدث 😉

تساءلت: هل من الضروري حقًا استضافة التطبيقات فيها /system/apps، إذا رآهم المستخدمون هناك، فهذا غير مرغوب فيه. ربما يكون من الأفضل وضعها في مكان آخر حيث لن يصادفها المستخدم؟ تمامًا كما يحدث في نظام التشغيل Mac OS X، حيث يتم تخزين محتويات الحزم .app، والتي لا ينبغي أن تكون مرئية للمستخدم في /Applications، يختبئ في أعماق /System/Library/..."`.

ماذا عن التبعيات؟

أعتقد أن الأمر يستحق تحديد التبعيات بطريقة أو بأخرى، أليس كذلك؟ هل يمكن اعتبار Qt جزءًا إلزاميًا من تثبيت Haiku افتراضيًا؟ لا! لم يتم تثبيت كيو تي بشكل افتراضي. هل يمكن لمنشئ الحزم اكتشاف التبعيات تلقائيًا عن طريق فحص ملفات ELF؟ قيل لي أن HaikuPorter يفعل هذا بالفعل، ولكن package لا. ذلك لأنه مجرد "أداة إنشاء الحزم" التي تقوم فقط بإنشاء الملفات من تلقاء نفسها hpkg.

هل ينبغي جعل هايكو أكثر تعقيدًا من خلال إضافة سياسة مفادها أن الحزمة لا ينبغي أن تعتمد على حزم خارج هايكو؟ haikuports؟ (أود ذلك لأن مثل هذه السياسة من شأنها أن تجعل الأمور أسهل كثيرًا، حيث سيكون النظام قادرًا على حل التبعيات تلقائيًا لكل حزمة يتم تنزيلها من أي مكان، دون العبث بمصادر الحزم الإضافية.)

السيد. يوضح Waddlesplash:

لا نرغب في تقييد حرية المطورين كثيرًا، لأنه من الواضح أنه إذا أرادت شركة CompanyX دعم مجموعتها الخاصة من البرامج بالتبعيات (وبالتالي المستودع)، فإنها ستفعل ذلك بحرية كاملة.

في هذه الحالة، قد يكون من المفيد التوصية بأن تتجنب حزم الطرف الثالث الاعتماد على أي شيء غير مدرج في منافذ haikuports من خلال تعبئة كل ما هو مطلوب مع التطبيق بشكل كامل. لكن أعتقد أن هذا موضوع لمقالة مستقبلية في هذه السلسلة. [هل يتجه المؤلف نحو AppImage؟ - تقريبا. مترجم]

إضافة أيقونة التطبيق

ماذا لو كنت أرغب في إضافة أحد الرموز المضمنة الأنيقة إلى موارد التطبيق الذي تم إنشاؤه حديثًا؟ وتبين أن هذا موضوع رائع، لذلك سيكون الأساس للمقالة القادمة.

كيفية تنظيم بنيات التطبيق المستمر؟

تخيل مشروعًا مثل Inkscape (نعم، أعلم أنه غير متوفر بعد في Haiku، لكنه مناسب للعرض عليه). لديهم مستودع التعليمات البرمجية المصدر https://gitlab.com/inkscape/inkscape.
في كل مرة يُجري فيها شخص ما تغييراته على المستودع، يتم إطلاق مسارات البناء، وبعد ذلك يتم اختبار التغييرات تلقائيًا، وإنشاؤها، وتجميع التطبيق في حزم مختلفة، بما في ذلك AppImage لنظام التشغيل Linux (حزمة تطبيق مستقلة يمكن تنزيلها للاختبار المحلي بغض النظر عن ذلك). ما قد يتم تثبيته أو لا يتم تثبيته على النظام [كنت أعرف! - تقريبا. مترجم]). يحدث نفس الشيء مع كل طلب دمج فرع، بحيث يمكنك تنزيل التطبيق المبني من الكود المقترح في طلب الدمج قبل الدمج.

يومي الخامس مع هايكو: لننقل بعض البرامج
دمج الطلبات مع حالات البناء والقدرة على تنزيل الثنائيات المجمعة في حالة نجاح البناء (باللون الأخضر)

يتم تشغيل البناء في حاويات Docker. يقدم GitLab برامج تشغيل مجانية على Linux، وأعتقد أنه قد يكون من الممكن تضمين برامج التشغيل الخاصة بك (بالمناسبة، لا أرى كيف يمكن أن يعمل هذا مع أنظمة مثل Haiku، والتي أعلم أنها لا تحتوي على Docker أو ما يعادلها، ولكن أيضًا بالنسبة لـ FreeBSD لا يوجد Docker، لذا فإن هذه المشكلة ليست فريدة بالنسبة إلى Haiku).

من الناحية المثالية، يمكن إنشاء تطبيقات Haiku داخل حاوية Docker لنظام التشغيل Linux. في هذه الحالة، يمكن إدخال التجميع الخاص بـ Haiku في خطوط الأنابيب الموجودة. هل هناك مترجمين متقاطعين؟ أو هل يجب علي محاكاة Haiku بالكامل داخل حاوية Docker باستخدام شيء مثل QEMU/KVM (على افتراض أنه سيعمل بهذه الطريقة داخل Docker)؟ بالمناسبة، العديد من المشاريع تستخدم مبادئ مماثلة. على سبيل المثال، يقوم Scribus بذلك - وهو متاح بالفعل لـ Haiku. في يوم من الأيام سيأتي اليوم الذي أستطيع فيه الإرسال مثل سحب الطلبات إلى مشاريع أخرى لإضافة دعم Haiku.

يوضح أحد المطورين:

بالنسبة للمشاريع الأخرى التي ترغب في إنشاء الحزم بنفسها، يتم دعم طريقة CMake/CPack العادية. يمكن دعم أنظمة البناء الأخرى عن طريق استدعاء برنامج بناء الحزمة مباشرة، وهو أمر جيد إذا كان الأشخاص مهتمين به. تظهر التجربة: حتى الآن لم يكن هناك الكثير من الاهتمام، لذلك كان Haikuporter مناسبًا لنا، ولكن في النهاية، يجب أن تعمل كلتا الطريقتين معًا. يجب أن نقدم مجموعة من الأدوات لبرامج البناء المتقاطع من Linux أو أي نظام تشغيل خادم آخر (Haiku غير مصمم للتشغيل على الخوادم).

أعطي ترحيبا حارا. يحمل مستخدمو Linux العاديون كل هذا العبء الإضافي والأمتعة الإضافية (الأمان والرقابة الصارمة وما إلى ذلك) الضرورية لنظام تشغيل الخادم، ولكن ليس لنظام تشغيل شخصي. لذا فأنا أوافق تمامًا على أن القدرة على إنشاء تطبيقات Haiku على Linux هي الحل الأمثل.

اختتام

من الممكن نقل تطبيقات POSIX إلى Haiku، ولكنه قد يكون أكثر تكلفة من إعادة البناء النموذجية. من المؤكد أنني سأظل عالقًا في هذا الأمر لفترة طويلة لولا مساعدة الأشخاص من قناة #haiku على شبكة irc.freenode.net. لكن حتى أنهم لم يروا دائمًا ما هو الخطأ على الفور.

تعتبر التطبيقات المكتوبة بلغة Qt استثناءً سهلاً. لقد قمت بتجميع تطبيق تجريبي بسيط دون أي مشاكل.

يعد إنشاء حزمة للتطبيقات البسيطة أيضًا أمرًا سهلاً للغاية، ولكن فقط للتطبيقات "الصادرة تقليديًا"، أي. وجود أرشيفات كود المصدر مُصممة خصيصًا للدعم في منافذ Haikuports. بالنسبة للبناء المستمر (الإنشاء لكل التزام بالتغييرات) باستخدام GitHub، يبدو أن كل شيء ليس بهذه البساطة. يبدو هنا Haiku أشبه بتوزيع Linux منه بالنتيجة على جهاز Mac، حيث عند النقر فوق الزر "Build" في XCode تحصل على حزمة .app، جاهز لإدراجه في صورة القرص .dmg، جاهز للتحميل على موقع الويب الخاص بي.
من المرجح أن يصبح البناء المستمر للتطبيقات المستندة إلى نظام التشغيل "الخادم"، على سبيل المثال، Linux، ممكنًا إذا كان هناك طلب من المطورين، ولكن في الوقت الحالي لدى مشروع Haiku مهام أخرى أكثر إلحاحًا.

جربها بنفسك! بعد كل شيء، يوفر مشروع Haiku صورًا للتمهيد من قرص DVD أو USB تم إنشاؤها يوميا. للتثبيت ، ما عليك سوى تنزيل الصورة وحرقها على محرك أقراص فلاش USB باستخدام مطبوع

هل لديك اسئلة؟ نحن ندعوك إلى الناطقين بالروسية قناة برقية.

نظرة عامة على الخطأ: كيف تطلق النار على قدمك في C و C++. مجموعة وصفات Haiku OS

من автора الترجمة: هذا هو المقال الخامس في سلسلة عن هايكو.

قائمة المقالات: الأول الثاني ثالث رابع

المصدر: www.habr.com

إضافة تعليق