如何清理源代码以使用dpkg-buildpackage重新构建包?

8
我在使用dpkg,但遇到了一个比较奇怪的问题:在成功构建第一个包之后,无法再次构建该包。
dpkg-buildpackage -sa
....
dpkg-source: warning: newly created empty file 'build/lib.linux-x86_64-2.7/neutron/api/__init__.py' will not be represented in diff
(repeats 100500 times for different files).

我该如何重新构建deb包?

看起来我错过了一些清理命令。

4个回答

16

debian/rules 文件实际上是一个 Makefile,根据 Debian 政策,它必须要有一个 clean 目标来清理构建过程。

如果这个目标没有自动运行,你可以使用类似以下的命令显式地调用它:

 dpkg-buildpackage -rfakeroot -Tclean

1
但是 dpkg-buildpackage 已经运行了这个目标,不是吗? - tripleee
我已经完成了这个任务,甚至删除了所有的*.pyc文件和build目录。现在出现了dpkg-source: info: local changes detected, the modified files are: neutron-2013.2.3/neutron.egg-info/entry_points.txt neutron-2013.2.3/neutron.egg-info/requires.txt dpkg-source: info: you can integrate the local changes with dpkg-source --commit ...看起来包已经损坏了。谢谢。 - George Shuklin
据我所知,它应该在启动构建之前(而不是在构建之后)运行“clean”目标。 @tripleee - umläute
@GeorgeShuklin 在这种情况下,很可能软件包已经损坏。你可以通过 git 获取软件包,并确保 git 树干净后再进行重建,这样或许会更顺利。 - umläute
1
没错;但如果它实际上能正常工作,那么OP一开始就不会遇到这个错误,对吧? - tripleee
man dpkg-buildpackage: "如果使用了 -T 或 --target 选项选择了一个或多个特定目标,则调用这些目标并在此处停止。否则,它运行 preclean 钩子,并调用 fakeroot debian/rules clean 来清理构建树(除非指定了 -nc 或 --no-pre-clean)。" - Quasímodo

5
另一种可能性是使用debuild而非直接调用dpkg-buildpackage。最简单的方法是与未签名的源代码和未签名的变更日志一起构建二进制包,转到源代码的debian/目录并执行以下操作:
$ debuild -uc -us

你可以在 debuild 上调用 clean 目标来进行清理。
$ debuild -T clean

命令 debuild clean 似乎需要先加上 -T 标志才能正常工作。它会直接将此标志传递给 dpkg-buildpackage,如错误所示:dpkg-buildpackage -us -uc -ui -sa cleandpkg-buildpackage: error: unknown option or argument clean首先添加 -T 标志即可解决问题:debuild -T clean 将会执行 dpkg-buildpackage -us -uc -ui -sa -T clean,然后显示运行 debian/rulesclean 目标:fakeroot debian/rules clean - TrinitronX

2

debian/rules文件通常会设置清除旧的构建工件,但是您的似乎存在错误,或者缺少此功能。(提交一个错误报告?)

如果没有更多关于您的软件包的了解,这只是一种推测,但请尝试删除build目录。

在最坏的情况下,通过重新解压源代码来重新开始。


很多软件包都是以这种方式损坏的。在这三个通用答案中,只有这个是正确的。另请参见https://utcc.utoronto.ca/~cks/space/blog/linux/DebianSourcePackageBuildExplosion - Quasímodo

1

感谢大家的帮助。

我的问题分成两部分:

  • 未清理的文件(原始软件包没有适当的清理规则)
  • 错误打包的 neutron_2013.2.3.orig.tar.gz,包含 neutron.egg-info(甚至在 GitHub 上的仓库中添加到 .gitignore 中)

因此,在我的情况下,解决方案相当复杂:

  1. 重新打包 neutron_2013.2.3.orig.tar.gz,不包括 neutron.egg-info
  2. 更改 neutron_2013.2.3-0ubuntu1~cloud0.dsc 中的 md5sum/sha1sum/sha256sum 和文件大小
  3. 使用 dpkg-source -x neutron_2013.2.3-0ubuntu1~cloud0.dsc 再次解压源代码
  4. (打补丁/升级版本)
  5. dpkg-buildpackage -sa
  6. 要重新打包,请在 neutron-2013.2.3 中删除以下内容:
    1. rm -r build neutron.egg-info
    2. find . -name "*.py" | xargs rm
  7. dpkg-buildpackage -sa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接