Ubuntu源代码包的依赖树

我有一些软件包。我们称它们为 A.debB.debC.deb。每个软件包都有对应的源代码软件包 A.dscA.tar.gzB.dscB.tar.gzC.dscC.tar.gz。这些软件包彼此依赖: C.deb 依赖于 B.deb,而 B.deb 依赖于 A.deb
如果我修改了 A.deb,我需要重新构建 B.deb,否则它将无法正常工作。同样,对于 B.debC.deb 也是如此。有没有办法自动化这个过程?也许有一个工具或脚本可以帮我完成吗?如果没有,我该如何自动化这个过程呢?
另外,这些软件包不是我的。

2你说的是"C.deb依赖于B.deb,而B.deb又依赖于A.deb",所以我猜你指的是二进制包?此外,你是在提到将B编译为A中的外部库吗?如果是这样的话,实际上不应该需要重新构建包,前提是A的开发者没有更改该库的接口(因此这取决于A的维护者,而不是B的维护者;如果你是它们的开发者,那么尽量使A的实现与其接口无关,以确保最大程度的兼容性)。 - kos
我之前一直在寻找这样的东西,但是一无所获。所以如果有这样的东西存在,他们会用它来进行PPA。即使有ppa,每天构建也只会在源代码更新时自动运行。我找不到关于Ubuntu的参考资料,但Debian有一个叫做AutoBuild的东西,它只构建新上传的软件包(自身而非其依赖项)到多个架构上。看起来还是需要手动操作。A/维护者不应该在同一个版本上进行重大升级,C/维护者应该密切关注上传邮件列表或软件包跟踪器。 - user.dz
如果实施这个想法,我认为它会消耗大量的资源。在新上传gcc或libc时,系统将不得不重新构建几乎所有的软件包(一种链式反应)。 - user.dz
1我在Linux上不做这个级别的工作,但我认为这就是make被发明出来的原因。一个makefile包含了规则,根据变化来确定需要重新编译/重建的内容。 - Joe
@Sneetsher 是的,我也这么认为,尽管它需要很多资源,但我还是想去做。 - xiaodongjie
@Joe 只是在源代码包中工作,无法在外部工作。 - xiaodongjie
我对make并不是很了解,但我印象中你可以定义规则来做几乎任何事情 - 不仅仅是运行编译。我敢打赌,只要知道怎么做,就可以配置规则来构建一个deb包或者其他任何东西。 - Joe
我认为可以通过make的函数来实现。Makefile的子目标将是二进制包,条件将是源代码包和二进制包。命令行将使用pbuilder或dpkg-buildpackage、debuild等工具。这样可行吗? - xiaodongjie
1@xiaodongjie - 你是一个亲爱的人,提出了一个亲切的问题 - 所以你已经知道Bash和Bash脚本了吗?--->这样你可以编写一个带有switch-case循环的小脚本,然后像在电梯中一样,在不同的情况下构建对软件包的操作。这不是我的脚本。你聪明就像我们聪明一样-笑一笑吧。- 当然,这个脚本可以设置为守护进程(自动工作)。 - dschinn1001
1@Joe说:使用make,就像你自己说的那样,@xiaodongjie,make目标将是生成的软件包,其中声明了它们之间的依赖关系,并且每个目标关联的操作将是生成该软件包的命令。安装make-doc并输入info make来详细了解。 - Ralph Rönnquist
1创建一个别名来进行构建过程怎么样? - Wilhelm Erasmus
也许这是可能的,我认为这是最好的方式。我想知道如何创建脚本? - xiaodongjie
2个回答

你可以使用一个包含构建依赖声明的Makefile,例如如下所示:
default: A.deb B.deb C.deb

C.deb: B.deb C.dsc C.tar.gz
        <command(s) to build C.deb>

B.deb: A.deb B.dsc B.tar.gz
        <command(s) to build B.deb>

A.deb: A.dsc A.tar.gz
        <command(s) to build A.deb>

请注意,命令缩进是一个制表符。
有了那个Makefile,你可以使用以下命令。
make

这将根据文件的时间戳确定要构建的软件包及其顺序,然后进行构建。例如,如果说B.tar.gz的时间戳晚于B.deb(即软件包B有新的源代码),那么首先会重新构建B.deb,由于它的时间戳晚于C.deb,这将导致C.deb也被重新构建。

嗯,也许我完全没有理解你的观点,但听起来像是你想重新编译软件包A并希望重新编译软件包B和C,对此我会简单地使用一个makefile


你能详细解释一下吗? - xiaodongjie
or any example. - xiaodongjie