Ngày thứ năm của tôi với Haiku: hãy chuyển một số chương trình

Ngày thứ năm của tôi với Haiku: hãy chuyển một số chương trình

TL; DR: Một người mới nhìn thấy Haiku lần đầu tiên, đang cố gắng chuyển một số chương trình từ thế giới Linux.

Ngày thứ năm của tôi với Haiku: hãy chuyển một số chương trình
Chương trình chuyển Haiku đầu tiên của tôi, được đóng gói ở định dạng hpkg

Gần đây Tôi phát hiện ra Haiku, một hệ điều hành tốt đến mức đáng ngạc nhiên dành cho PC.
Hôm nay tôi sẽ học cách chuyển các chương trình mới sang hệ điều hành này. Trọng tâm chính là mô tả trải nghiệm đầu tiên khi chuyển sang Haiku theo quan điểm của một nhà phát triển Linux. Tôi xin lỗi vì bất kỳ sai sót ngu ngốc nào mà tôi đã mắc phải trong quá trình thực hiện, vì chưa đầy một tuần kể từ lần đầu tiên tôi tải Haiku xuống.

Tôi muốn đạt được ba mục tiêu:

  • Chuyển một ứng dụng CLI đơn giản
  • Chuyển ứng dụng từ GUI sang Qt
  • Sau đó đóng gói chúng ở định dạng hpkg (vì tôi vẫn đang nghĩ đến việc điều chỉnh AppDir và AppImage cho Haiku ...)

Bắt đầu nào. Trong phần документация и phát triển, cũng như trong wiki từ HaikuPorts tôi đã tìm được hướng đi đúng đắn. Thậm chí còn có một cuốn sách PDF trực tuyến BeOS: Chuyển ứng dụng Unix.
467 trang - và đây là từ năm 1997! Thật đáng sợ khi nhìn vào bên trong, nhưng tôi hy vọng điều tốt nhất. Lời của nhà phát triển thật đáng khích lệ: “phải mất một thời gian dài vì BeOS không tuân thủ POSIX,” nhưng Haiku “phần lớn” đã như vậy rồi.

Chuyển một ứng dụng CLI đơn giản

Ý nghĩ đầu tiên là chuyển ứng dụng ái kỷ, nhưng hóa ra, đây đã là làm xong cách đây đã lâu.

Lần thử đầu tiên: không có gì để xem

Điều tôi không thể hiểu được đó là Ứng dụng đã được chuyển sang Haiku trong hơn 10 năm - mặc dù thực tế là bản thân hệ điều hành này thậm chí còn chưa có phiên bản 1.0.

Lần thử thứ hai: cần viết lại

Vì vậy tôi sẽ sử dụng ptouch-770, CLI để điều khiển máy in Brother P-Touch 770 mà tôi sử dụng để in nhãn.
Tôi in nhiều nhãn khác nhau lên đó và có thể bạn đã thấy nó trong bài viết trước. Trước đó một chút, tôi đã viết một chương trình bao bọc GUI nhỏ bằng Python (vì nó ở dạng Gtk+ nên nó sẽ phải được viết lại và đây là lý do chính đáng để tìm hiểu).

Ngày thứ năm của tôi với Haiku: hãy chuyển một số chương trình
Máy in nhãn Brother P-Touch 770. Nó có hoạt động với Haiku không?

Trình quản lý gói Haiku biết về các thư viện và lệnh, vì vậy nếu tôi nhận được thông báo "không thể tìm thấy libintl" khi chạy configure - Tôi vừa phóng pkgman install devel:libintl và gói yêu cầu sẽ được tìm thấy. Tương tự như vậy pkgman install cmd:rsync. Vâng, v.v.

Ngoại trừ khi điều này không hoạt động:

/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

Có lẽ udev quá dựa trên Linux và do đó không tồn tại đối với Haiku. Điều đó có nghĩa là tôi cần chỉnh sửa mã nguồn mà tôi đang cố gắng biên dịch.
Ơ, bạn không thể nhảy qua đầu được, và tôi thậm chí còn không biết bắt đầu từ đâu.

Lần thử thứ ba

Sẽ thật tuyệt nếu có tmate đối với Haiku, thì tôi sẽ cho phép các nhà phát triển Haiku kết nối với phiên cuối của tôi - trong trường hợp có sự cố xảy ra. Các hướng dẫn khá đơn giản:

