【问题标题】:How to build a Debian/Ubuntu package from source?如何从源代码构建 Debian/Ubuntu 软件包?
【发布时间】:2023-03-04 17:28:02
【问题描述】:

我有一个程序的源代码(取自 cvs/svn/git/...),我想为它构建一个 Debian/Ubuntu 软件包。该软件包存在于存储库中,但是:

  • 这是一个旧版本(缺少我需要的功能)
  • 我需要的编译选项与默认选项略有不同。

最简单的方法是什么?我担心几件事

  • 如何检查我是否正确列出了所有依赖项? (我可以通过查看旧版本所依赖的内容来获得一些提示,但可能已经添加了新的依赖项。)
  • 如何防止更新系统在更新时在 repo 中安装旧版本?
  • 如何防止系统安装较新版本(当它过期时)覆盖我的自定义包?

【问题讨论】:

标签: ubuntu debian packaging


【解决方案1】:

您可以对所有尚未在 debian/ubuntu 中的软件包使用特殊软件包“checkinstall”。

您可以使用“uupdate”(apt-get install devscripts) 使用现有的 debian 源从源构建一个包:

libdrm2 示例:

apt-get build-dep libdrm2
apt-get source libdrm2
cd libdrm-2.3.1
uupdate ~/Downloads/libdrm-2.4.1.tar.gz
cd ../libdrm-2.4.1
dpkg-buildpackage -us -uc -nc

【讨论】:

  • 谢谢!我刚刚使用它来将 Subversion 1.6.6 移植到只有 1.6.5 作为其最新可用版本的 Ubuntu 安装,并且它运行完美。为我节省了好几个小时的修补时间! :)
  • 您能提供更多关于这些命令的上下文吗? libdrm-2.3.1 到底在哪里?还有libdrm-2.4.1.tar.gz是从哪里来的(我最初的假设是我们想要打包到deb中的应用程序的编译二进制文件,但是替换现有版本,对吗?)
  • 如果您收到错误 You must put some 'source' URIs in your sources.list,请取消注释您的 /etc/apt/sources.list 中的 deb-src 行
【解决方案2】:

首先,标题问题: 假设 debian 目录已经存在,进入源目录(包含 debian 目录的目录)并调用 dpkg-buildpackage。我喜欢使用以下选项运行它:

dpkg-buildpackage -us -uc -nc

这意味着不签署结果也不清理。

如何检查我是否正确列出了所有依赖项?

获取依赖项是一门黑色艺术。 “官方”的方法是检查构建依赖是否仅使用基本系统、“构建基本”包和您指定的构建依赖项构建。不知道常规依赖项的一般答案,只是涉足:)

如何防止更新系统在更新时在 repo 中安装旧版本? 如何防止系统安装更新版本(当它出来时)覆盖我的自定义包?

我对此的了解可能已经过时,但要解决这两个问题: 使用 dpkg --set-selections。假设 nullidentd 是您想要保留的包,请以 root 身份运行

echo 'nullidentd hold' | dpkg --set-selections

另外,由于您是从源代码构建的,您可以使用epoch 将版本号人为地设置为高,并且再也不会被打扰。要使用 epoch,请在 debian/changelog 文件中添加一个新条目,并在版本号前面放置一个 99:。鉴于我的 nullidentd 示例,您更新的变更日志的第一行将显示为:

nullidentd (99:1.0-4) unstable; urgency=low

Bernard's link 很好,特别是如果您必须自己创建 debian 目录 - developers referencegeneral resource page 也很有帮助。 Adam's link 看起来也不错,但我不熟悉。

【讨论】:

  • "dpkg --set-selections" 仍然有效,但现在更好的方法是“aptitude hold nullidentd”。
【解决方案3】:

用于 ccache 的 基于 Ubuntu 的构建示例:

sudo apt-get update
sudo apt-get build-dep ccache
apt-get -b source ccache
sudo dpkg -i ccache*.deb

更多详情:http://blog.aplikacja.info/2011/11/building-packages-from-sources-in-debianubuntu/

【讨论】:

    【解决方案4】:

    对于你想做的事情,你可能想使用 debian 源 diff,所以你的包除了使用的上游版本外,与官方的类似。您可以从packages.debian.org 下载源 diff,或者可以使用“apt-get source”将其与 .dsc 和原始源存档一起获取。

    然后你解压你的上游源代码的新版本,切换到那个目录,并应用你下载的差异

    zcat ~/downloaded.diff.gz | patch -p1
    chmod +x debian/rules
    

    然后进行你想要的编译选项的更改,并通过这样做来构建包

    dpkg-buildpackage -rfakeroot -us -uc
    

    【讨论】:

      【解决方案5】:

      我相信this 是 Debian 软件包“圣经”。

      嗯,这是 Debian 新维护者指南,所以很多内容不适用,但它们确实涵盖了哪些内容。

      【讨论】:

        【解决方案6】:
        • 将“debian”目录从原始包放到你的源目录
        • 使用“dch”更新包的版本
        • 使用“debuild”构建包

        【讨论】:

          【解决方案7】:

          如果您使用的是 Ubuntu,请查看 pkgcreator 项目: http://code.google.com/p/pkgcreator

          【讨论】:

            【解决方案8】:

            Here 是构建 Debian 软件包的教程。

            基本上,您需要:

            1. 设置文件夹结构
            2. 创建控制文件
            3. 可选择创建 postinstprerm 脚本
            4. 运行 dpkg-deb

            我通常在我的 Makefile 中完成所有这些操作,因此我只需键入 ma​​ke 即可输出二进制文件并一次性打包。

            【讨论】:

              【解决方案9】:

              如何检查我是否正确列出了所有依赖项?

              pbuilder 是一个出色的工具,通过在 chroot 环境中设置干净的基础系统来检查构建依赖关系和依赖关系。通过在 pbuilder 中编译包,您可以轻松检查构建依赖关系,并通过在 pbuilder 环境中对其进行测试,您可以检查依赖关系。

              【讨论】:

                【解决方案10】:

                如果您想要一种快速而肮脏的方式来安装构建依赖项,请使用:

                apt-get build-dep
                

                这将安装依赖项。为此,您需要 sources.list 中的源代码行:

                deb-src http://ftp.nl.debian.org/debian/ squeeze-updates main contrib non-free
                

                如果您将包从测试版本向后移植到稳定版本,请注意依赖关系可能已更改。命令 apt-get build-deb 为您当前存储库中的源包安装依赖项。

                当然,dpkg-buildpackage -us -uc 会显示所有已卸载的依赖项。

                如果您想更频繁地编译,请使用 cowbuilder。

                apt-get install cowbuilder
                

                然后创建一个构建区域:

                sudo DIST=squeeze ARCH=amd64 cowbuilder --create

                然后编译一个源码包:

                apt-get source cowsay
                
                # do your magic editing
                dpkg-source -b cowsay-3.03+dfsg1              # build the new source packages
                cowbuilder --build cowsay_3.03+dfsg1-2.dsc    # build the packages from source
                

                观察 cowbuilder 将生成的包放在哪里。

                祝你好运!

                【讨论】:

                  猜你喜欢
                  • 2012-06-10
                  • 2018-10-28
                  • 2014-10-08
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多