Package: dpkg Version: 1.21.7 Severity: minor Tags: patch /usr/share/dpkg/architecture.mk sets up variables in a way so that every single variable out of 33 DEB_{HOST,..}_{ARCH,..} total is set separately by its own call to dpkg-architecture if it is not already defined.
On my (not slow at all) system, just including architecture.mk and doing a trivial echo command for a target, takes really significant time. ============== For this makefile: ============== ifeq ($A,1) # slow version include /usr/share/dpkg/architecture.mk else $(foreach d, $(shell dpkg-architecture | sed 's/=/?=/'), $(eval export $d)) endif tst: echo ${DEB_HOST_MULTIARCH} ================================================= $ time make A=0 echo x86_64-linux-gnu x86_64-linux-gnu real 0m0,078s user 0m0,059s sys 0m0,021s $ time make A=1 echo x86_64-linux-gnu x86_64-linux-gnu real 0m2,222s user 0m2,005s sys 0m0,228s So the time required to run simple echo command is reduced from 2.2s to almost non-existent 0.078s when replacing architecture.mk with its one-shot equivalent. This is huge. And this is where actual time is important: you run ./d/rules manually to debug build issues, when none of the DEB_*_* variables are set, and each 2s delay before any first command is run is really annoying. Please consider applying the attached patch which first checks if any of the DEB_*_* variables are not set (the big if()), and if any is not set, it executes dpkg-architecture *once*, and sets all missing variables (which are not already set) in one go. /mjt --- scripts/mk/architecture.mk.orig 2022-03-26 20:17:59.000000000 +0300 +++ scripts/mk/architecture.mk 2022-04-12 19:00:23.588642919 +0300 @@ -2,10 +2,21 @@ # DEB_BUILD_* variables that dpkg-architecture can return. Existing values # of those variables are preserved as per policy. +# preserve the following define for compatibiluty? dpkg_lazy_eval ?= $$(or $$(value DPKG_CACHE_$(1)),$$(eval DPKG_CACHE_$(1) := $$(shell $(2)))$$(value DPKG_CACHE_$(1))) -dpkg_architecture_setvar = export $(1) ?= $(call dpkg_lazy_eval,$(1),dpkg-architecture -q$(1)) +# if at least one of $DEB_{HOST,..}_{ARCH,..} is not set, ... +ifneq \ +(,$(strip \ + $(foreach p, HOST BUILD TARGET, \ + $(foreach s, ARCH ARCH_ABI ARCH_LIBC ARCH_OS ARCH_CPU ARCH_BITS \ + ARCH_ENDIAN GNU_CPU GNU_SYSTEM GNU_TYPE MULTIARCH, \ + $(if ${DEB_$p_$s},,$p_$s) \ + )\ + )\ +)) -$(foreach machine,BUILD HOST TARGET,\ - $(foreach var,ARCH ARCH_ABI ARCH_LIBC ARCH_OS ARCH_CPU ARCH_BITS ARCH_ENDIAN GNU_CPU GNU_SYSTEM GNU_TYPE MULTIARCH,\ - $(eval $(call dpkg_architecture_setvar,DEB_$(machine)_$(var))))) +# ... set the missing ones from dpkg-architecture + $(foreach d, $(shell dpkg-architecture | sed 's/=/?=/'), $(eval export $d)) + +endif