从 autotools 打包 .deb 时出现问题。 (检查安装、debhelper、...)

从 autotools 打包 .deb 时出现问题。 (检查安装、debhelper、...)

我目前正在构建一个大型项目,其中包含用几种语言(例如 C、C++ 和 Python)编写的源代码。我最近设法(痛苦地)处理自动工具以进行正确的安装。下一步是创建 .deb,因为我们的项目旨在在 debianstretch 上运行。

我尝试了几种方法来做到这一点,但我无法让它正常工作。

由 checkinstall 生成的树 .deb :

    unpack/
├── etc
│   └── nina
│       ├── auto_blacklist.txt
│       ├── blacklist.txt
│       ├── conf
│       ├── keywords.txt
│       ├── rubbish_links.txt
│       └── whitelist.txt
└── usr
    ├── local
    │   ├── bin
    │   │   ├── geckodriver
    │   │   └── nina
    │   ├── lib
    │   │   └── python2.7
    │   │       └── dist-packages
    │   │           ├── nina.py
    │   │           ├── nina_py_installed_files.txt
    │   │           ├── Uinput_wrapping_module-2.0.egg-info
    │   │           └── uinput_wrapping_module.so
    │   └── share
    │       └── man
    │           └── man1
    │               └── nina.1.gz
    └── share
        └── doc
            └── nina
                ├── COPYING
                ├── doc
                │   ├── Doxyfile
                │   └── nina.1
                ├── README
                └── README.md

由 debhelper (v9) 生成的树 .deb:

unpack/
├── etc
│   └── nina
│       ├── auto_blacklist.txt
│       ├── blacklist.txt
│       ├── conf
│       ├── keywords.txt
│       ├── rubbish_links.txt
│       └── whitelist.txt
└── usr
    ├── bin
    │   └── nina
    ├── lib
    │   └── python2.7
    │       └── dist-packages
    │           └── nina.py
    └── share
        ├── doc
        │   └── nina
        │       ├── changelog.Debian.gz
        │       └── copyright
        └── man
            └── man1
                └── nina.1.gz

正如您所看到的,它并不完全相同(原文如此)。我或多或少了解它的checkinstall作用:它运行 make install 命令并获取文件输出以将其放置在安装位置我的机器。debhelper在这里似乎是一种更合适的工具。 (安装/usr/lib而不是安装/usr/local/lib,允许我们签署软件包等。)我更喜欢使用它,但它没有按预期工作。

继续巨大的debhelper 方式的另一个优点是它实际上处理 debian/control 等中指定的依赖项。但 checkinstall 没有。

debhelper 没有做什么:

  • 从互联网源获取一些二进制文件(geckodriver)并将其放置在 /usr/bin 中

  • 安装自制的 python 模块

install-exec-local:这些操作是通过覆盖(分别为 & uninstall-local:)方法并执行一些 bash 命令在我的 Makefile.am 中执行的。

---

所以我的问题是:我怎样才能保留这两种包装方式中最好的部分以使其“完美”?

答案1

从互联网下载东西是 Debian 软件包构建不应该做的事情。如果您使用一些“内置干净的 chroot”帮助程序,它甚至可能无法做到这一点。不过,plaindpkg-buildpackage应该可以做到。如果您的自动工具构建系统做了正确的事情,那么就不需要什么了;否则,您需要将必要的命令添加到override_dh_foo命令中(请参阅“man dh”)。

对于 Python 模块,您还需要从构建系统安装 .py 文件,并遵守 $DESTDIR。如果这样做,处于dh模式的 debhelper 应该只是 DTRT。

如果这些都不起作用,请生成显示问题的软件包的最小版本;否则这就是一个水晶球问题。

答案2

我重新思考了我Makefile.am对你的感谢。并最终设法得到一些东西。

  • 获取 geckodriver

我正在运行脚本以./configure逐步获取它,并假设它位于打包系统上,将其作为文件依赖项放置在 .deb 包中,如下所示:

bindeptsdir = \
    $(prefix)/bin
bindepts_DATA = \
    /usr/local/bin/geckodriver
  • 安装Python模块

$(DESTDIR) 确实是这里的解决方案,现在我的 python 模块安装如下:

$(PYTHON) setup.py install \
    --root $(DESTDIR)

它工作得很好,除了我必须把它放在我的 debian/rules 中之外:override_dh_usrlocal:否则它会对我大喊大叫,因为我正在安装文件/usr/local

我不想,但是 python 正在自行处理安装,并且我无法指定安装路径。另一个解决方案是指定--prefix $(DESTDIR)$(prefix)而不是--root...安装但它安装的文件/usr/lib/python2.7/site-packages不在 pythonpath 中。

---

Appart from python Troubles 最终结果与 dpkg-buildpackage 一起工作得很好。

相关内容