我与俳句的第五天:让我们移植一些程序

我与俳句的第五天:让我们移植一些程序

TL博士: 一个新手第一次看到 Haiku,试图从 Linux 世界移植一些程序。

我与俳句的第五天:让我们移植一些程序
我的第一个 Haiku 移植程序,以 hpkg 格式打包

最近 我发现了 Haiku,这是一个非常好的 PC 操作系统。
今天我将学习如何将新程序移植到这个操作系统。 主要重点是从 Linux 开发人员的角度描述切换到 Haiku 的第一次体验。 对于我一路上所犯的任何愚蠢错误,我深表歉意,因为距离我第一次下载俳句还不到一周。

我想实现三个目标:

  • 移植一个简单​​的 CLI 应用程序
  • 将应用程序从 GUI 移植到 Qt
  • 然后将它们打包为 hpkg 格式(因为我还在考虑将 AppDir 和 AppImage 改编为 Haiku...)

让我们开始吧。 分节 文件 и 发育,以及在 维基 从 HaikuPorts 我找到了正确的方向。 甚至还有一本在线 PDF 书 BeOS:移植 Unix 应用程序.
467 页 - 这是 1997 年的! 往里面看很可怕,但我希望一切顺利。 开发者的话令人鼓舞:“花了很长时间,因为 BeOS 不符合 POSIX 标准”,但俳句“大部分”已经是这样了。

移植简单的 CLI 应用程序

第一个想法是移植应用程序 阿夫鲁德,但是,事实证明,这已经是 已经完成了 很久以前。

第一次尝试:没什么可看的

我无法理解的是,已经 应用程序移植到 Haiku 已有 10 多年的历史 - 尽管操作系统本身还不是 1.0 版。

第二次尝试:需要重写

所以我会用 ptouch-770, CLI 用于控制我用来打印标签的 Brother P-Touch 770 打印机。
我在上面打印了各种标签,你可能已经在上一篇文章中看到了。 早些时候,我用Python编写了一个小的GUI包装程序(因为它是在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 开发人员交谈,结果发现 msgpack 中有一个错误,几分钟后我在 HaikuPorts 中看到了一个补丁。 我可以亲眼看到修正后的包是如何 去这里 (buildslave - 虚拟机)。

我与俳句的第五天:让我们移植一些程序
在 buildmaster 上构建修正后的 msgpack

在两次之间我向上游发送补丁 为 msgpack 添加俳句支持.

五分钟后,更新后的 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

先生。 摇摇晃晃地飞溅 告诉你在哪里挖掘:

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

这里我发帖了 配置日志.

他们向我解释说,除了 Haiku 上的 libresolv 之外,libnetwork 中还有其他东西。 显然代码需要进一步编辑。 需要思考……

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

“错误的端口ID”已经像一张名片了 ku句。 也许有人知道出了什么问题以及如何解决它? 如果是这样,我会更新这篇文章。 链接到 GitHub上.

将 GUI 应用程序移植到 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!

真的很简单。 不到一分钟!

使用 haikuporter 和 haikuports 将应用程序打包为 hpkg。

我应该从什么开始? 没有简单的文档,我转到 irc.freenode.net 上的 #haiku 频道并听到:

  • 团队 package - 创建包的低级方法。 在大多数情况下,PackageInfo 对她来说就足够了,如“将其制作成正确的 .hpkg 包”部分中所述
  • 我需要做点什么
  • 可以用 hpkg-创建者 (它对我来说崩溃了, 错误报告)

目前还不清楚该怎么做。 我想我需要一个 Hello World 风格的初学者指南,最好是视频。 如果能像 GNU hello 中那样对 HaikuPorter 进行方便的介绍就好了。

我正在阅读以下内容:

haikuporter 是一个为 Haiku 创建通用包项目的工具。 它使用 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。 检查存储库中所有包的依赖关系 俳句港,这需要一些时间。 我去喝点咖啡。

到底为什么这个检查应该在我的本地计算机上完成,而不是集中在服务器上为每个人一次完成?

据先生说。 摇摇晃晃地飞溅:

这样你就可以重写存储库中的任何文件😉你可以对此进行一些优化,在需要时计算必要的信息,因为最后所做的更改非常罕见。

~/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仓库,代码已经直接存在了,没有什么需要解压的。 从我的角度来看,该工具应该足够智能,不会在 GitHub URL 上方寻找解包器。

也许 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 不安全!)并且仍然试图解压一些东西。

根据 先生。 摇摇晃晃地飞溅:

嗯,是的,原因是希望检查接收到的组装数据的完整性。 其中一个选项是验证存档的校验和,但是您当然可以对单个文件进行哈希处理,但这不会被实现,因为这需要更长的时间。 这样做的后果就是 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

