我正在通过阅读创建供本地使用的二进制包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.
以下是遵循的步骤。
- 使用 gpg --gen-key 创建 gpg 密钥
- 创建打包所需的目录(名称为版本的软件包文件夹,debian 子文件夹)并
dh_make --createorig
在控制台中运行。此步骤生成了打包所需的文件德比安文件夹 - 编辑 ./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 all
并make 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"