我有一台装有 Debian 7 的机器(是的,我知道这个系统很旧,但现在我无法升级到较新的版本)。这个版本的存储库中有 mutt 版本 1.5.21,但我希望 mutt 至少为 2.0.7,因为我很快就需要此版本的 mutt 中引入的 OAuth2 支持(Gmail 正在撤销仅密码登录) IMAP)。
我假设 Debian 7 没有 mutt >= 2.0.7 的预构建向后移植包(至少我还没有找到任何 - 如果存在,请指出)。所以我必须从源代码编译。但我想保留上游源代码中特定于 Debian 的更改。我可以只获取为较新的 Debian 版本准备的源 RPM 并在我的系统上编译它吗?还是这不起作用?
答案1
从源代码构建 deb 包相对容易(请注意,您需要 DEB 源而不是 RPM),但需要小心库依赖性。新的 mutt 可能需要旧 Debian 安装所不可用的库版本。
从以下位置的包页面检查包要求:https://tracker.debian.org/pkg/mutt。请注意版本控制的链接。 “box”符号链接控制文件,其中列出了构建依赖项。
最新版本2.2.4-1需要
Build-Depends: debhelper-compat (= 12),
docbook-xml,
docbook-xsl,
gawk,
gettext,
libgnutls28-dev,
libgpgme11-dev,
libidn2-dev,
libkrb5-dev,
libncurses5-dev,
libncursesw5-dev,
libgsasl-dev,
libtokyocabinet-dev,
pkg-config,
w3m,
xsltproc,
zlib1g-dev
请注意,其中一些包名称中包含版本号。它们适用于 Debian 7 吗?如果不是,这将是一场沿着构建依赖关系链递归迭代的噩梦,可能不值得。为 Debian 打包的下一个最旧版本是 2.0.5,不足以满足您的要求。
如果 Debian 7 确实有所需的库(libgnutls28-dev、libgpgme11-dev 等),那么下一步将是下载 orig tar 文件(上游源 tarball)、debian .dsc 文件和 debian diff文件 (.debian.tar.xz),均可从软件包页面获取https://packages.debian.org/unstable/mutt。
如果您下载这 3 个文件(可能还有用于校验和的 orig.tar.gz.asc),那么您将使用以下命令解压
dpkg-source -x mutt_2.2.4-1.dsc
(dpkg-source
在dpkg-dev
包装中)
然后 cd 进入源目录 (mutt-2.2.4)。如果所有构建依赖项均按顺序排列,您需要做的就是运行
dpkg-buildpackage
.deb 二进制文件将在父目录中创建,您可以手动安装,
sudo dpkg -i mutt_2.2.4*.deb
您可能会遇到构建依赖项中列出的所需库版本的问题。我预计它不会在 Debian 7 上运行(如果不重建整个库链,我认为这不值得付出努力)。
除此之外,您可能会遇到问题Build-Depends: debhelper-compat (= 12)
,这更容易处理。替换debhelper-compat (= 12)
为并创建一个仅包含数字的debhelper (>= 9~)
文件。debian/compat
9
为了更好地衡量,您需要创建自己的 debian/changelog 条目,以使用自己的版本号标记您的本地构建,您可以使用dch
(debchange
来自devscripts
包)
答案2
我终于有时间去做这件事了。
首先,我对所需的 mutt 版本的判断是错误的;我从某些网站获得的信息被证明是不正确的。读杂种狗变更日志我发现 mutt 1.11.0 中引入了对 OAUTHBEARER 身份验证方法的支持(并且在 1.11.4 中修复了一些特别是与 Gmail 相关的重要错误),并且在 2.0.0 版本中引入了对 XOAUTH2 的支持。但对于 Gmail,您不需要 XOAUTH2; OAUTHBAREER 就足够了。所以我需要的最低 mutt 版本实际上是 1.11.4。
谢谢关联由 @Stephen Kitt 提供 我能够找到为 Debian 打包的各种版本的 mutt,并发现在我的系统上编译没有问题的最高版本是1.14.4-1。除了debhelper (>= 10)
(我的系统有 debhelper 9)它依赖的所有库都存在于我的系统上或可以安装(就像libgnutls28-dev
可以从 wheezy-backports 安装)。
事实证明,该构建还需要 automake 1.16,而该版本不适用于 Debian 7。由于这只是一个脚本并且没有任何特定的依赖项,因此我能够安装一个用于后续 Debian 版本之一的软件包。
构建过程没有出现任何问题。更高版本的情况并非如此(从1.14.4-2) - 这些依赖于debhelper-compat (= 12)
并且构建失败并出现一些与 automake 相关的错误。它可能可以修复,但我没有进一步调查这个问题,因为我有一个可以正确构建的版本。
然而,让新建的杂种狗真正发挥作用是另一回事。首先,事实证明 GPG 支持不起作用。这是因为新的 mutt(与旧的相反)想要libgpgme
默认使用 - 这是通过set crypt_use_gpgme=yes
在发行版提供的默认配置文件中进行设置来实现的(并且我仍在使用旧的配置文件)。通过此设置,GPG 支持可以工作,但我对此不满意,如libgpgme
版本 1.4.3(构建需要升级到至少 1.4.0 版本)使用gpg2
(并在安装过程中将其作为依赖项拉入),并且gpg2
在我的语言环境在屏幕上要求输入密码时完全破坏了字符编码:
这看起来非常丑陋,而且如果该屏幕出现一次,mutt 在退出时不会正确清理屏幕,你的终端上会留下 mutt 输出的残留物,Linux 会在中间的某个地方提示...
所以我不想使用libgpgme
并切换回“经典”GPG 支持(set crypt_use_gpgme=no
,这是内置程序的默认设置),但是 - 正如我所提到的 - 这不起作用。我花了很多时间才发现,还有另一个默认值发生了变化,文档中没有提到 - 新的 mutt 期望gpg-agent
运行(对于非 GUI 系统通常不是这种情况)并且确实不单独询问 GPG 密码,将其留给gpg-agent
.我需要set pgp_use_gpg_agent=no
在配置文件中添加另一个设置以恢复旧的行为。
然后我还注意到 UI 行为与旧 mutt 的一些差异,这让我很恼火 - 首先,当我使用按键v
显示附件,并在文本/html 部分上按 Enter 时,它在内部查看器中显示为原始 HTML,而旧的 mutt 调用 mailcap 文件中指定的浏览器(即w3m
)来显示它。第二,当我使用M
键将消息移动到文件夹时,光标始终位于文件夹列表的顶部,而不是位于上次使用的文件夹上。有三屏文件夹,每次都必须滚动到我需要的文件夹,这真的很烦人。
事实证明,旧的杂种狗中有两个特定的补丁导致了这种行为,但不知何故没有出现在后来的版本中。我必须将这些补丁集成到源代码中并重建。
这就是 mutt 本身的情况。但真正的挑战是帮助程序脚本mutt_oauth2.py
,它实际上从 Google 获取身份验证令牌。它是用 Python 3.7 编写的,并使用了该版本的许多功能。 Debian 7 可以获得的最高 Python 版本是 3.2。因此,更改脚本以使其与 Python 3.2 兼容,确实需要做大量工作(太多,无法在此描述)。
但最终它起作用了:)