.deb 包可以包含要由 dpkg 编译的源吗?

.deb 包可以包含要由 dpkg 编译的源吗?

我有一个包含一些 c++ 代码的 pkg。目前,我正在将一些 c++ 代码编译为二进制文件,将一些编译为库,然后我可以将其发布并部署到其他平台上。

但是,我那里也有一个驱动程序,由于它依赖于内核,我无法交叉编译它,这使得每个内核可能需要不同的二进制文件。

所以,我想要一个 .deb,我将把二进制文件存储在 /usr/bin 下(已完成),将库存储在 /usr/lib 下(也已完成),将驱动程序源代码存储在 /opt/driver 下(我猜...这是一个合法的地方吗?)

打包这个是比较容易的部分,因为我需要做的就是把它放到我的工作区,然后调用dpkg-deb。我不确定的是两件事

  1. 将源代码打包到 .deb 中合法吗?(用 Python 术语来说 - .deb 是 bdist(二进制分发)还是 sdist(源分发))
  2. 如果它是合法的,我该如何调用 make 命令?可以dpkg / apt帮我做吗?还是我需要运行dpkg -i pkg然后再运行make?[查看后安装但我不确定这是否是正确的做法]

我愿意尝试任何可以解决这个问题的构建系统,但我目前使用的是 cmake,更愿意坚持使用它。


我的观点:

tree bla_x86_64
bla_x86_64
├── DEBIAN
│   ├── control
│   └── postinst
├── opt
│   └── bla.cpp
└── usr
    ├── bin
    │   └── bla.bin
    └── lib
        └── bla.lib
cat bla_x86_64/DEBIAN/postinst 
#!/bin/sh

set -e

echo hello world!
echo compiling $(ls /opt/bla.cpp)
echo cleanup
rm -rvf /opt/bla.cpp
$ dpkg-deb --build --root-owner-group bla_x86_64/
dpkg-deb: building package 'bla' in 'bla_x86_64.deb'.
$ sudo dpkg -i bla_x86_64.deb 
(Reading database ... 407519 files and directories currently installed.)
Preparing to unpack bla_x86_64.deb ...
Unpacking bla (4.0) over (3.0) ...
Setting up bla (4.0) ...
hello world!
compiling /opt/bla.cpp
cleanup
removed '/opt/bla.cpp'

答案1

从技术上来说,.deb 文件中没有“合法”或“非法”的内容。您可以将任何内容打包到其中。

在目标系统上放置源代码的一个好地方是/usr/share/${packagename}

要获取dpkgapt调用 make 命令,只需将它们放在包的postinst脚本中即可。请确保将构建过程所需的所有程序(例如cmakeg++binutils以及内核头文件)声明为依赖项,否则在未安装编译器的系统上安装将失败。此外,请确保在脚本中执行适当的错误处理,postinst以避免由于编译失败而安装错误的内核模块导致目标系统无法运行。

请注意,这只能解决一半的问题。除了在安装软件包时为正在使用的内核编译驱动程序外,您还需要确保在每次内核更新后为新内核重新编译驱动程序。此问题的解决方案是 DKMS(动态内核模块支持)的缩写。因此,您也需要考虑在 .deb 软件包中支持 DKMS。

相关内容