debuild - 是否可以通过编译一个 Makefile 的 debuild 来构建多个 debian 软件包

debuild - Is it possible to build several debian packages by debuild that compile one Makefile

我使用 debuild 创建 debian 包。

In file "debian/control" is described two packages:
Package: app1
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Tool1.

Package: app2
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Tool2.

它们都应该包含由一个 makefile 编译但具有不同环境变量的相同二进制文件。

我的规则文件调用了两次编译:

%:
    TARGET=S_SS dh $@ -papp1
    TARGET=S_TT dh $@ -papp2

接下来是 debuild 阶段的结果流:

dh clean -papp1
dh clean -papp2
dh build -papp1
dh build -papp2
dh binary -papp1
dh binary -papp2

看起来数据包是并行创建的。最后二进制文件被第二个构建覆盖。

是否可以通过先创建 app1 而不是 app2 的方式创建规则文件:

dh clean -papp1
dh build -papp1
dh binary -papp1
dh clean -papp2
dh build -papp2
dh binary -papp2

回答您的问题:,无法更改构建包的基本顺序。

dh-sequencer 将运行分阶段构建过程,例如(非常简化

  • 清洁
  • 建设

在您当前的设置中,“构建”阶段将 运行 两个构建(针对您的两种风格),一旦两个构建都完成,它将进入下一阶段,打包所有工件进入负债。

现在,不幸的是,您的第二个构建只会覆盖您的第一个构建(或者它会检测到它已经有二进制文件(不考虑更改的环境变量)并且根本不会重新构建)。 这主要是上游源构建系统的问题(即:您的构建系统),而不是 Debian 软件包工具集。

为了正确构建包的多种风格,构建系统应该(真的)支持树外构建,您可以在 subdir1/ 中为一种风格构建所有二进制文件,并为subdir2/ 中的另一种风格,因此两个构建不会干扰。

然后您需要(手动!)指示 dh 使用正确的标志调用您的构建系统以使用这些子目录(显然还有不同的配置)。

可以在 here.

中找到使用 dh 从相同来源构建多种风格的 Debian 软件包的真实示例(免责声明:由我自己维护)

上游构建系统使用autotools(原生支持树外构建),风格通过不同的配置标志来区分。

要点是这样的:

#!/usr/bin/make -f
builddir=debian/build/flavor-
FLAVOURS = foo bar
CONFIG_foo = --some-flag
CONFIG_bar = --some-other-flag

%:
        dh $@

# this target depends on 'configure_foo' and 'configure_bar'
override_dh_auto_configure: $(patsubst %,configure_%,$(FLAVORS))
# 'configure_%' is expanded to 'configure_foo' and 'configure_bar'
# the '$*' is replaced with the '%' component of the target ('foo', 'bar')
# so there are different builddirs ('debian/build/flavor-foo', 'debian/build/flavor-bar')
# and we call `configure`-script (relative to the builddir) with the appropriate flag
configure_%:
        mkdir -p $(builddir)$*
        cd $(builddir)$* && ../../../configure $(CONFIG_$*)

# same for the build-stage; this is simpler as we only need to run 'make' in the
# various builddirs
override_dh_auto_build: $(patsubst %,build_%,$(FLAVORS))
build_%:
    dh_auto_build --sourcedirectory=$(builddir)$*