Debian软件包的创build:binary-arch和binary-indep目标

我正在尝试创build我的第一个deb,所以我现在还不太了解。 这是我目前的“规则”文件:

#!/usr/bin/make -f # Uncomment this to turn on verbose mode. export DH_VERBOSE=1 # This has to be exported to make some magic below work. export DH_OPTIONS %: dh $@ 

目前我正在阅读文档,并试图了解如何编写更复杂的“规则”文件。 我被卡在“二元曲拱”和“二元 – 独立”的目标。 总之,我不明白他们真正代表什么。

文档中说,软件包拱是由“控制”文件中的“架构:”行确定的。

我完全理解这个部分。 但是我开始阅读debhelper工具的man文件。

man dpkg-buildpackage说:

  1. 它调用debian / rules构build,之后是fakeroot debian / rules二进制目标(除非只有源代码版本需要使用-S)。 请注意,二进制目标是二进制(默认情况下,或者如果指定-b)或二进制拱形(如果指定-B)或二进制indep(如果指定-A)

男人说:

在binary-indep序列中的命令被传递“-i”选项以确保它们仅在二进制独立包上工作,并且在二进制序列中的命令被传递“-a”选项以确保它们仅在体系结构相关的包上工作。

然后我尝试通过键入来查看“binary”,“binary-arch”和“binary-indep”目标的默认命令集

 $ dh binary --no-act $ dh binary-arch --no-act $ dh binary-indep --no-act 

并获得完全平等的命令集。 每个命令之后唯一的区别是'-i'和'-a'标志。

所以第一个问题是 – 例如“dh_auto_build”,“dh_auto_build -a”和“dh_auto_build -i”(或其他一些dh_command)有什么区别?

另一个问题是 – 如果我的“控制”文件只包含“全部”体系结构的包,我是否需要使用binary-indep目标,或者我可以不使用它,只在我的“规则”文件中使用build-arch目标?

区别

目标binary-indep构build源代码包中的所有Architecture: all二进制包。 目标binary-arch构build所有其他包,可以是Architecture: any或具有显式架构列表的包,也可以是Architecture: linux-any等架构通配符。

为什么?

构build过程中的这两个path的区别是相关的,如果您有一个包含两种types的二进制包,依赖于架构和独立的源包:包的初始构build构build这两种types的二进制包,但每个后续构build在不同的体系结构中,只需要构build依赖于体系结构的二进制包,因为在第一个构build中已经构build了所有与体系结构无关的包。

假设你有一个名为foo的源码包,它构build了二进制包foo-programsfoo-data 。 虽然foo-programs程序中foo-programs需要编译(例如因为用C语言编写),因此二进制包是Architecture: anyfoo-data (图像,翻译,帮助文本,文档,纹理,游戏地图等)对于所有架构都是一样的,因此它是Architecture: all 。 假设foo的上游版本是1.0,这是上游版本的第一个Debian软件包版本。

首先在64位个人电脑的amd64架构上构build所有包,您将获得foo-programs_1.0-1_amd64.debfoo-data_1.0-1_all.deb 。 但是你也希望能够在32位电脑上运行,所以你也需要foo-programs_1.0-1_i386.deb 。 但是你不需要第二个foo-data_1.0-1_all.deb ,所以你的构build过程只需要*-arch目标,例如调用dpkg-buildpackage -B

明确目标的必要性

由于许多上游构build系统并没有做出这种区分,但是如果他们这样做(例如通过单独make目标文件,你可以实现这个目标)像这样:

 #!/usr/bin/make -f %: dh $@ override_dh_auto_build-indep: $(MAKE) -C docs 

(从dh(7)手册页取得的例子)