首页 文章

如何从源代码构建Debian / Ubuntu包?

提问于
浏览
112

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

  • 这是旧版本(缺少我需要的功能)

  • 我需要的编译选项与默认选项略有不同 .

这样做最简单的方法是什么?我担心一些事情

  • 如何检查是否已正确列出所有依赖项? (我可以通过查看旧版本所依赖的内容获得一些提示,但可能已添加了新的依赖项 . )

  • 如何阻止更新系统在更新时在repo中安装旧版本?

  • 如何阻止系统安装新版本(当它出来时),覆盖我的自定义包?

10 回答

  • 26

    我相信this是Debian软件包'bible' .

    嗯,这是Debian新的维护者指南,所以很多都不适用,但它们确实涵盖了什么 .

  • 76

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

    apt-get build-dep
    

    这将安装依赖项 . 您需要source.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 =挤压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放置最终包的位置 .

    祝好运!

  • 3

    示例 Ubuntu-based build for ccache:

    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/

  • 1

    如果你正在使用Ubuntu,请查看pkgcreator项目:http://code.google.com/p/pkgcreator

  • 6

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

    基本上,您需要:

    • 设置文件夹结构

    • 创建 control 文件

    • (可选)创建 postinstprerm 脚本

    • 运行dpkg-deb

    我通常在我的Makefile中完成所有这些操作,所以我可以输入 make 来吐出二进制文件并将其打包一次 .

  • 6

    对于你想要做的事情,你可能想要使用debian源差异,所以你的软件包类似于除了上游版本之外的官方软件包 . 您可以从packages.debian.org下载源差异,或者可以使用"apt-get source"将其与.dsc和原始源归档一起下载 .

    然后解压缩上游源的新版本,切换到该目录,然后应用您下载的差异

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

    然后进行您想要编译选项的更改,并通过执行来构建包

    dpkg-buildpackage -rfakeroot -us -uc
    
  • 2
    • 将原始包中的"debian"目录放到源目录中

    • 使用“dch”更新软件包版本

    • 使用"debuild"来构建包

  • 1

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

    dpkg-buildpackage -us -uc -nc
    

    这意味着不签署结果,不清洁 .

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

    获得依赖是一门黑色艺术 . “官方”方式是检查构建取决于是否包只使用基本系统,“构建必需”包以及您指定的构建依赖项构建 . 不知道常规依赖关系的一般答案,只需涉水:)

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

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

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

    或者,由于您是从源代码构建的,因此可以使用epoch来人为地设置版本号,并且不会再次受到打扰 . 要使用纪元,请在debian / changelog文件中添加一个新条目,并在版本号前添加一个99: . 鉴于我的nullidentd示例,更新后的更改日志的第一行将显示为:

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

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

  • 2

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

    pbuilder 是一个很好的工具,可以通过在chroot环境中设置一个干净的基本系统来检查构建依赖性和依赖性 . 通过在pbuilder中编译包,您可以轻松检查构建依赖关系,并通过在pbuilder环境中测试它,您可以检查依赖关系 .

  • 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
    

相关问题