如何使用相同的Debian目录创建多个Debian软件包

我正在将一个应用程序打包在我的电脑上,以便进行安装/分发。我已经成功地使用Ubuntu 12.04中的dpkg工具创建了包。现在我需要使用相同的文件设置创建多个包(二进制包(如xxx.deb),源代码包(xxx.1.0-1-devel.deb))。
Debian文件夹包含了使用dpkg-buildpackage -rfakeroot进行打包所需的所有修改过的文件。如果我需要使用相同的debian文件设置创建所有.deb文件,我还需要做什么?
此外,以下事项也让我感到困惑。 - devel包应该包括什么?它只包括开发头文件,还是开发头文件和所需的共享库,或者包括所有二进制文件,包括头文件?
1个回答

我假设你的目标程序是C/C++或类似的语言。
  • 你可以将所有文件都放在一个二进制包中。但是最好还是将开发文件分开放在另一个包中。

    *-dev(而不是-devel)应该只包含头文件、静态库、共享库,甚至如果这些工具仅用于开发的话,也可以包含二进制工具。

  • 你可以在debian/control中为单个源代码声明多个二进制包。最好通过示例来学习,比如samba

    <编辑请保持这些链接清晰,我想提到它们> 源代码包:http://packages.ubuntu.com/source/focal/samba ,看看从同一源代码构建了多少个二进制包。

    选择一个(主要包,samba-*.deb):http://packages.ubuntu.com/focal/samba ,看右侧 *-debian.tar.xz。下载并打开它。阅读其中的control文件:

      Source: samba
      ...
    
      Package: samba
      ...
    
      Package: samba-libs
      ...
    

    每个二进制包都有自己的*.install文件,列出了将要安装的文件及其位置。例如:samba.installsamba-libs.install,..

  • 对于库文件,静态库只包含在*-dev包中。

    如果你有不同版本的共享库可以同时安装,那么应该在两个包中都包含它们。

    例如,samba-dev,在页面底部点击文件列表,以及带有静态库的libc6-dev

    否则,只将共享库放在常规二进制包中,然后将其作为开发包的依赖项添加。

    参考资料:


我正在尝试让这个工作起来,构建多个共享源码的软件包 - 类似于这个。然而,dpkg-buildpackage 总是报错,例如 dpkg-source: error: source package has two conflicting values - php-java-bridge and php-java-bridge-j2ee。我甚至不想构建源码包,但它就是无法正常工作。 - OrangeDog
@OrangeDog,这个答案适用于具有相同编译选项的多个二进制文件(常规情况下:rules 文件运行 1 次编译循环)。然而,你的情况需要为每个二进制文件使用不同的选项进行编译(即:多次编译循环)。请查看此答案https://askubuntu.com/a/908351/26246以获取类似情况的解决方案。快速提示:注意在 rules 文件中使用 configure-stampbuild-stamp - user.dz
1实际上,这似乎是因为更新日志与源软件包名称不匹配。我猜你不能为不同的软件包使用不同的更新日志,对吗? - OrangeDog
@OrangeDog,不需要多个changelog文件。changelog与Debian源代码包相关(而非二进制文件)。因为它是用来记录Debian打包和Debian补丁的变更(而非上游开发者)。所以必须使用源代码包名称。另外,父文件夹也应该使用源代码包的名称。 - user.dz
1这里有一个超棒的迷你教程,由@user.dz提供,非常感谢!:-) - troglobit
这是不正确的:在库中,只有静态库会放入“-dev”软件包,如果您构建了一个库,共享库应该放到“主要”lib*软件包而不是lib*-dev。这是因为静态库只对开发人员有用,但对于共享库来说并非如此。 - porton