./autogen.sh
./configure
make
make install

Có vẻ hay đấy, vậy tại sao bạn không thử trên Haiku?

/Haiku/home> git clone https://github.com/tmate-io/tmate/Haiku/home> cd tmate//Haiku/home/tmate> ./autogen.sh
(...)/Haiku/home/tmate> ./configure
(...)
checking for libevent... no
checking for library containing event_init... no
configure: error: "libevent not found"/Haiku/home/tmate> pkgman install devel:libevent
(...)
The following changes will be made:
  in system:
    install package libevent21-2.1.8-2 from repository HaikuPorts
    install package libevent21_devel-2.1.8-2 from repository HaikuPorts
Continue? [yes/no] (yes) :
100% libevent21-2.1.8-2-x86_64.hpkg [965.22 KiB]
(...)
[system] Done.checking for ncurses... no
checking for library containing setupterm... no
configure: error: "curses not found"/Haiku/home/tmate> pkgman install devel:libcurses
(...)
*** Failed to find a match for "devel:libcurses": Name not found/Haiku/home/tmate> pkgman install devel:curses
(...)
*** Failed to find a match for "devel:curses": Name not found

Ở bước này tôi mở HaikuDepot và tìm kiếm curses.
Đã tìm thấy điều gì đó đã cho tôi gợi ý về một truy vấn phù hợp hơn:

/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

Một lần nữa tôi lại vào HaikuDepot và tất nhiên tìm thấy devel:msgpack_c_cpp_devel. Những cái tên kỳ lạ này là gì?

/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

Ở bước này, tôi nhận ra rằng việc chuyển một chương trình sang Haiku đòi hỏi nhiều kiến ​​thức hơn mức cần thiết cho việc xây dựng lại đơn giản.
Tôi đã nói chuyện với các nhà phát triển Haiku thân thiện, hóa ra có một lỗi trong msgpack và sau vài phút tôi thấy có bản vá trong HaikuPorts. Tôi có thể tận mắt chứng kiến ​​gói hàng được sửa chữa như thế nào đi đây (buildslave - máy ảo).

Ngày thứ năm của tôi với Haiku: hãy chuyển một số chương trình
Xây dựng gói thông báo đã sửa trên buildmaster

Giữa các lần tôi gửi một bản vá lên thượng nguồn để thêm hỗ trợ Haiku vào msgpack.

Năm phút sau, gói tin cập nhật đã có sẵn trên 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.

Không ngờ lại tốt. Tôi đã nói thế à?!

Tôi quay lại vấn đề ban đầu:

/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

Bây giờ có vẻ như msgpack không có lỗi. tôi đang bình luận IMAXLABEL в tty.c như sau:

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

Kết quả:

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.

Chà, chúng ta lại bắt đầu... Nhân tiện:

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

Ông. lạch bạch cho bạn biết nơi để đào:

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

Ở đây tôi đã đăng config.log.

Họ giải thích với tôi rằng có một thứ khác trong libnetwork ngoài libresolv trên Haiku. Rõ ràng mã cần phải được chỉnh sửa thêm. Cần phải suy nghĩ…

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

Câu hỏi muôn thuở: chuyện gì đang xảy ra?

/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

Điều tương tự, chỉ trong hồ sơ. Đã tìm trên Google và tìm thấy cái này. Nếu bạn thêm -lssp “đôi khi” có ích, tôi thử:

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

Ồ! Nó bắt đầu! Nhưng…

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

Tôi sẽ cố gắng gỡ lỗi tập tin ở đây:

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

“ID cổng xấu” đã giống như một tấm danh thiếp haiku. Có lẽ ai đó có ý tưởng gì sai và cách khắc phục? Nếu vậy, tôi sẽ cập nhật bài viết. Liên kết tới GitHub.

Chuyển ứng dụng GUI sang Qt.

Tôi chọn một ứng dụng QML đơn giản.

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

Thực sự đơn giản. Ít hơn một phút!

Ứng dụng đóng gói trong hpkg sử dụng haikuporter và haikuports.

Tôi nên bắt đầu với cái gì? Không có tài liệu đơn giản nào cả, tôi vào kênh #haiku trên irc.freenode.net và nghe:

  • Đội package - một cách cấp thấp để tạo các gói. Đối với hầu hết các phần, PackageInfo là đủ đối với cô ấy, như được mô tả trong phần "Biến nó thành một gói .hpkg thích hợp"
  • tôi cần làm vài thứ một
  • Можно РёСЃРїРѕР »СЊР · РѕРІР ° С, Њ người tạo hpkg (đối với tôi nó gặp sự cố, báo cáo lỗi)