出于旧习惯,我去 irc.freenode.net 网络上的 #haiku 频道询问好人。 如果没有他们我会在哪里? 经过提示后,我意识到我应该使用:

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

好吧,它的作用已经很清楚了 - 它下载包含某个版本的源代码的存档。 从我的角度来看,这很愚蠢,而且不完全是我想要的,即从 master 分支下载最新版本。

一位开发人员是这样解释的:

我们有自己的 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 和存储库 俳句港 它没有一种“正常工作”的感觉,但作为一名开发人员,我喜欢使用 Haiku 进行工作。 在大多数情况下,它类似于 Open Build Service,这是一组用于构建 Linux 版本的工具:非常强大,具有系统性方法,但对于我的小型“hello world”应用程序来说有点过头了。

再次,根据先生的说法。 摇摇晃晃地飞溅:

事实上,HaikuPorter 默认情况下相当严格(加上有一个 lint 模式以及一个严格模式使其更加严格!),但这只是因为它创建了可以工作的包,而不仅仅是创建包。 这就是为什么他抱怨未声明的依赖项、未正确导入的库、不正确的版本等。 目标是在用户知道之前捕获所有问题,包括未来的问题(这就是为什么无法安装 avrdude,因为依赖项实际上是在配方中指定的)。 库不仅仅是单独的包,甚至不是特定的 SO 版本。 HaikuPorter 确保在配方本身中遵守所有这些内容,以避免执行过程中出现错误。

原则上,这种严格程度在创建操作系统时是合理的,但对于我来说,对于“hello world”应用程序来说似乎没有必要。 我决定尝试别的东西。

使用“package create”命令以 hpkg 格式构建应用程序

也许 简单的说明对我来说会更有效吗?

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.
再次强调,出乎意料的快速、简单和有效。 太神奇了,不可思议!

但是...(没有他们我们会在哪里!)

应用程序菜单列表和快速启动中仍然缺少该应用程序。 我想我已经知道如何解决它了。 在文件管理器中,我将 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 正在处理 BeOS 格式的 .pkg 存档。 我希望用户安装它们,但它们出现在菜单中会导致混乱。

出于某种原因,在我看来,有一个更简单的解决方案,例如 Hidden=true 在文件中 .desktop 在 Linux 上。 为什么不让“隐藏”的信息成为文件系统的资源和属性呢?

尤其不微妙的是显示菜单的(某些)应用程序的名称, deskbar,一路上牢牢拴着。

先生。 waddlessplash 解释了这一点:

在这种情况下,“桌面栏”应该被理解为一种通用术语(与“任务栏”非常相似,它既指 Windows 应用程序,也指一般概念)。 嗯,自从这 deskbar,而不是“Deskbar”,这个也可以类似的理解。

我与俳句的第五天:让我们移植一些程序
2 个“几乎相同”的目录,其中包含应用程序

为什么有 2 个包含应用程序的目录,以及为什么我的 QtQuickApplication 在一个目录中,但不在另一个目录中? (毕竟,这不是一个系统,而是第二个用户,这对我个人来说是可以理解的)。
我真的很困惑,我认为这应该统一。

先生的评论摇摇晃晃地飞溅

应用程序目录包含菜单中不需要的应用程序。 但菜单的情况确实需要改进,使其更加可定制。

申请,否则不会发生😉

