如何使用`pbuilder`构建源代码包以供上传到PPA?

我正在尝试使用 pbuilder 来上传到 PPA。使用以下命令可以成功构建软件包:
sudo pbuilder build <package>_<version>.dsc

但上传失败,出现错误:
Source/binary (i.e. mixed) uploads are not allowed.

据说我需要使用 pdebuild 来构建 源代码包,但是 pdebuild 无法解决构建依赖关系。我该如何构建这个包,以便最终上传?我不想手动安装依赖项。
2个回答

答案是你不需要这样做。pbuilder会将源代码包构建成二进制文件。它还可以接收未构建的源代码,并创建二进制文件,你可以自己托管或添加到自己的Debian软件仓库系统中进行托管。
但这并不适用于PPA。
你想做的事情,也是我强烈推荐的,就是按照传统的打包流程进行操作,并在代码上运行debuild -S命令,将包含源代码、debian/文件夹和其他所有内容的目录放在那里。
然后,在通过debuild -S构建源代码包之后,你可以将创建的.changes文件上传到PPA中的源代码目录的上一级目录中,使用dput命令完成。(关于此步骤,请参考Launchpad的PPA上传帮助文档)。
理论上,你可以使用pdebuilder来保持系统的清洁,并在chroot环境中进行构建,但请继续阅读我的观点,了解为什么之前这种方法对你而言失败了。
根据评论,你正确地指出debhelper无法找到autoreconf插件。
另外,正如我在对这个答案的评论中所说的那样,pbuilder和pdebuilder都不够智能,无法确定debhelper的依赖关系。
为了解决你的问题,使你的东西能够构建,你将不得不手动使用pbuilder或pdebuilder登录到chroot。然后,在登录到chroot后,你将不得不手动安装dh-autoreconf到chroot中,通常使用apt-get install dh-autoreconf命令。
完成上述步骤并保存chroot的状态后,你应该能够使用pbuilder或pdebuilder构建你的软件包。
(然而,我更喜欢传统方式处理软件包,我不在乎我的构建系统是否完全干净,因为我只构建源代码包,而debhelper插件不会对我的系统造成太大的混乱。)

我需要使用pbuilder在不安装任何东西到我的系统上进行干净的构建。如果我只执行debuild -S,它会失败并显示未满足依赖关系的错误消息。pbuilder有一个pdebuild命令,所以我认为它是用来使用chroot中的工具构建源代码包的。 - anatoly techtonik
1@techtonik 这可能是情况,然而,对于您的chroot,您仍然需要安装特定的debhelper软件包。您遇到了哪些具体错误?(在debuild -S期间出现的不满足依赖项表明您有一个特殊的软件包需要额外的debhelper内容,并且通常需要预先构建和上传一些东西供构建器使用,而pdebuilderpbuilder都无法自动处理这个问题,正如您的尝试所示。) - Thomas Ward
我真希望在开始之前知道这个网址:http://askubuntu.com/questions/395584/how-to-build-a-newer-version-of-a-package-than-is-available-for-my-stable-releas。错误日志在http://pastebin.ca/2519158,看起来我需要安装`dh-autoreconf`。我真的希望`pbuilder`不仅仅是一个运行chroot的工具,还可以解决依赖关系。 - anatoly techtonik
最终,你可以登录到你的chroot并强制安装dh-autoreconf,但是chroot与标准的debuild -S相同,在这种程度上,如果它有某些debhelper依赖项,那么这些依赖项必须要么由你自己安装到你的系统中,要么手动安装到chroot中。最终,虽然pdebuilderpbuilder很聪明,但它们并不足够聪明以确定需要安装哪些debhelper依赖项(它们能够读取debian/control中的build-deps行,但这并不决定debhelper的依赖关系)。 - Thomas Ward
最终,据我所知,pbuilderpdebuilder的作用是在chroot环境中运行debuilddebuild -S命令,并且会安装所有构建依赖项,但这与我自己安装构建依赖项后运行debuild(或在安装debhelper相关内容后运行debuild -S)几乎没有区别。无论哪种方式,您都需要阅读日志以找出失败的原因,但最终结果是一样的,您仍然需要提前手动安装debhelper的依赖项,以便源代码包含了构建所需的所有内容。 - Thomas Ward
@techtonik 另外,记住我维护着 nginx 团队的 PPA,除非我忘记了,否则我会保持它相当更新。我经常需要适应这些情况,对于错过你关于这个问题的第一个问题,我表示道歉,但我很高兴至少能在这个问题上帮到你一些。 - Thomas Ward
好的,谢谢。关于pbuilder无法通过自动获取依赖项来构建源代码包的回答很好。我猜这可能无法提供证明链接。 - anatoly techtonik
@techtonik 不完全是这样,但问题在于debhelper的东西有点难以“检测”,因为在pbuilder、sbuild或者其他任何查看软件包自身的构建依赖项之前,它会尝试使用现有的内容来构建源代码包。这就是可能出现问题的地方,也是为什么打包并不像我们希望的那样简单 :/ - Thomas Ward
有关无法检测构建源所需的软件包的错误,在任何地方有详细说明吗?是的,这是另一层间接性,但它使工具对用户更加直观。 - anatoly techtonik
@techtonik 我不知道,我不追踪打包软件的错误。 - Thomas Ward

pbuilder 用于从源代码包构建二进制软件包。PPA也可以从源代码包构建二进制软件包。只需将您创建的source.changes文件使用dput上传,该文件是在您创建<package>_<version>.dsc文件时生成的。

使用pbuilder 的主要目的之一是在本地模拟干净的chroot环境,该环境用于构建官方存档和PPA中的二进制软件包。