Không rõ phải làm gì. Tôi đoán tôi cần một hướng dẫn dành cho người mới bắt đầu theo phong cách Hello World, lý tưởng nhất là một video. Sẽ thật tuyệt nếu có phần giới thiệu thuận tiện về HaikuPorter, như được thực hiện trong GNU hello.

Tôi đang đọc phần sau:

haikuporter là một công cụ để tạo các dự án trọn gói chung cho Haiku. Nó sử dụng kho lưu trữ HaikuPorts làm cơ sở cho tất cả các gói. Công thức nấu ăn Haikuporter được sử dụng để tạo gói.

Ngoài ra, tôi phát hiện ra rằng:

Không cần lưu trữ công thức nấu ăn trong kho HaikuPorts. Bạn có thể tạo một kho lưu trữ khác, đặt các công thức nấu ăn vào đó và sau đó trỏ haikuporter vào đó.

Đúng thứ tôi cần - nếu không tìm cách phát hành gói một cách công khai. Nhưng đây là một chủ đề cho một bài viết khác.

Cài đặt haikuporter và 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

Viết một công thức

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
}

Lắp ráp công thức

Tôi lưu tập tin dưới tên QtQuickApp-1.0.recipe, sau đó tôi khởi động aikuporter -S ./QuickApp-1.0.recipe. Các phần phụ thuộc được kiểm tra cho tất cả các gói trong kho lưu trữ haikuports, việc này phải mất một thời gian. Tôi sẽ đi lấy chút cà phê.

Tại sao việc kiểm tra này phải được thực hiện trên máy cục bộ của tôi chứ không phải trên máy chủ tập trung một lần cho tất cả mọi người?

Theo ông. waddlesplash:

Với cách này, bạn có thể viết lại bất kỳ tệp nào trong kho lưu trữ 😉 Bạn có thể tối ưu hóa điều này một chút, tính toán các thông tin cần thiết khi cần, vì những thay đổi cuối cùng được thực hiện là khá hiếm.

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

Hóa ra không có tệp công thức nấu ăn thông thường nào chứa mã nguồn ứng dụng của bạn. Bạn cần giữ nó trong kho lưu trữ ở định dạng HaikuPorts.

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

Thực tế này làm cho việc lắp ráp trở nên cồng kềnh hơn. Tôi không đặc biệt thích nó, nhưng tôi nghĩ nó cần thiết để cuối cùng tất cả phần mềm nguồn mở sẽ xuất hiện trong HaikuPorts.

Tôi nhận được như sau:

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

Chuyện gì vậy? Sau khi đọc irc tôi là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
----------------------------------------------------------------------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!

Một câu hỏi thú vị đã nảy sinh. Nếu tôi thêm tổng kiểm tra vào công thức - nó có khớp với cam kết git mới nhất để tích hợp liên tục không? (Nhà phát triển xác nhận: "Nó sẽ không hoạt động. Các công thức nấu ăn được thiết kế tương đối ổn định.")

Để giải trí, hãy thêm vào công thức:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Vẫn chưa hài lòng:

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

Anh ta đang làm gì vậy? Suy cho cùng thì đây là kho git, mã đã có sẵn ở đó rồi, không có gì để giải nén cả. Theo quan điểm của tôi, công cụ này phải đủ thông minh để không tìm kiếm trình giải nén nếu nó nằm trên url GitHub.

Có lẽ uri git:// sẽ hoạt động

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

Bây giờ nó phàn nàn như thế này:

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

Hừm, sao mọi chuyện lại phức tạp thế, sao bạn không thể “làm việc” được? Suy cho cùng, việc xây dựng thứ gì đó từ GitHub không phải là điều hiếm gặp. Cho dù đó là công cụ hoạt động ngay lập tức mà không cần thiết lập hay như tôi gọi là "rắc rối".

Có lẽ nó sẽ hoạt động như thế này:

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

Không. Tôi vẫn gặp lỗi kỳ lạ này và làm, như được mô tả ở đây

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

Tôi đang tiến xa hơn một chút, nhưng tại sao nó lại hét vào mặt tôi (GitHub không an toàn!) Và vẫn cố gắng giải nén thứ gì đó.