我想知道:是否真的有必要将应用程序托管在 /system/apps,如果用户在那里看到它们,这是不可取的。 也许将它们放置在用户不会遇到它们的另一个地方会更好? 就像在 Mac OS X 中所做的那样,包的内容 .app,这对于用户来说不应该是可见的 /Applications,隐藏在/System/Library/…的深处“`.

依赖关系又如何呢?

我认为以某种方式指定依赖关系是值得的,对吧? Qt 是否可以被视为默认情况下 Haiku 安装的强制部分? 没有! 默认情况下不安装 Qt。 包构建器可以通过检查 ELF 文件自动检测依赖关系吗? 有人告诉我 HaikuPorter 实际上是这样做的,但是 package 不。 那是因为它只是一个“包生成器”,只是自行创建文件 hpkg.

是否应该通过添加一个包不应该依赖于 Haiku 之外的包的策略来使 Haiku 变得更加复杂? haikuports? (我愿意,因为这样的策略会让事情变得容易得多 - 系统将能够自动解析从任何地方下载的每个包的依赖关系,而无需弄乱其他包源。)

先生。 waddlesplash 解释说:

我们不想过多地限制开发人员的自由,因为很明显,如果 CompanyX 想要支持自己的一组具有依赖项的软件(以及存储库),它将完全自由地这样做。

在这种情况下,可能值得建议第三方包通过完全打包应用程序所需的所有内容来避免对 haikuports 中未包含的任何内容的依赖。 但我认为这是本系列未来文章的主题。 【作者是走向AppImage吗? — 大约。 译者]

添加应用程序图标

如果我想将简洁的内置图标之一添加到新创建的应用程序的资源中该怎么办? 事实证明,这是一个令人惊奇的主题,因此它将作为下一篇文章的基础。

如何组织持续的应用程序构建?

想象一个像 Inkscape 这样的项目(是的,我知道它还没有 Haiku 版本,但在上面显示很方便)。 他们有一个源代码存储库 https://gitlab.com/inkscape/inkscape.
每次有人将更改提交到存储库时,都会启动构建管道,然后自动测试、构建更改,并将应用程序打包到各种包中,包括 AppImage for Linux(一个独立的应用程序包,可以下载用于本地测试,无论系统上可能安装或不安装什么 [我就知道! — 大约。 译者])。 每个分支合并请求都会发生同样的情况,因此您可以在合并之前下载根据合并请求中建议的代码构建的应用程序。

我与俳句的第五天:让我们移植一些程序
将请求与构建状态合并,如果构建成功,则能够下载已编译的二进制文件(标记为绿色)

构建在 Docker 容器中运行。 GitLab 在 Linux 上提供免费的运行器,我认为可能包含您自己的运行器(顺便说一句,我不知道这对于像 Haiku 这样的系统如何工作,我知道它没有 Docker 或类似的系统,但是另外,对于 FreeBSD 来说,没有 Docker,所以这个问题并不是 Haiku 所独有的)。

理想情况下,Haiku 应用程序可以在 Linux 的 Docker 容器内构建。 在这种情况下,俳句的组装可以引入到现有的管道中。 有交叉编译器吗? 或者我应该使用 QEMU/KVM 之类的东西在 Docker 容器内模拟所有俳句(假设它会在 Docker 内以这种方式工作)? 顺便说一句,许多项目都使用类似的原理。 例如,Scribus 就是这样做的——它已经可用于俳句。 总有一天我可以发送 这样 向其他项目请求添加俳句支持。

一位开发人员解释道:

对于其他希望自己创建包的项目,支持常规的 CMake/CPack 方法。 可以通过直接调用包的构建程序来支持其他构建系统,如果人们对此感兴趣的话,这很好。 经验表明:到目前为止,还没有太多兴趣,因此 haikuporter 对我们来说很方便,但最终,两种方法应该一起工作。 我们应该引入一套工具,用于在 Linux 或任何其他服务器操作系统上交叉构建软件(Haiku 不是设计来在服务器上运行的)。

我起立鼓掌。 普通 Linux 用户承受着服务器操作系统所必需的所有这些额外负载和额外包袱(安全性、严格控制等),但个人操作系统则不然。 所以我完全同意能够在 Linux 上构建 Haiku 应用程序是一条出路。

结论

将 POSIX 应用程序移植到 Haiku 是可能的,但可能比典型的重建更昂贵。 如果没有 irc.freenode.net 网络上 #haiku 频道的人们的帮助,我肯定会在很长一段时间内陷入困境。 但即使是他们也并不总能立即看出问题所在。

用 Qt 编写的应用程序是一个简单的例外。 我组装了一个简单的演示应用程序,没有任何问题。

为简单应用程序构建包也很容易,但仅限于“传统发布”的应用程序,即具有用于支持 haikuports 的版本化源代码档案。 对于使用 GitHub 进行持续构建(针对每次更改提交进行构建),一切似乎都不那么简单。 这里 Haiku 感觉更像是一个 Linux 发行版,而不是 Mac 上的结果,当你点击 XCode 中的“Build”按钮时,你会得到一个包 .app,准备插入磁盘映像 .dmg,准备在我的网站上下载。
如果开发人员有需求,基于“服务器”操作系统(例如 Linux)的应用程序的持续构建很可能成为可能,但目前 Haiku 项目还有其他更紧迫的任务。

自己尝试一下吧! 毕竟,Haiku 项目提供了从 DVD 或 USB 启动的映像,生成 日报。 要安装,只需下载映像并将其写入闪存驱动器 刻蚀机

你有任何问题吗? 我们邀请您参加俄语 电报频道.

错误概述: 如何在 C 和 C++ 中搬起石头砸自己的脚。 Haiku OS 菜谱合集

作者 翻译:这是俳句系列的第五篇文章。

文章列表: 第一 第二个 第三 第四

来源: habr.com

添加评论