我最近了解到使用 获取任何给定软件包的源代码是多么容易,apt-get source
这样我就可以获取源代码、进行更改并安装任何软件包的我自己的修改版本。这太棒了!
直到今天我还以为每个包都有自己的源代码,并且不同的包有不同的源代码。
但是现在我发现不同的包可以有相同的源代码。下面是一个例子:
以下 4 个包似乎具有相同的源代码:
gir1.2-mutter-4
libmutter-4-0
mutter
mutter-common
这四个都安装在我的 Ubuntu 19.04 计算机上。执行apt-get source gir1.2-mutter-4
会得到与 完全相同的结果apt-get source libmutter-4-0
,并且对于mutter
和mutter-common
包也是如此。
以下是我的检查方法:
mkdir a
cd a
apt-get source gir1.2-mutter-4
cd ..
mkdir b
cd b
apt-get source libmutter-4-0
cd ..
diff -r a b
上面最后一行的递归差异没有输出,表明目录具有相同的内容。
现在回答我的问题:不同的软件包怎么会具有相同的源代码?
假设这是有意的而不是某种错误,那么这些包之间有什么区别,我如何才能看到这种区别?
是不是因为这些软件包的源代码配置和编译方式不同,例如,不同的软件包中包含了不同的代码部分?如果是这样,我在哪里可以找到有关如何配置每个软件包的信息?
编辑:忘记添加,如果您想测试它,为了apt-get source
正常工作,您可能首先需要使用启用它software-properties-gtk
正常工作,您可能首先需要按照此处所述https://askubuntu.com/a/857433/874649
编辑 2:感谢您的精彩回答!我也觉得这个有用https://askubuntu.com/a/246721/874649-- 关于apt-get build-dep
和dpkg-buildpackage
命令非常有用。修改源码包的源代码后,dpkg-buildpackage -us -uc
可用于构建新的 .deb 文件,该文件可用于安装修改后的程序。
答案1
你让人困惑构建二进制包与底层软件包所基于的源代码/软件包。
您所指的软件包都是从相同的源代码/软件包构建的mutter
。您可以通过转到packages.ubuntu.com
,搜索您正在查看的软件包,然后引用它所指的“源软件包”来轻松找到它。在本例中为mutter
:
然而,从那里我们可以检查Mutter 源码包的启动页并看到它构建了大量的二进制包(内置编译好的源代码等用于安装):
这些描述描述了每个包包含/安装的内容。专注于您指出的 4 个包,并使用以下描述:
gir1.2-mutter-4
- Mutter 的 GObject 自省数据(由gir
GObject 用作 Mutter 和 GObject 交互的库/数据)libmutter-4-0
- Mutter 窗口管理器的底层库。(通常用于插件开发、开发和编译 Mutter 集成等)mutter
- 实际使用 GNOME 窗口管理器库的 Mutter 窗口管理器(这就是需要 GObject 的原因)mutter-common
- Mutter 的共享文件 - 通常是默认配置选项或常用项目全部从源包构建的包。
您在包裹清单中看到的是构建包它们源自相同的源代码 - 每个包都是不同的物品在构建/编译后安装,并且用于不同的目的。您可以通过以下方式查看包本身的内容:下载单个软件包,然后使用 p7zip 或 Ubuntu 内置的存档管理器访问它们,并以此方式查看每个软件包所包含内容的差异。 这说,它们都来自相同的源代码 - 它们只是包含不同的项目已安装到系統。
答案2
源码包和二进制包是分开存在的。每个源码包可能有多个二进制包与之关联。也就是说,同一个源码包可能构建出多个二进制包。
发生这种情况的常见方式之一是,您有一个程序、一个用于完成大部分工作的库以及用于编译该程序和其他(可能是未来)使用该库的程序的头文件。它们都是在同一源代码树中开发和维护的,无论是否带有 Debian 或 Ubuntu 补丁,该源代码树都用于生成源包。然后,该源包用于为程序、库和头文件构建单独的二进制包。
这就是您在这里所得到的(还有一些其他二进制包)。您在命令中指定了不同的二进制包apt source
,但该命令正在下载和解压相同的源包。
发生这种情况的原因是,当您传递一个包名称apt source
但没有具有该名称的源包时,它会将其视为二进制包的名称并假定您想要该二进制包的对应源包。
在Launchpad 上的 Ubuntu 主页,您可以搜索软件包。Launchpad 显示有关源软件包的信息(同时Ubuntu 软件包搜索显示有关二进制包的信息)。如果您搜索mutter
, 然后正如托马斯·沃德所说你会找到mutter
Ubuntu 中源包的启动板页面。这是查看哪些二进制包与源包对应的好方法。在该页面顶部附近,它显示:
Ubuntu 中的 mutter 包
gir1.2-mutter-4:Mutter 的 GObject 自省数据
libmutter-4-0:来自 Mutter 窗口管理器的窗口管理器库
libmutter-4-0-dbgsym:ubuntu eoan 中没有 libmutter-4-0-dbgsym 的摘要。libmutter
-4-dev:Mutter 窗口管理器的开发文件
mutter:使用 GNOME 窗口管理器库的示例窗口管理器
mutter-common:Mutter 窗口管理器的共享文件
mutter-dbgsym:mutter 的调试符号
即使二进制包与其构建源包的名称不同,通常也可以通过在 Launchpad 上搜索二进制包来找到该源包。
通过检查二进制包的名称,您通常可以了解二进制包与用于构建它的源包之间的关系:
以 开头的二进制包名称
lib
通常提供可供多个程序(包括未来的程序)使用的代码库。-dev
以provide结尾的头文件,这有助于编译使用这些库的源代码。以...结尾
-dbg
或-dbgsym
提供调试符号(因此,即使libmutter-4-0-dbgsym
目前没有显示摘要,我们也知道它是一个调试符号包)。以 结尾的软件包
-common
通常提供位于 中的文件(通常是数据文件)/usr/share
。此类文件有时实际上是代码,只是静态和声明性形式,但它们也可能提供界面翻译成自然(即人类)语言。对于此类软件包中可以包含的内容,实际上没有太多限制。为了
mutter
,-common
二进制包(在较新版本中)包含架构、键绑定和文档。-common
软件包的一个好处是,由于它们通常不包含任何本机机器代码,因此相同的软件包文件通常适用于所有体系结构。(严格来说,这是文件放置在/usr/share
。
答案3
采取以下成分:
- 洋葱
- 番茄
- 面包
- 橄榄
你只能用这些做一道菜吗?不可以。你最后吃什么取决于菜谱。
每个包裹都包含一份菜谱。它告诉计算机如何处理这些原料,以制作出所需的菜肴。
一些软件包共享一个成分列表是合理且正常的。当然,在这种情况下,您只能期望在实践中当所述软件包源自同一项目时才会出现这种情况。