Theo Ông. lạch bạch:

Vâng, lý do là vì mong muốn kiểm tra tính toàn vẹn của dữ liệu nhận được để lắp ráp. Một trong các tùy chọn là xác minh tổng kiểm tra của kho lưu trữ, nhưng tất nhiên, bạn có thể băm các tệp riêng lẻ, việc này sẽ không được triển khai, bởi vì phải mất nhiều thời gian hơn. Hậu quả của việc này là sự “bất an” của git và các VCS khác. Điều này rất có thể sẽ luôn xảy ra vì việc tạo một kho lưu trữ trên GitHub khá dễ dàng và thường nhanh hơn. Chà, trong tương lai, có lẽ thông báo lỗi sẽ không còn quá hào nhoáng nữa... (chúng tôi không còn hợp nhất những công thức như vậy trong HaikuPorts nữa).

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

Thói quen cũ, tôi đi hỏi những người tốt trên kênh #haiku trên mạng irc.freenode.net. Và tôi sẽ ở đâu nếu không có họ? Sau gợi ý, tôi nhận ra rằng mình nên sử dụng:

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

Được rồi, mọi chuyện đã rõ ràng - nó tải xuống một kho lưu trữ có mã nguồn của một bản sửa đổi nhất định. Theo quan điểm của tôi, thật là ngu ngốc và không chính xác như những gì tôi muốn, cụ thể là tải xuống bản sửa đổi mới nhất từ ​​nhánh chính.

Một trong những nhà phát triển đã giải thích nó theo cách này:

Chúng tôi có CI riêng, vì vậy mọi thứ được đặt trong kho lưu trữ haikuports sẽ được đóng gói cho tất cả người dùng và chúng tôi không muốn mạo hiểm thu thập và phân phối “mọi thứ trong phiên bản mới nhất ngược dòng”.

Hiểu! Trong mọi trường hợp, đây là những gì đã xảy ra:

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

Nó lặp đi lặp lại điều này đến vô cùng. Hình như đây là lỗi (có ứng dụng nào không? Tôi không tìm thấy).

С haikuporter và kho lưu trữ haikuports Nó không mang lại cảm giác "chỉ hoạt động", nhưng với tư cách là một nhà phát triển, có một số điều tôi thích khi làm việc với Haiku. Về phần lớn, nó tương tự như Open Build Service, một bộ công cụ để xây dựng các bản dựng Linux: cực kỳ mạnh mẽ, với cách tiếp cận có hệ thống, nhưng lại quá mức cần thiết đối với ứng dụng "hello world" nhỏ bé của tôi.

Một lần nữa, theo ông. waddlesplash:

Thật vậy, HaikuPorter khá nghiêm ngặt theo mặc định (ngoài ra còn có chế độ lint cũng như chế độ nghiêm ngặt để làm cho nó thậm chí còn nghiêm ngặt hơn!), nhưng chỉ vì nó tạo ra các gói sẽ hoạt động, thay vì chỉ tạo các gói. Đó là lý do tại sao anh ta phàn nàn về các phần phụ thuộc không được khai báo, các thư viện không được nhập đúng cách, các phiên bản không chính xác, v.v. Mục đích là để nắm bắt mọi vấn đề, kể cả những vấn đề trong tương lai, trước khi người dùng biết về nó (đây là lý do tại sao không thể cài đặt avrdude, vì sự phụ thuộc thực sự đã được chỉ định trong công thức). Thư viện không chỉ là các gói riêng lẻ hay thậm chí là các phiên bản SO cụ thể. HaikuPorter đảm bảo rằng tất cả những điều này đều được tuân thủ trong chính các công thức nấu ăn để tránh sai sót trong quá trình thực hiện.

Về nguyên tắc, mức độ nghiêm ngặt này là hợp lý khi tạo ra một hệ điều hành, nhưng đối với tôi, nó có vẻ không cần thiết đối với ứng dụng “hello world”. Tôi quyết định thử cái gì khác.

Xây dựng ứng dụng ở định dạng hpkg bằng lệnh “tạo gói”

Có lẽ, cái này Những hướng dẫn đơn giản có hiệu quả hơn với tôi không?

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

Nhanh không ngờ, đơn giản không ngờ, hiệu quả không ngờ. Đúng kiểu tôi thích, tuyệt vời!

Cài đặt - cái gì và ở đâu?

