我正在尝试为 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/compat
为10
。结果总是如此invalid flag
。我该如何让 debhelper 遵守此设置?
我正在 Ubuntu Focal x86_64 docker 容器中进行构建,我的版本debhelper
是12.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;
}