我目前正在构建一个大型项目,其中包含用几种语言(例如 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 一起工作得很好。