Đã chuyển tệp QtQuickApp.hpkg sang ~/config/packagesbằng trình quản lý tệp, sau đó QtQuickApp xuất hiện một cách kỳ diệu trong ~/config/apps.
Một lần nữa, nhanh chóng, đơn giản và hiệu quả không ngờ. Tuyệt vời, không thể tin được!

Nhưng... (chúng ta sẽ ở đâu nếu không có họ!)

Ứng dụng này vẫn bị thiếu trong danh sách menu ứng dụng và QuickLaunch. Tôi nghĩ tôi đã biết cách khắc phục nó rồi. Trong trình quản lý tệp, tôi di chuyển QtQuickApp.hpkg từ ~/config/packages sang /system/packages.

Không, vẫn còn thiếu. Rõ ràng, tôi (và cả hướng dẫn) đã bỏ lỡ điều gì đó.

Sau khi xem tab "Nội dung" trong HaikuDepot để tìm một số ứng dụng khác, tôi thấy rằng có những tệp như /data/mimedb/application/x-vnd... điều đáng chú ý hơn nữa là /data/deskbar/menu/Applications/….

Chà, tôi nên đặt gì ở đó? Cố lên...

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

Tôi khá chắc chắn rằng thủ thuật này sẽ hiệu quả, nhưng vẫn còn những câu hỏi: tại sao điều này lại cần thiết, nó dùng để làm gì? Tôi nghĩ điều này làm hỏng ấn tượng chung rằng hệ thống này rất phức tạp.

Theo giải thích của Mr. waddlesplash:

Đôi khi có những ứng dụng mà ứng dụng khác cần nhưng lại không có trong menu. Ví dụ: LegacyPackageInstaller trong ảnh chụp màn hình của bạn, xử lý các kho lưu trữ .pkg ở định dạng BeOS. Tôi muốn người dùng cài đặt chúng, nhưng sự hiện diện của chúng trong menu sẽ dẫn đến nhầm lẫn.

Vì lý do nào đó, tôi thấy có một giải pháp đơn giản hơn, chẳng hạn Hidden=true trong tập tin .desktop trên Linux. Tại sao không biến thông tin "ẩn" thành tài nguyên và thuộc tính của hệ thống tệp?

Điều đặc biệt không tinh tế là tên của (một số) ứng dụng hiển thị menu, deskbar, được buộc chặt trên đường đi.

Ông. waddlesplash giải thích điều này:

“Deskbar” trong trường hợp này nên được hiểu là một loại thuật ngữ chung (giống như “thanh tác vụ”, dùng để chỉ cả ứng dụng Windows và khái niệm chung). Vâng, vì điều này deskbarchứ không phải “Deskbar” cũng có thể hiểu theo cách tương tự.

Ngày thứ năm của tôi với Haiku: hãy chuyển một số chương trình
2 thư mục "gần như giống hệt" chứa các ứng dụng trong đó

Tại sao có 2 thư mục chứa các ứng dụng và tại sao QtQuickApplication của tôi lại ở một thư mục mà không phải ở thư mục kia? (Xét cho cùng, đây không phải là một hệ thống một, mà là một hệ thống thứ hai, điều này đối với cá nhân tôi có thể hiểu được).
Tôi thực sự bối rối và tôi nghĩ điều này nên được thống nhất.

bình luận của ông. lạch bạch

Danh mục Ứng dụng chứa các ứng dụng không cần thiết trong menu. Nhưng tình trạng menu thực sự cần phải được cải thiện để làm cho nó có thể tùy chỉnh nhiều hơn.

Hãy ứng tuyển, nếu không nó sẽ không xảy ra 😉

