我怎样才能让 debhelper 遵守 parallel=n?

我怎样才能让 debhelper 遵守 parallel=n?

我正在尝试为 cmake 项目制作 Debian 软件包,在单线程模式下,编译需要 3 个小时。我尝试进行并行构建,但失败了。

我尝试过设置parallel=4在我的control文件中如下:

#!/usr/bin/make -f
export DEB_BUILD_OPTIONS="parallel=4"

%:
    dh $@ --parallel

根据接受的答案先前这个问题,但我收到以下警告:

dh: warning: invalid flag in DEB_BUILD_OPTIONS: "parallel=4"

并且 debhelper 仍然调用make -j1

我尝试过根据我在网上找到的其他建议/评论对主题进行修改,等等DEB_BUILD_OPTIONS="-j=4"DEB_BUILD_OPTIONS="-j4"但都没有效果。我尝试过设置debian/compat10。结果总是如此invalid flag。我该如何让 debhelper 遵守此设置?

我正在 Ubuntu Focal x86_64 docker 容器中进行构建,我的版本debhelper12.10ubuntu1

答案1

笔记: OP 解决了这个问题,它被记录在他自己的答案。我留下了这个答案,为使用自定义构建步骤的人提供了提示(override_dh_*)。因为他们必须映射变量。

您引用的文档debian/rules 和 DEB_BUILD_OPTIONS,提到它也应该在较低级别进行映射/实现。

以下 makefile 片段是如何实现构建选项的一个示例;您可能需要调整此示例以使其适用于您的软件包。

...
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    MAKEFLAGS += -j$(NUMJOBS)
endif
...

虽然文档给出了一个make示例,但在这种情况下应该使用等效的示例cmake。从另一个包的源或直接从启动板找到模板并不难。

这是来自包本身的一个例子cmake,直接映射内部标志debian/rules(所以仍然是 Makefile 语法):

ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    BOOTSTRAP_FLAGS += --parallel=$(NUMJOBS)
endif

override_dh_auto_configure: $(BUILD_FLAGS_FILE)
        rm -rf Build && mkdir -p Build
        cd Build && ../bootstrap $(BOOTSTRAP_FLAGS)

来源:任何本地源cmake*.tar.xz档案上游 cmake 的每日构建 - Launchpad 项目

答案2

事实证明,我的 Makefile 语法是错误的。

我看到的错误消息来自正则表达式dpkg本身摘录如下:

         unless (/^([a-z][a-z0-9_-]*)(?:=(\S*))?$/) {
             warning(g_('invalid flag in %s: %s'), $source, $_);
             next;
         }

我把这个正则表达式重读了一百万遍,才意识到%s警告中的第二个没有引号,这意味着在错误消息中:

dh: warning: invalid flag in DEB_BUILD_OPTIONS: "parallel=4"

周围的引言"parallel=4"即将到来来自环境变量本身不是来自格式字符串。

解决方法是改变

export DEB_BUILD_OPTIONS="parallel=4"

export DEB_BUILD_OPTIONS = parallel=4

因为在设置环境变量时,make第一个版本会保留引号。当 make 进行字符串插值时,它不会产生任何实际差异,因为引号会被 shell 吃掉,但是当子进程从环境中读取值时,字符"会被保留。

#!/usr/bin/make -f
export WITH_QUOTES="parallel=3"
export WITHOUT_QUOTES = parallel=3

all:
    bash -c 'printf "WITH_QUOTES=%q\n" "$$WITH_QUOTES"'
    bash -c 'printf "WITHOUT_QUOTES=%q\n" "$$WITHOUT_QUOTES"'
bash -c 'printf "WITH_QUOTES=%q\n" "$WITH_QUOTES"'
WITH_QUOTES=\"parallel=3\"
bash -c 'printf "WITHOUT_QUOTES=%q\n" "$WITHOUT_QUOTES"'
WITHOUT_QUOTES=parallel=3

环境变量的实际值既不"parallel=4"触发parallel=4警告,又破坏了dh用于解析它的正则表达式(注意前导 ^):

        if ($opt =~ /^parallel=(-?\d+)$/ && $wanted eq 'parallel') {
            return $1;
        }

相关内容