Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 设置dpkg控制文件时,是否有自动确定依赖关系的方法?_Linux_Ubuntu_Package_Debian_Dpkg - Fatal编程技术网

Linux 设置dpkg控制文件时,是否有自动确定依赖关系的方法?

Linux 设置dpkg控制文件时,是否有自动确定依赖关系的方法?,linux,ubuntu,package,debian,dpkg,Linux,Ubuntu,Package,Debian,Dpkg,dpkg(Debian)控制文件中的大多数字段都很简单。棘手的一点是确定依赖项列表(dependens:)。我希望dpkg gencontrol可以通过查看包目录中可执行文件的ldd输出来为我做到这一点。也许可以,但我不能让它工作 如果这就是dpkg gencontrol的目的,那么我得到的错误是: dpkg-gencontrol: error: syntax error in control_template at line 7: first block lacks a source fiel

dpkg(Debian)控制文件中的大多数字段都很简单。棘手的一点是确定依赖项列表(dependens:)。我希望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\u template-lchangelog-Pdebian。控制模板文件包含以下内容:

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发行版中构建一个包,甚至不是为了让公众下载,所以如果需要的话,我很乐意改变/打破标准规则。

事实上,查看包含的库列表对于C程序来说是非常常见的,而只是shlibs助手的工作(
dpkg shlibdeps
)。查看其手册页以获取帮助,但基本上它可以归结为在依赖行中使用
${shlibs:Depends}

受thiton答案启发进行了一些挖掘,并进行了大量的尝试和错误,我终于找到了解决问题的方法。事实证明,dpkg gencontrol不是从可执行文件推断包依赖关系的工具,而dpkg shlibdeps是。但是,需要仔细设置这两个程序,以帮助生成一个包。继续读

运行
dpkg shlibdeps-O
会得到运行该可执行文件所需安装的软件包和版本的列表。完美的几乎。理想情况下,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)
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
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)
请注意,Debian打包工具保留Debian/tmp/下所有文件的所有者和组。因此,如果您希望在安装时由root用户或其他用户拥有文件,那么事情就会变得棘手。一个选项是将debian目录树准备为根目录,并根据需要设置所有者。如果您不希望以root身份运行,或者不允许以root身份运行,那么还有另一种方法

创建一个调用chown等的脚本,以根据需要调整所有权,最后一行是
dpkg deb-b debian/tmp.
(它构建.deb包,请参见下面的示例)。通过另一个Debian工具fakeroot运行它,如下所示:
fakeroot./fix\u ownerships\u and\u build.sh
。Fakeroot允许程序像根一样运行,而不会像根那样实际更改内容。它就是为这个场景创建的

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

Debian软件包有两种,源代码和二进制代码。我想我需要一个二进制的,因为我只想把编译后的可执行文件放进去,但我无法让它工作。我尝试了一个源程序包,并在我的控制文件中添加了一个源字段。这消除了“第一个块缺少源字段”错误,但导致了另一个错误。仔细阅读文档,我意识到源代码包在它们的控制文件中。一旦我将控制文件更改为这样,它就开始工作(几乎):

其中fix_ownerships_和_build.sh如下所示:

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)
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
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)

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

这是促使我开始寻找解决方案的线索。谢谢,蒂尔顿。作为参考,不是dh_shlibdeps提供了帮助,而是dpkg-shlibdeps。做得不错,但是您重新编程了dpkg构建包的一大部分。你知道那个工具,是吗?有点。有几十种与dpkg相关的工具,我对保持简单感兴趣。Debian工具似乎也非常专注于从上游来源创建软件包,以便与Debian本身一起分发,而这并不是我想要做的。我首先构建了一个简单的目录树、最小的控制文件和一个对
dpkgdeb-b
的调用。我试着在这个基础上找到最小的补充,以得到我想要的。它有点长了。:)我会调查dpkg的软件包。车轮改造通常是学习的一个重要部分。