linux – 有没有办法在设置dpkg控制文件时自动确定依赖项?

dpkg(Debian)控制文件中的大多数字段都很简单.棘手的是确定依赖项列表(取决于:).我希望dpkg-gencontrol可以通过查看包目录中可执行文件的ldd输出来为我做这个.也许它可以,但我无法让它发挥作用.

如果这是dpkg-gencontrol的用途,我得到的错误是:

dpkg-gencontrol: error: syntax error in control_template at line 7: first block lacks a source field.

作为参考,该命令是dpkg-gencontrol -v1.1 -ccontrol_template -lchangelog -Pdebian. control_template文件包含:

Package: my-package
Maintainer: Joe Coder <joe@coder.com>
Description: The my-package system
 A longer description that runs to the end of one line and then 
 extends to another line.
Priority: optional

如果这不是dpkg-gencontrol的用途,是否有人对我能做什么有任何建议,或者建议如何设置依赖列表,理想情况下是自动的?

不可否认,以一般方式推断依赖关系可能是一个非常困难的问题,特别是如果您将搜索扩展到脚本和其他程序.我希望有一些工具可以在大多数时间使用.

请注意,这仅适用于内部分发.我没有构建一个程序包进入Linux发行版,甚至没有公众下载,所以我很乐意在需要时修改/破坏标准规则.

解决方法

经过一些挖掘,受到了thiton的回答,以及大量的反复试验,我终于找到了解决问题的方法.事实证明,dpkg-gencontrol不是推断可执行文件的包依赖关系的工具,dpkg-shlibdeps是.但是,需要仔细设置两个程序以帮助生成程序包.继续阅读……

运行dpkg-shlibdeps -O< executable>导致需要为要运行的可执行文件安装的软件包和版本的列表.完善.几乎.理想情况下,dpkg-gencontrol可以在其处理中使用它,它声称能够通过其变量替换功能来完成.

为了顺利实现这一点,我必须创建一个与Debian打包工具的期望相匹配的目录结构.看起来基本上是这样的:

my_project_directory/
  main.c (or other source code,etc.)
  debian/
    changelog    (created by hand; see below)
    control      (this is basically a template,created by hand; see below)
    files        (created by dpkg-gencontrol)
    substvars    (created by dpkg-shlibdeps and used by dpkg-gencontrol)
    tmp/         (tmp is the root of the target system's filesystem)
      path/
        to/
          my/
            project/
              executable_1  (this will be installed at /path/to/my/project)
              executable_2  (this,too)
      var/
        www/
          index.php  (this will be installed at /var/www on target systems)
      DEBIAN/        (create this by hand)
        control      (created by dpkg-gencontrol and used in the final package)

请注意,Debian打包工具在debian / tmp /下保留所有文件的所有者和组.因此,如果您希望在安装时拥有root或其他用户拥有的文件,那么事情会变得棘手.一种选择是以root身份准备debian目录树,并根据需要设置所有者.如果您不希望以root身份运行,或者不允许运行,则还有另一种方法.

创建一个调用chown等的脚本来调整所有权,最后一行是dpkg-deb -b debian / tmp. (构建.deb包,请参阅下面的示例).通过另一个Debian工具fakeroot运行它,如下所示:fakeroot ./fix_ownerships_and_build.sh. Fakeroot让程序的行为就像它们是root用户一样,而不会像root用户那样实际改变事物.它是为这种情况而创建的.

我调查了为什么dpkg-gencontrol生成“第一个块缺少源字段”错误,甚至可以读取它的Perl源代码.正如经常发生的那样,错误代码是精确的,没有提供足够的上下文来知道该做什么:控制文件确实需要一个名为“source”的字段,在其第一个(两个)块中.

有两种Debian软件包,源代码和二进制代码.我以为我需要二进制文件,因为我只想将已编译的可执行文件放入其中,但我无法使用它.我尝试了一个源包,并在我的控制文件中添加了一个源字段.这摆脱了“第一块缺少源场”的错误,但导致了另一个.更仔细地阅读文档,我意识到源代码在其控制文件中打包了need two “paragraphs”.一旦我将控制文件更改为这样,它就开始起作用了(差不多):

Source: my-package
Maintainer: Joe Coder <joe@coder.com>

Package: my-package
Priority: optional
Architecture: amd64
Depends: ${shlibs:Depends},apache2,php5
Description: The My-Package System
 A longer description that runs to the end of one line and then
 extends to another line.

仍然缺少的是changelog文件.这是一个文件,用于保存包的发布历史记录,包含重大更改,版本号,日期和负责人.我通常以自己的格式维护这样的东西,我仔细地将其转换为严格的Debian更改日志格式.出于某种原因,更改日志在最终包中被省略,因此我单独保留了历史文件并使用了占位符,如下所示:

my-package (1.0) unstable; urgency=low
  * placeholder changelog to satisfy dpkg-gencontrol
 -- Joe Coder <joe@coder.com>  Thu,3 Nov 2011 16:49:00 -0700

带有*的线路上的两个前导空间是必不可少的,就像带有 – 的线路上的单个前导空间一样,电子邮件地址和日期之间的两个空格也是如此.是的,日期需要精确,时区和所有,即使它不需要准确.

将所有内容放在一起,如上所述设置debian目录树,构建包所需的命令序列如下:

dpkg-shlibdeps debian/tmp/path/to/my/project/executable_1 \
               debian/tmp/path/to/my/project/executable_2
dpkg-gencontrol -v1.1  (or whatever version you are building)
fakeroot ./fix_ownerships_and_build.sh

fix_ownerships_and_build.sh看起来像这样:

chown -R root:root debian/tmp/path  (or whatever user is appropriate)
chown -R www-data:www-data debian/tmp/var/www/*  (same goes here)
dpkg-deb -b debian/tmp .  (this leads to a nice my-package_1.1_amd64.deb file)

就是这样了.希望这个答案能帮助其他人比我更快地取得进步.

相关文章

文章浏览阅读1.8k次,点赞63次,收藏54次。Linux下的目录权限...
文章浏览阅读1.6k次,点赞44次,收藏38次。关于Qt的安装、Wi...
本文介绍了使用shell脚本编写一个 Hello
文章浏览阅读1.5k次,点赞37次,收藏43次。【Linux】初识Lin...
文章浏览阅读3k次,点赞34次,收藏156次。Linux超详细笔记,...
文章浏览阅读6.8k次,点赞109次,收藏114次。【Linux】 Open...