使用 cp 在 dh_install 上 debuild 失败:无法统计“debian/tmp//path/to/install/bin/”:没有那个文件或目录

使用 cp 在 dh_install 上 debuild 失败:无法统计“debian/tmp//path/to/install/bin/”:没有那个文件或目录

我正在通过阅读创建供本地使用的二进制包http://chat.stackexchange.com/transcript/message/1313226#1313226聊天会话。我按照列表中提到的步骤进行操作。

My environment:
ubuntu 12.04
Project: MakeFile based C++ project which contains several sub directories and creating several shared libraries.

以下是遵循的步骤。

  1. 使用 gpg --gen-key 创建 gpg 密钥
  2. 创建打包所需的目录(名称为版本的软件包文件夹,debian 子文件夹)并dh_make --createorig在控制台中运行。此步骤生成了打包所需的文件德比安文件夹
  3. 编辑 ./debian 文件夹中的必要文​​件

./debian 文件夹中的文件列表

source //folder
compat
rules
copyright
changelog
control
install

以下是重要文件的内容。

$ 猫控制

Source: cscore
Section: misc
Priority: extra
Maintainer: dwft78 <[email protected]>
Build-Depends: debhelper (>= 8.0.0), autotools-dev
Standards-Version: 3.9.2
Homepage: <insert the upstream URL, if relevant>

Package: cscore
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: CoreScanner
CoreScanner for Ubuntu-12.04

$ cat 安装

/opt/installation-dir/bin/

这是二进制文件应该安装的地方。

cat 更新日志

cscore (1.0-1) precise; urgency=low

  * Initial release (Closes: #nnnn)  <nnnn is the bug number of your ITP>

 -- name <[email protected]>  Wed, 28 May 2014 14:16:29 +0530

$ 猫规则

#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

%:
    dh $@ 

最后我运行debuild命令但出现以下错误。

find /home/dwft78/project/cscore/cscore-1.0/lib -name "libcs*" -type f -exec cp -f {} /home/dwft78/project/cscore/cscore-1.0/debian/cscore/opt/motorola-scanner//bin \;
find /home/dwft78/project/cscore/cscore-1.0/lib -name "libcs*" -type l -exec cp -Rf {} /home/dwft78/project/cscore/cscore-1.0/debian/cscore/opt/motorola-scanner//bin \;
make[1]: Leaving directory `/home/dwft78/project/cscore/cscore-1.0'
   dh_install
cp: cannot stat `debian/tmp//opt/motorola-scanner/bin/': No such file or directory
dh_install: cp -a debian/tmp//opt/motorola-scanner/bin/ debian/cscore///opt/motorola-scanner/ returned exit code 1
make: *** [binary] Error 2
dpkg-buildpackage: error: fakeroot debian/rules binary gave error exit status 2

实际上没有创建名为临时文件里面德比安文件夹。debhelper 注意到 debuild 命令执行的状态一直持续到 dh_install 级别。除了上述文件集之外,还创建了输出文件。

$ cat cscore.debhelper.log

dh_auto_configure
dh_auto_build
dh_auto_test
dh_prep
dh_installdirs
dh_auto_install

请有人帮助继续前进。——谢谢。

答案1

请参阅dh_install据说,它的目的dh_install和它读取的文件通常用于以下两个目的之一:

  • 指定哪些文件来自单一来源并进入多个二进制包;或者
  • 安装包构建系统未处理的文件或将文件移动到不同的目录

如果您有一个构建系统,它已经可以在正确的目录中构建和安装二进制包所需的所有文件,并且您只从源构建一个二进制包,那么您debian/install根本不需要文件。

您提到您正在处理Makefile基于 的项目。只要它支持和等标准目标make allmake install尊重要安装的变量,就根本$DESTDIR不需要。debian/install

实际上,在您发布的输出中,您可以看到find在 之前立即执行的几行dh_install。我认为这是您的项目的make install目标执行,在我看来它已经在正确的路径中安装了文件,即debian/cscore/opt/motorola-scanner/bin。所以我认为您的构建可能在没有 的情况下工作debian/install

答案2

好的,我明白这个问题了。

案例 A

debian/<project-name>如果只有一个包,dh_auto_install 将会把包放置在下面。

案例 B

debian/tmp但是,如果您有多个包(即文件blah.install中有多个文件和多个包声明control),它会将它们放在下面。

请参阅此处的信息:

http://manpages.ubuntu.com/manpages/trusty/en/man1/dh_auto_install.1.html

不知何故,dh_install仅当这些文件位于以下时才会拾取文件,debian/tmp如果您只有一个包,则会完全失败。因此,运行dh_install可能不是必需的……但如果您使用pdebuilder-dist,则默认情况下会运行它。

解决方案

有一个覆盖dh_install,这会产生问题:

override_dh_install:
    @echo "skip dh_install"

相关内容