我正在尝试制作一个可以在 1386 和 amd64 上的 Ubuntu 12.04 - 13.* 上安装的软件包。我发现在 amd64 上,唯一的区别是我需要安装 32 位库。当系统有 ia32-libs 时,依赖 ia32-libs 可以工作(尽管有点过头了),但 13.* 甚至没有这个软件包。因此,我尝试通过 ':i386' 扩展进行安装。当我这样做时,sudo apt-get install blah:i386 ...etc
它工作正常。
以下控制文件在 12.04 上产生消息:“依赖项无法满足:libgcc1:i386”。
软件包:foo 版本:1.0-1 部分: 基础 优先级:可选 维护者:[电子邮件保护] 建筑:全部 依赖:libgcc1:i386、gcc-4.6-base:i386、libstdc++5:i386、libstdc++6:i386、libsasl2-2:i386、libgstreamermm-0.10-2:i386、libfreetype6:i386, libfontconfig1:i386、libX11-6:i386、libXrender1:i386、libice6:i386、libxext6:i386、libsm6:i386 描述:foo 很棒 Foo 真的很棒 安装尺寸:71140
因此,按照其他几个地方的说法,我制作了以下控制文件:
软件包:foo-amd64 版本:1.0-1 部分: 基础 优先级:可选 维护者:[电子邮件保护] 架构:amd64 依赖:foo、libgcc1:i386、gcc-4.6-base:i386、libstdc++5:i386、libstdc++6:i386、libsasl2-2:i386、libgstreamermm-0.10-2:i386、libfreetype6:i386, libfontconfig1:i386、libX11-6:i386、libXrender1:i386、libice6:i386、libxext6:i386、libsm6:i386 描述:foo 很棒 Foo 真的很棒 安装尺寸:71140 软件包:foo 版本:1.0-1 部分: 基础 优先级:可选 维护者:[电子邮件保护] 架构:i386 取决于:gksu Multi-Arch:外国 描述:foo 很棒 Foo 真的很棒 安装尺寸:71140
这个控制文件甚至无法编译,因为我收到以下错误消息:dpkg-deb: error: parsing file 'foo/DEBIAN/control' near line 25 package 'foo': several package info entries found, only one allowed
。我该如何正确地做到这一点?
编辑:此软件包不附带源代码。它附带已编译的 32 位二进制文件,因此需要依赖 32 位版本的库。
答案1
您不需要创建单独的包名称来获得多架构。只需输入:
Package: foo-amd64
Version: 1.0-1
Section: base
Priority: optional
Maintainer: [email protected]
Architecture: any
Multi-Arch: same
Depends: foo, libgcc1, gcc-4.6-base, libstdc++5, libstdc++6, libsasl2-2, libgstreamermm-0.10-2, libfreetype6,
libfontconfig1, libX11-6, libXrender1, libice6, libxext6, libsm6
Description: foo is awesome
Foo is really awesome
Installed-Size: 71140
这应该会构建 amd64 和 i386 软件包,具体取决于您的构建环境变量。如果您使用食谱:
dh(1) 和 autotools
最简单的转换包是在 Debian 打包中使用 autoconf upper 和 dh(1) 的包。
- 构建依赖于 debhelper (>= 9)。
- 将预依赖项:${misc:Pre-Depends} 添加到 debian/control 中列出的任何提供共享库的包。
- 将 debian/compat 更新到‘9’。
/usr/lib/
将中的 替换debian/*.install
为/usr/lib/*/
。- 如果
/usr/lib
(或子目录) 在 中被列为安装目标debian/*.install
,或 中的链接目标debian/*.links
,则需要将 $(DEB_HOST_MULTIARCH) 的值替换到此文件中。请参阅下面的“动态 debian/* 文件”。- debian/rules 中出现的任何 /usr/lib 都应替换为 /usr/lib/$(DEB_HOST_MULTIARCH)。
- 如果您需要在前两个步骤中的任一步骤中使用 debian/rules 中的 $(DEB_HOST_MULTIARCH),请通过调用以下命令在 debian/rules 中设置 DEB_HOST_MULTIARCH:DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)。
- 一旦您构建了软件包并验证了共享库包仅包含预期的文件,并且您的 -dev 包仍然有效,请在 debian/control 中将此共享库包标记为 Multi-Arch:相同。
- 如果共享库包可能需要它,则在 debian/control 中将通用包(即“全部”)标记为 Multi-Arch: foreign。
如果您已经在 debian/rules 中覆盖了 debhelper 命令,尽管在其余的构建中使用了 dh(1),您可能仍需要按照以下说明使用经典 debhelper 来修改覆盖规则所使用的 mv、cp 或 rm 命令。
Debian 打包实施指南中有更多示例https://wiki.debian.org/Multiarch/Implementation。您还可以使用 lithian 来确保您的包裹完全符合要求。