Tôi tự hỏi: việc lưu trữ các ứng dụng trong /system/apps, nếu người dùng nhìn thấy chúng ở đó thì đó là điều không mong muốn. Có lẽ sẽ tốt hơn nếu đặt chúng ở một nơi khác mà người dùng sẽ không gặp phải chúng? Giống như được thực hiện trong Mac OS X, trong đó nội dung của các gói .app, mà người dùng sẽ không nhìn thấy trong /Applications, ẩn sâu trong /System/Library/…“`.

Còn sự phụ thuộc thì sao?

Tôi nghĩ cần phải chỉ định phần phụ thuộc nào đó, phải không? Theo mặc định, Qt có thể được coi là một phần bắt buộc trong quá trình cài đặt Haiku không? Không! Qt không được cài đặt theo mặc định. Trình xây dựng gói có thể tự động phát hiện các phần phụ thuộc bằng cách kiểm tra các tệp ELF không? Tôi được biết rằng HaikuPorter thực sự làm điều này, nhưng package KHÔNG. Đó là bởi vì nó chỉ là một "trình tạo gói" chỉ tự tạo các tệp hpkg.

Haiku có nên được làm phức tạp hơn bằng cách thêm chính sách rằng một gói không được phụ thuộc vào các gói bên ngoài Haiku không? haikuports? (Tôi muốn vậy, vì chính sách như vậy sẽ giúp mọi việc dễ dàng hơn nhiều - hệ thống sẽ có thể tự động giải quyết các phần phụ thuộc của mọi gói được tải xuống từ mọi nơi mà không phải loay hoay với các nguồn gói bổ sung.)

Ông. waddlesplash giải thích:

Chúng tôi không muốn hạn chế quá nhiều quyền tự do của các nhà phát triển, bởi vì rõ ràng là nếu CompanyX muốn hỗ trợ bộ phần mềm của riêng mình với các phần phụ thuộc (và do đó là kho lưu trữ), thì công ty sẽ làm điều đó hoàn toàn miễn phí.

Trong trường hợp đó, có thể nên khuyến nghị các gói của bên thứ ba tránh phụ thuộc vào bất kỳ thứ gì không có trong haikuports bằng cách đóng gói hoàn toàn mọi thứ cần thiết với ứng dụng. Nhưng tôi nghĩ đây là chủ đề cho một bài viết sau trong loạt bài này. [Có phải tác giả đang hướng tới AppImage? - khoảng. người dịch]

Thêm biểu tượng ứng dụng

Điều gì sẽ xảy ra nếu tôi muốn thêm một trong các biểu tượng tích hợp gọn gàng vào tài nguyên của ứng dụng mới tạo của mình? Hóa ra đây là một chủ đề thú vị nên nó sẽ là cơ sở cho bài viết tiếp theo.

Làm cách nào để tổ chức các bản dựng ứng dụng liên tục?

Hãy tưởng tượng một dự án như Inkscape (vâng, tôi biết rằng nó chưa có trên Haiku, nhưng rất thuận tiện để hiển thị trên đó). Họ có một kho lưu trữ mã nguồn https://gitlab.com/inkscape/inkscape.
Mỗi khi ai đó thực hiện các thay đổi của họ đối với kho lưu trữ, quy trình xây dựng sẽ được khởi chạy, sau đó các thay đổi sẽ được tự động kiểm tra, xây dựng và ứng dụng được đóng gói thành nhiều gói khác nhau, bao gồm AppImage cho Linux (gói ứng dụng độc lập có thể được tải xuống để thử nghiệm cục bộ bất kể những gì có thể hoặc không thể được cài đặt trên hệ thống [Tôi biết mà! - khoảng. người dịch]). Điều tương tự cũng xảy ra với mọi yêu cầu hợp nhất chi nhánh, vì vậy bạn có thể tải xuống ứng dụng được xây dựng từ mã được đề xuất trong yêu cầu hợp nhất trước khi hợp nhất.

Ngày thứ năm của tôi với Haiku: hãy chuyển một số chương trình
Hợp nhất các yêu cầu với trạng thái bản dựng và khả năng tải xuống các tệp nhị phân đã biên dịch nếu bản dựng thành công (được đánh dấu bằng màu xanh lục)

Bản dựng chạy trong vùng chứa Docker. GitLab cung cấp các trình chạy miễn phí trên Linux và tôi nghĩ có thể bao gồm các trình chạy của riêng bạn (nhân tiện, tôi không hiểu tính năng này sẽ hoạt động như thế nào đối với các hệ thống như Haiku, hệ thống mà tôi biết không có Docker hoặc tương đương, nhưng còn đối với FreeBSD thì không có Docker nên vấn đề này không phải chỉ xảy ra với Haiku).

Lý tưởng nhất là các ứng dụng Haiku có thể được xây dựng bên trong bộ chứa Docker cho Linux. Trong tình huống này, việc lắp ráp Haiku có thể được đưa vào các đường ống hiện có. Có trình biên dịch chéo không? Hay tôi nên mô phỏng tất cả Haiku bên trong vùng chứa Docker bằng cách sử dụng cái gì đó như QEMU/KVM (giả sử nó sẽ hoạt động theo cách đó trong Docker)? Nhân tiện, nhiều dự án sử dụng các nguyên tắc tương tự. Ví dụ: Scribus thực hiện điều này - nó đã có sẵn cho Haiku. Một ngày nào đó sẽ đến khi tôi có thể gửi như vậy Kéo yêu cầu đến các dự án khác để thêm hỗ trợ Haiku.

Một trong những nhà phát triển giải thích:

Đối với các dự án khác muốn tự tạo gói, phương pháp CMake/CPack thông thường được hỗ trợ. Các hệ thống xây dựng khác có thể được hỗ trợ bằng cách gọi trực tiếp chương trình xây dựng của gói, điều này tốt nếu mọi người quan tâm đến nó. Kinh nghiệm cho thấy: cho đến nay vẫn chưa có nhiều người quan tâm nên haikuporter làm việc rất thuận tiện cho chúng tôi, nhưng cuối cùng thì cả hai phương pháp đều phải hoạt động cùng nhau. Chúng ta nên giới thiệu một bộ công cụ để xây dựng chéo phần mềm từ Linux hoặc bất kỳ hệ điều hành máy chủ nào khác (Haiku không được thiết kế để chạy trên máy chủ).

Tôi đứng dậy hoan hô. Người dùng Linux thông thường mang theo tất cả tải bổ sung này và hành trang bổ sung (bảo mật, kiểm soát chặt chẽ, v.v.) cần thiết cho hệ điều hành máy chủ, nhưng không cần thiết cho hệ điều hành cá nhân. Vì vậy, tôi hoàn toàn đồng ý rằng việc có thể xây dựng các ứng dụng Haiku trên Linux là một hướng đi đúng đắn.

Kết luận

Có thể chuyển các ứng dụng POSIX sang Haiku nhưng có thể đắt hơn so với việc xây dựng lại thông thường. Tôi chắc chắn sẽ mắc kẹt với điều này trong một thời gian dài nếu không có sự giúp đỡ của những người từ kênh #haiku trên mạng irc.freenode.net. Nhưng ngay cả họ cũng không phải lúc nào cũng nhận ra ngay điều gì không ổn.

Các ứng dụng viết bằng Qt là một ngoại lệ dễ dàng. Tôi đã tập hợp một ứng dụng demo đơn giản mà không gặp vấn đề gì.

Việc xây dựng một gói cho các ứng dụng đơn giản cũng khá dễ dàng, nhưng chỉ dành cho những ứng dụng “được phát hành theo truyền thống”, tức là. có kho lưu trữ mã nguồn được phiên bản nhằm mục đích hỗ trợ trong haikuports. Để xây dựng liên tục (xây dựng cho mọi cam kết thay đổi) với GitHub, mọi thứ dường như không đơn giản như vậy. Ở đây, Haiku có cảm giác giống một bản phân phối Linux hơn là kết quả trên máy Mac, khi bạn nhấp vào nút “Xây dựng” trong XCode, bạn sẽ nhận được một gói .app, sẵn sàng để được chèn vào ảnh đĩa .dmg, chuẩn bị tải xuống trên trang web của tôi.
Việc liên tục xây dựng các ứng dụng dựa trên hệ điều hành “máy chủ”, chẳng hạn như Linux, rất có thể sẽ khả thi nếu có nhu cầu từ các nhà phát triển, nhưng hiện tại, dự án Haiku có những nhiệm vụ khác cấp bách hơn.

Hãy tự mình thử nó! Xét cho cùng, dự án Haiku cung cấp hình ảnh để khởi động từ DVD hoặc USB, được tạo hằng ngày. Để cài đặt, chỉ cần tải xuống hình ảnh và ghi nó vào ổ đĩa flash bằng cách sử dụng thợ khắc bằng a cít

Bạn có câu hỏi nào không? Chúng tôi mời bạn đến với buổi nói chuyện bằng tiếng Nga kênh điện tín.

Tổng quan về lỗi: Cách tự bắn vào chân mình trong C và C++. Bộ sưu tập công thức hệ điều hành Haiku

Từ tác giả dịch: đây là bài thứ năm trong loạt bài về Haiku.

Danh sách các bài viết: Đầu tiên Thứ hai Третья Thứ tư

Nguồn: www.habr.com

Thêm một lời nhận xét