笔记:为了使这个问题更具体,我将使用包的安装rustc
作为示例。尽管如此,这个问题主要适用于一般的软件包。
我使用的是 Debian Stable 系统。我想rustc
从不稳定的发行版安装该软件包(目前稳定版中不存在该软件包)。我将不稳定的源添加到我的/etc/apt/sources.list
文件中
# Unstable
deb http://ftp.debian.org/debian unstable main contrib non-free
deb-src http://ftp.debian.org/debian unstable main contrib non-free
并运行apt update
,然后是apt install rustc
.正如预期的那样,APT 由于依赖性问题而拒绝安装。
The following packages have unmet dependencies:
rustc : Depends: libstd-rust-dev (= 1.12.0+dfsg1-1) but it is not going to be installed
Depends: binutils (>= 2.26) but 2.25-5 is to be installed
Recommends: rust-gdb but it is not going to be installed or
rust-lldb but it is not going to be installed
我想到的在存储库中安装软件包的唯一方法是从源代码构建它。我读这一页在 Debian wiki 上,它建议可以使用以下过程构建来自 Unstable 的软件包:
- 将 sid 的 deb-src 行添加到您的sources.list中
apt-get update
apt-get build-dep PACKAGE_NAME
apt-get -b source PACKAGE_NAME
但步骤 3. 由于未满足的依赖关系而失败。
所以我的问题是是否可以从不稳定的系统构建软件包并将它们安装在稳定的系统中。如果是的话,会怎样做呢?我想必须有一种方法来构建/下载所有依赖项并将它们合并到我想要的包的最终二进制文件中。然后安装该软件包。
答案1
首先,像您一样将不稳定的系统添加到稳定的系统中是A真的馊主意:分发工具会将不稳定的软件包视为有效的升级目标,即使您很小心,您通常最终也需要升级广泛使用的库,并且最终您的大多数软件包都会在以下位置跟踪不稳定的软件包:短期订单。 (如果确实需要,请使用固定。)
关于你的问题,一般来说,可以在稳定版中构建不稳定的源码包,遵循以下您链接到的程序。正如您所指出的,这很可能涉及向后移植依赖项,或调整源包以便可以稳定地构建它。如果该apt-get build-dep
步骤失败,原因是:不稳定源包的某些构建依赖项无法在稳定版中得到满足。您需要重复此过程,直到向后移植所需的所有内容,并安装生成的包。对于流行的软件包,值得提交错误以请求官方向后移植。
请注意,如果apt-get build-dep
失败,您需要手动安装构建依赖项。dpkg-buildpackage
会告诉您缺少什么,这在您向后移植构建依赖项时很有用:当您添加向后移植的构建依赖项时,报告的丢失包列表dpkg-buildpackage
将会缩小,当它停止抱怨时,您知道您正在完毕。这还考虑了您对构建依赖项所做的任何更改debian/control
(这apt-get build-dep
不会)。
为了rustc
事情是一个很多更复杂:rustc
需要自己构建,因此需要“引导”。这是几个月前在不稳定的 FTP 大师的合作下完成的;在稳定的系统中以干净的方式复制它并不容易。
因此,要真正rustc
安装在稳定的系统上,我将这样做......
- 向后移植
binutils
(以DEB_BUILD_OPTIONS=nocross,nomult,nogold
避免构建交叉工具链,并且gold
不能使用 Jessie 构建g++
)。 libllvm3.8
从 Jessie 向后移植安装。- 安装
libstd-rust-dev
,libstd-rust-1.12
和rustc
来自不稳定。
答案2
我读了你的注释,但以防万一你真的想要 rustc,你可以尝试安装测试/拉伸版本:https://packages.debian.org/stretch/rustc
测试/拉伸不像不稳定那么新,但它绝对比稳定更新。
您可以尝试使用 apt-get source 获取源代码并修改 ./debian/control 文件以不需要特定版本,但我不确定它是否能够构建。另外,对我来说,使用 sudo dpkg-buildpackage -B -us -uc 而不是该 wiki 上列出的其他方法更容易。