The attached version
fixes the spacing issue in tests with a more readable trick,
splits the changes inside tests into small chunks,
replaces - with _ in Make variable names,
avoids non portable -r -E sed options.

Without -r, sed in {buildflags,pkg-info}.mk should cause no
regression.  It has been present in pkg-info.mk since 2011.
>From 5b3d75fb604dae497406f19073d03ea094da8d07 Mon Sep 17 00:00:00 2001
From: Nicolas Boulenguez <nico...@debian.org>
Date: Wed, 10 Apr 2024 00:41:42 +0200
Subject: [PATCH 01/10] scripts/t/mk/buildflags.mk: fix test of _MAINT_APPEND
 when TEST_ is empty

When TEST_CPPFLAGS is empty, the right hand side of the comparison
starts with a space character.
---
 scripts/t/mk/buildflags.mk | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/scripts/t/mk/buildflags.mk b/scripts/t/mk/buildflags.mk
index 94d85a7e0..7cf798f73 100644
--- a/scripts/t/mk/buildflags.mk
+++ b/scripts/t/mk/buildflags.mk
@@ -1,5 +1,8 @@
 DEB_CPPFLAGS_MAINT_APPEND = -DTEST_MK=test-host
+TEST_CPPFLAGS            += -DTEST_MK=test-host
+
 DEB_CPPFLAGS_FOR_BUILD_MAINT_APPEND = -DTEST_MK=test-build
+TEST_CPPFLAGS_FOR_BUILD            += -DTEST_MK=test-build
 
 include $(srcdir)/mk/buildflags.mk
 
@@ -8,8 +11,8 @@ test:
 	test "$(ASFLAGS_FOR_BUILD)" = "$(TEST_ASFLAGS_FOR_BUILD)"
 	test "$(CFLAGS)" = "$(TEST_CFLAGS)"
 	test "$(CFLAGS_FOR_BUILD)" = "$(TEST_CFLAGS_FOR_BUILD)"
-	test "$(CPPFLAGS)" = "$(TEST_CPPFLAGS) -DTEST_MK=test-host"
-	test "$(CPPFLAGS_FOR_BUILD)" = "$(TEST_CPPFLAGS_FOR_BUILD)-DTEST_MK=test-build"
+	test "$(CPPFLAGS)" = "$(TEST_CPPFLAGS)"
+	test "$(CPPFLAGS_FOR_BUILD)" = "$(TEST_CXXFLAGS_FOR_BUILD)"
 	test "$(CXXFLAGS)" = "$(TEST_CXXFLAGS)"
 	test "$(CXXFLAGS_FOR_BUILD)" = "$(TEST_CXXFLAGS_FOR_BUILD)"
 	test "$(DFLAGS)" = "$(TEST_DFLAGS)"
-- 
2.39.2

>From 53aeebafeb2af84369df3b7d81ff1cbcc1e13a9d Mon Sep 17 00:00:00 2001
From: Nicolas Boulenguez <nico...@debian.org>
Date: Wed, 10 Apr 2024 00:09:43 +0200
Subject: [PATCH 02/10] scripts/t/mk: use loops instead of repetitions

---
 scripts/t/mk/architecture.mk | 54 +++++++++++++-----------------------
 scripts/t/mk/buildflags.mk   | 39 ++++++++++++--------------
 scripts/t/mk/buildtools.mk   | 54 +++++++++++++++---------------------
 3 files changed, 61 insertions(+), 86 deletions(-)

diff --git a/scripts/t/mk/architecture.mk b/scripts/t/mk/architecture.mk
index 2ac0222ca..b146f34b7 100644
--- a/scripts/t/mk/architecture.mk
+++ b/scripts/t/mk/architecture.mk
@@ -1,36 +1,22 @@
 include $(srcdir)/mk/architecture.mk
 
-test:
-	test "$(DEB_BUILD_ARCH)" = "$(TEST_DEB_BUILD_ARCH)"
-	test "$(DEB_BUILD_ARCH_ABI)" = "$(TEST_DEB_BUILD_ARCH_ABI)"
-	test "$(DEB_BUILD_ARCH_BITS)" = "$(TEST_DEB_BUILD_ARCH_BITS)"
-	test "$(DEB_BUILD_ARCH_CPU)" = "$(TEST_DEB_BUILD_ARCH_CPU)"
-	test "$(DEB_BUILD_ARCH_ENDIAN)" = "$(TEST_DEB_BUILD_ARCH_ENDIAN)"
-	test "$(DEB_BUILD_ARCH_LIBC)" = "$(TEST_DEB_BUILD_ARCH_LIBC)"
-	test "$(DEB_BUILD_ARCH_OS)" = "$(TEST_DEB_BUILD_ARCH_OS)"
-	test "$(DEB_BUILD_GNU_CPU)" = "$(TEST_DEB_BUILD_GNU_CPU)"
-	test "$(DEB_BUILD_GNU_SYSTEM)" = "$(TEST_DEB_BUILD_GNU_SYSTEM)"
-	test "$(DEB_BUILD_GNU_TYPE)" = "$(TEST_DEB_BUILD_GNU_TYPE)"
-	test "$(DEB_BUILD_MULTIARCH)" = "$(TEST_DEB_BUILD_MULTIARCH)"
-	test "$(DEB_HOST_ARCH)" = "$(TEST_DEB_HOST_ARCH)"
-	test "$(DEB_HOST_ARCH_ABI)" = "$(TEST_DEB_HOST_ARCH_ABI)"
-	test "$(DEB_HOST_ARCH_BITS)" = "$(TEST_DEB_HOST_ARCH_BITS)"
-	test "$(DEB_HOST_ARCH_CPU)" = "$(TEST_DEB_HOST_ARCH_CPU)"
-	test "$(DEB_HOST_ARCH_ENDIAN)" = "$(TEST_DEB_HOST_ARCH_ENDIAN)"
-	test "$(DEB_HOST_ARCH_LIBC)" = "$(TEST_DEB_HOST_ARCH_LIBC)"
-	test "$(DEB_HOST_ARCH_OS)" = "$(TEST_DEB_HOST_ARCH_OS)"
-	test "$(DEB_HOST_GNU_CPU)" = "$(TEST_DEB_HOST_GNU_CPU)"
-	test "$(DEB_HOST_GNU_SYSTEM)" = "$(TEST_DEB_HOST_GNU_SYSTEM)"
-	test "$(DEB_HOST_GNU_TYPE)" = "$(TEST_DEB_HOST_GNU_TYPE)"
-	test "$(DEB_HOST_MULTIARCH)" = "$(TEST_DEB_HOST_MULTIARCH)"
-	test "$(DEB_TARGET_ARCH)" = "$(TEST_DEB_TARGET_ARCH)"
-	test "$(DEB_TARGET_ARCH_ABI)" = "$(TEST_DEB_TARGET_ARCH_ABI)"
-	test "$(DEB_TARGET_ARCH_BITS)" = "$(TEST_DEB_TARGET_ARCH_BITS)"
-	test "$(DEB_TARGET_ARCH_CPU)" = "$(TEST_DEB_TARGET_ARCH_CPU)"
-	test "$(DEB_TARGET_ARCH_ENDIAN)" = "$(TEST_DEB_TARGET_ARCH_ENDIAN)"
-	test "$(DEB_TARGET_ARCH_LIBC)" = "$(TEST_DEB_TARGET_ARCH_LIBC)"
-	test "$(DEB_TARGET_ARCH_OS)" = "$(TEST_DEB_TARGET_ARCH_OS)"
-	test "$(DEB_TARGET_GNU_CPU)" = "$(TEST_DEB_TARGET_GNU_CPU)"
-	test "$(DEB_TARGET_GNU_SYSTEM)" = "$(TEST_DEB_TARGET_GNU_SYSTEM)"
-	test "$(DEB_TARGET_GNU_TYPE)" = "$(TEST_DEB_TARGET_GNU_TYPE)"
-	test "$(DEB_TARGET_MULTIARCH)" = "$(TEST_DEB_TARGET_MULTIARCH)"
+vars := \
+  ARCH \
+  ARCH_ABI \
+  ARCH_BITS \
+  ARCH_CPU \
+  ARCH_ENDIAN \
+  ARCH_LIBC \
+  ARCH_OS \
+  GNU_CPU \
+  GNU_SYSTEM \
+  GNU_TYPE \
+  MULTIARCH \
+  # EOL
+loop_targets := $(foreach machine,BUILD HOST TARGET,$(foreach var,$(vars),\
+  DEB_$(machine)_$(var)))
+
+test: $(loop_targets)
+
+$(loop_targets):
+	test "$($@)" = "$(TEST_$@)"
diff --git a/scripts/t/mk/buildflags.mk b/scripts/t/mk/buildflags.mk
index 7cf798f73..3289a7557 100644
--- a/scripts/t/mk/buildflags.mk
+++ b/scripts/t/mk/buildflags.mk
@@ -6,24 +6,21 @@ TEST_CPPFLAGS_FOR_BUILD            += -DTEST_MK=test-build
 
 include $(srcdir)/mk/buildflags.mk
 
-test:
-	test "$(ASFLAGS)" = "$(TEST_ASFLAGS)"
-	test "$(ASFLAGS_FOR_BUILD)" = "$(TEST_ASFLAGS_FOR_BUILD)"
-	test "$(CFLAGS)" = "$(TEST_CFLAGS)"
-	test "$(CFLAGS_FOR_BUILD)" = "$(TEST_CFLAGS_FOR_BUILD)"
-	test "$(CPPFLAGS)" = "$(TEST_CPPFLAGS)"
-	test "$(CPPFLAGS_FOR_BUILD)" = "$(TEST_CXXFLAGS_FOR_BUILD)"
-	test "$(CXXFLAGS)" = "$(TEST_CXXFLAGS)"
-	test "$(CXXFLAGS_FOR_BUILD)" = "$(TEST_CXXFLAGS_FOR_BUILD)"
-	test "$(DFLAGS)" = "$(TEST_DFLAGS)"
-	test "$(DFLAGS_FOR_BUILD)" = "$(TEST_DFLAGS_FOR_BUILD)"
-	test "$(FCFLAGS)" = "$(TEST_FCFLAGS)"
-	test "$(FCFLAGS_FOR_BUILD)" = "$(TEST_FCFLAGS_FOR_BUILD)"
-	test "$(FFLAGS)" = "$(TEST_FFLAGS)"
-	test "$(FFLAGS_FOR_BUILD)" = "$(TEST_FFLAGS_FOR_BUILD)"
-	test "$(LDFLAGS)" = "$(TEST_LDFLAGS)"
-	test "$(LDFLAGS_FOR_BUILD)" = "$(TEST_LDFLAGS_FOR_BUILD)"
-	test "$(OBJCFLAGS)" = "$(TEST_OBJCFLAGS)"
-	test "$(OBJCFLAGS_FOR_BUILD)" = "$(TEST_OBJCFLAGS_FOR_BUILD)"
-	test "$(OBJCXXFLAGS)" = "$(TEST_OBJCXXFLAGS)"
-	test "$(OBJCXXFLAGS_FOR_BUILD)" = "$(TEST_OBJCXXFLAGS_FOR_BUILD)"
+vars := \
+  ASFLAGS \
+  CFLAGS \
+  CPPFLAGS \
+  CXXFLAGS \
+  DFLAGS \
+  FCFLAGS \
+  FFLAGS \
+  LDFLAGS \
+  OBJCFLAGS \
+  OBJCXXFLAGS \
+  # EOL
+loop_targets := $(vars) $(vars:=_FOR_BUILD)
+
+test: $(loop_targets)
+
+$(loop_targets):
+	test "$($@)" = "$(TEST_$@)"
diff --git a/scripts/t/mk/buildtools.mk b/scripts/t/mk/buildtools.mk
index 6c27c5cf2..c104ef62e 100644
--- a/scripts/t/mk/buildtools.mk
+++ b/scripts/t/mk/buildtools.mk
@@ -1,33 +1,25 @@
 include $(srcdir)/mk/buildtools.mk
 
-test:
-	test "$(AS)" = "$(TEST_AS)"
-	test "$(AS_FOR_BUILD)" = "$(TEST_AS_FOR_BUILD)"
-	test "$(CC)" = "$(TEST_CC)"
-	test "$(CC_FOR_BUILD)" = "$(TEST_CC_FOR_BUILD)"
-	test "$(CXX)" = "$(TEST_CXX)"
-	test "$(CXX_FOR_BUILD)" = "$(TEST_CXX_FOR_BUILD)"
-	test "$(OBJC)" = "$(TEST_OBJC)"
-	test "$(OBJC_FOR_BUILD)" = "$(TEST_OBJC_FOR_BUILD)"
-	test "$(OBJCXX)" = "$(TEST_OBJCXX)"
-	test "$(OBJCXX_FOR_BUILD)" = "$(TEST_OBJCXX_FOR_BUILD)"
-	test "$(F77)" = "$(TEST_F77)"
-	test "$(F77_FOR_BUILD)" = "$(TEST_F77_FOR_BUILD)"
-	test "$(FC)" = "$(TEST_FC)"
-	test "$(FC_FOR_BUILD)" = "$(TEST_FC_FOR_BUILD)"
-	test "$(LD)" = "$(TEST_LD)"
-	test "$(LD_FOR_BUILD)" = "$(TEST_LD_FOR_BUILD)"
-	test "$(STRIP)" = "$(TEST_STRIP)"
-	test "$(STRIP_FOR_BUILD)" = "$(TEST_STRIP_FOR_BUILD)"
-	test "$(OBJCOPY)" = "$(TEST_OBJCOPY)"
-	test "$(OBJCOPY_FOR_BUILD)" = "$(TEST_OBJCOPY_FOR_BUILD)"
-	test "$(OBJDUMP)" = "$(TEST_OBJDUMP)"
-	test "$(OBJDUMP_FOR_BUILD)" = "$(TEST_OBJDUMP_FOR_BUILD)"
-	test "$(NM)" = "$(TEST_NM)"
-	test "$(NM_FOR_BUILD)" = "$(TEST_NM_FOR_BUILD)"
-	test "$(AR)" = "$(TEST_AR)"
-	test "$(AR_FOR_BUILD)" = "$(TEST_AR_FOR_BUILD)"
-	test "$(RANLIB)" = "$(TEST_RANLIB)"
-	test "$(RANLIB_FOR_BUILD)" = "$(TEST_RANLIB_FOR_BUILD)"
-	test "$(PKG_CONFIG)" = "$(TEST_PKG_CONFIG)"
-	test "$(PKG_CONFIG_FOR_BUILD)" = "$(TEST_PKG_CONFIG_FOR_BUILD)"
+tools := \
+  AR \
+  AS \
+  CC \
+  CXX \
+  F77 \
+  FC \
+  LD \
+  NM \
+  OBJC \
+  OBJCOPY \
+  OBJCXX \
+  OBJDUMP \
+  PKG_CONFIG \
+  RANLIB \
+  STRIP \
+  # EOL
+loop_targets := $(tools) $(tools:=_FOR_BUILD)
+
+test: $(loop_targets)
+
+$(loop_targets):
+	test "$($@)" = "$(TEST_$@)"
-- 
2.39.2

>From 13e165388b6f9fe70252adbb4a2ee0cf5ccdbb86 Mon Sep 17 00:00:00 2001
From: Nicolas Boulenguez <nico...@debian.org>
Date: Wed, 10 Apr 2024 00:27:16 +0200
Subject: [PATCH 03/10] scripts/t/mk: replace double quotes with single quote
 in shell recipes

This escapes more characters for the shell, and makes the intent of
the dollar character more explicit.
---
 scripts/t/mk/architecture.mk | 2 +-
 scripts/t/mk/buildflags.mk   | 2 +-
 scripts/t/mk/buildtools.mk   | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/scripts/t/mk/architecture.mk b/scripts/t/mk/architecture.mk
index b146f34b7..b181d3426 100644
--- a/scripts/t/mk/architecture.mk
+++ b/scripts/t/mk/architecture.mk
@@ -19,4 +19,4 @@ loop_targets := $(foreach machine,BUILD HOST TARGET,$(foreach var,$(vars),\
 test: $(loop_targets)
 
 $(loop_targets):
-	test "$($@)" = "$(TEST_$@)"
+	test '$($@)' = '$(TEST_$@)'
diff --git a/scripts/t/mk/buildflags.mk b/scripts/t/mk/buildflags.mk
index 3289a7557..042ba816f 100644
--- a/scripts/t/mk/buildflags.mk
+++ b/scripts/t/mk/buildflags.mk
@@ -23,4 +23,4 @@ loop_targets := $(vars) $(vars:=_FOR_BUILD)
 test: $(loop_targets)
 
 $(loop_targets):
-	test "$($@)" = "$(TEST_$@)"
+	test '$($@)' = '$(TEST_$@)'
diff --git a/scripts/t/mk/buildtools.mk b/scripts/t/mk/buildtools.mk
index c104ef62e..2b935ebb1 100644
--- a/scripts/t/mk/buildtools.mk
+++ b/scripts/t/mk/buildtools.mk
@@ -22,4 +22,4 @@ loop_targets := $(tools) $(tools:=_FOR_BUILD)
 test: $(loop_targets)
 
 $(loop_targets):
-	test "$($@)" = "$(TEST_$@)"
+	test '$($@)' = '$(TEST_$@)'
-- 
2.39.2

>From e78ba6e05c1ca6dda8f003328f051c6726923c8a Mon Sep 17 00:00:00 2001
From: Nicolas Boulenguez <nico...@debian.org>
Date: Wed, 10 Apr 2024 00:14:27 +0200
Subject: [PATCH 04/10] scripts/t/mk: test exported variables in addition to
 Make variables

---
 scripts/t/mk/architecture.mk | 3 +++
 scripts/t/mk/buildflags.mk   | 5 +++++
 scripts/t/mk/buildtools.mk   | 5 +++++
 3 files changed, 13 insertions(+)

diff --git a/scripts/t/mk/architecture.mk b/scripts/t/mk/architecture.mk
index b181d3426..538f80b48 100644
--- a/scripts/t/mk/architecture.mk
+++ b/scripts/t/mk/architecture.mk
@@ -19,4 +19,7 @@ loop_targets := $(foreach machine,BUILD HOST TARGET,$(foreach var,$(vars),\
 test: $(loop_targets)
 
 $(loop_targets):
+  # Test the Make variable.
 	test '$($@)' = '$(TEST_$@)'
+  # Test the exported variable.
+	test "$${$@}" = '$(TEST_$@)'
diff --git a/scripts/t/mk/buildflags.mk b/scripts/t/mk/buildflags.mk
index 042ba816f..b43a7dbcf 100644
--- a/scripts/t/mk/buildflags.mk
+++ b/scripts/t/mk/buildflags.mk
@@ -4,6 +4,8 @@ TEST_CPPFLAGS            += -DTEST_MK=test-host
 DEB_CPPFLAGS_FOR_BUILD_MAINT_APPEND = -DTEST_MK=test-build
 TEST_CPPFLAGS_FOR_BUILD            += -DTEST_MK=test-build
 
+DPKG_EXPORT_BUILDFLAGS := 1
+
 include $(srcdir)/mk/buildflags.mk
 
 vars := \
@@ -23,4 +25,7 @@ loop_targets := $(vars) $(vars:=_FOR_BUILD)
 test: $(loop_targets)
 
 $(loop_targets):
+  # Test the Make variable.
 	test '$($@)' = '$(TEST_$@)'
+  # Test the exported variable.
+	test "$${$@}" = '$(TEST_$@)'
diff --git a/scripts/t/mk/buildtools.mk b/scripts/t/mk/buildtools.mk
index 2b935ebb1..de2b52b59 100644
--- a/scripts/t/mk/buildtools.mk
+++ b/scripts/t/mk/buildtools.mk
@@ -1,3 +1,5 @@
+DPKG_EXPORT_BUILDTOOLS := 1
+
 include $(srcdir)/mk/buildtools.mk
 
 tools := \
@@ -22,4 +24,7 @@ loop_targets := $(tools) $(tools:=_FOR_BUILD)
 test: $(loop_targets)
 
 $(loop_targets):
+  # Test the Make variable.
 	test '$($@)' = '$(TEST_$@)'
+  # Test the exported variable.
+	test "$${$@}" = '$(TEST_$@)'
-- 
2.39.2

>From 4306db0c0e39f5c11e2dbe93d522c5effcfeb4b2 Mon Sep 17 00:00:00 2001
From: Nicolas Boulenguez <nico...@debian.org>
Date: Wed, 10 Apr 2024 00:16:20 +0200
Subject: [PATCH 05/10] scripts/t/mk/architecture.mk: test variable override

---
 scripts/t/mk/architecture.mk | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/scripts/t/mk/architecture.mk b/scripts/t/mk/architecture.mk
index 538f80b48..56963ff1d 100644
--- a/scripts/t/mk/architecture.mk
+++ b/scripts/t/mk/architecture.mk
@@ -1,3 +1,6 @@
+DEB_BUILD_ARCH      := overridden
+TEST_DEB_BUILD_ARCH := overridden
+
 include $(srcdir)/mk/architecture.mk
 
 vars := \
-- 
2.39.2

>From 9ce23dac430c250b557b928ce741fb638d5ce045 Mon Sep 17 00:00:00 2001
From: Nicolas Boulenguez <nico...@debian.org>
Date: Wed, 10 Apr 2024 00:20:42 +0200
Subject: [PATCH 06/10] scripts/t/mk/buildflags.mk: test DEB_CXXFLAGS_MAINT_SET

---
 scripts/t/mk/buildflags.mk | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/scripts/t/mk/buildflags.mk b/scripts/t/mk/buildflags.mk
index b43a7dbcf..168fdd6bc 100644
--- a/scripts/t/mk/buildflags.mk
+++ b/scripts/t/mk/buildflags.mk
@@ -4,6 +4,12 @@ TEST_CPPFLAGS            += -DTEST_MK=test-host
 DEB_CPPFLAGS_FOR_BUILD_MAINT_APPEND = -DTEST_MK=test-build
 TEST_CPPFLAGS_FOR_BUILD            += -DTEST_MK=test-build
 
+DEB_CXXFLAGS_MAINT_SET := set-host
+TEST_CXXFLAGS          := set-host
+
+DEB_CXXFLAGS_FOR_BUILD_MAINT_SET := set-build
+TEST_CXXFLAGS_FOR_BUILD          := set-build
+
 DPKG_EXPORT_BUILDFLAGS := 1
 
 include $(srcdir)/mk/buildflags.mk
-- 
2.39.2

>From b734bd99b2467170a9b7a99f002eba6d8d9ba521 Mon Sep 17 00:00:00 2001
From: Nicolas Boulenguez <nico...@debian.org>
Date: Wed, 10 Apr 2024 00:21:58 +0200
Subject: [PATCH 07/10] scripts/t/mk/buildtools.mk: add missing test for CPP

---
 scripts/t/mk/buildtools.mk | 1 +
 1 file changed, 1 insertion(+)

diff --git a/scripts/t/mk/buildtools.mk b/scripts/t/mk/buildtools.mk
index de2b52b59..3b758f8ba 100644
--- a/scripts/t/mk/buildtools.mk
+++ b/scripts/t/mk/buildtools.mk
@@ -6,6 +6,7 @@ tools := \
   AR \
   AS \
   CC \
+  CPP \
   CXX \
   F77 \
   FC \
-- 
2.39.2

>From d68d0e338febb0c54fdb90313b222a46345127f5 Mon Sep 17 00:00:00 2001
From: Nicolas Boulenguez <nico...@debian.org>
Date: Wed, 10 Apr 2024 00:23:19 +0200
Subject: [PATCH 08/10] scripts/t/mk/buildtools.mk: test override of a tool

---
 scripts/t/mk/buildtools.mk | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/scripts/t/mk/buildtools.mk b/scripts/t/mk/buildtools.mk
index 3b758f8ba..321e948ec 100644
--- a/scripts/t/mk/buildtools.mk
+++ b/scripts/t/mk/buildtools.mk
@@ -1,3 +1,7 @@
+AR                := overridden
+TEST_AR           := overridden
+TEST_AR_FOR_BUILD := overridden
+
 DPKG_EXPORT_BUILDTOOLS := 1
 
 include $(srcdir)/mk/buildtools.mk
-- 
2.39.2

>From a5e4df5a095f9de1cb09f8185923c51e764fd9e0 Mon Sep 17 00:00:00 2001
From: Nicolas Boulenguez <nico...@debian.org>
Date: Mon, 4 Mar 2024 11:58:53 +0100
Subject: [PATCH 09/10] scripts/mk: stop hard-coding dpkg_datadir

This path differ during tests and after installation.  Instead of
rewriting the file with a hardcoded path, compute it within Make.
---
 build-aux/subst.am       |  6 ------
 scripts/mk/Makefile.am   | 21 ---------------------
 scripts/mk/buildtools.mk |  5 ++++-
 scripts/mk/default.mk    |  3 ++-
 scripts/mk/vendor.mk     |  5 ++++-
 5 files changed, 10 insertions(+), 30 deletions(-)

diff --git a/build-aux/subst.am b/build-aux/subst.am
index 5515930d0..167a71257 100644
--- a/build-aux/subst.am
+++ b/build-aux/subst.am
@@ -39,9 +39,3 @@ SUFFIXES += .pl
 	@test -d `dirname $@` || $(MKDIR_P) `dirname $@`
 	$(do_perl_subst) <$< >$@
 	$(AM_V_at) chmod +x $@
-
-# Makefile support.
-
-do_make_subst = $(AM_V_GEN) $(SED) \
-	-e "s:dpkg_datadir[[:space:]]*=[[:space:]]*[^[:space:]]*:dpkg_datadir = $(pkgdatadir):" \
-	# EOL
diff --git a/scripts/mk/Makefile.am b/scripts/mk/Makefile.am
index 257ba5252..6e85e17b9 100644
--- a/scripts/mk/Makefile.am
+++ b/scripts/mk/Makefile.am
@@ -10,24 +10,3 @@ dist_pkgdata_DATA = \
 	pkg-info.mk \
 	vendor.mk \
 	# EOL
-
-SUFFIXES =
-
-include $(top_srcdir)/build-aux/subst.am
-
-# Ideally we'd use '$(SED) -i', but unfortunately that's not portable.
-install-data-hook:
-	$(do_make_subst) <$(DESTDIR)$(pkgdatadir)/default.mk \
-	                 >$(DESTDIR)$(pkgdatadir)/default.mk.new
-	mv $(DESTDIR)$(pkgdatadir)/default.mk.new \
-	   $(DESTDIR)$(pkgdatadir)/default.mk
-
-	$(do_make_subst) <$(DESTDIR)$(pkgdatadir)/buildtools.mk \
-	                 >$(DESTDIR)$(pkgdatadir)/buildtools.mk.new
-	mv $(DESTDIR)$(pkgdatadir)/buildtools.mk.new \
-	   $(DESTDIR)$(pkgdatadir)/buildtools.mk
-
-	$(do_make_subst) <$(DESTDIR)$(pkgdatadir)/vendor.mk \
-			 >$(DESTDIR)$(pkgdatadir)/vendor.mk.new
-	mv $(DESTDIR)$(pkgdatadir)/vendor.mk.new \
-	   $(DESTDIR)$(pkgdatadir)/vendor.mk
diff --git a/scripts/mk/buildtools.mk b/scripts/mk/buildtools.mk
index 6ce9642cd..502b30b8d 100644
--- a/scripts/mk/buildtools.mk
+++ b/scripts/mk/buildtools.mk
@@ -28,7 +28,10 @@
 ifndef dpkg_buildtools_mk_included
 dpkg_buildtools_mk_included = yes
 
-dpkg_datadir = $(srcdir)/mk
+# Default.mk computes dpkg_datadir, other .mk files may use it again.
+ifndef dpkg_datadir
+  dpkg_datadir := $(patsubst %/buildtools.mk,%,$(lastword $(MAKEFILE_LIST)))
+endif
 include $(dpkg_datadir)/architecture.mk
 
 # We set the TOOL_FOR_BUILD variables to the specified value, and the TOOL
diff --git a/scripts/mk/default.mk b/scripts/mk/default.mk
index c4e408b01..0e8e4f4d4 100644
--- a/scripts/mk/default.mk
+++ b/scripts/mk/default.mk
@@ -4,7 +4,8 @@
 ifndef dpkg_default_mk_included
 dpkg_default_mk_included = yes
 
-dpkg_datadir = $(srcdir)/mk
+dpkg_datadir := $(patsubst %/default.mk,%,$(lastword $(MAKEFILE_LIST)))
+
 include $(dpkg_datadir)/architecture.mk
 include $(dpkg_datadir)/buildapi.mk
 ifeq ($(call dpkg_build_api_ge,1),yes)
diff --git a/scripts/mk/vendor.mk b/scripts/mk/vendor.mk
index 2bce9322c..faa195e03 100644
--- a/scripts/mk/vendor.mk
+++ b/scripts/mk/vendor.mk
@@ -36,7 +36,10 @@
 ifndef dpkg_vendor_mk_included
 dpkg_vendor_mk_included = yes
 
-dpkg_datadir = $(srcdir)/mk
+# Default.mk computes dpkg_datadir, other .mk files may use it again.
+ifndef dpkg_datadir
+  dpkg_datadir := $(patsubst %/vendor.mk,%,$(lastword $(MAKEFILE_LIST)))
+endif
 include $(dpkg_datadir)/buildapi.mk
 
 dpkg_late_eval ?= $(or $(value DPKG_CACHE_$(1)),$(eval DPKG_CACHE_$(1) := $(shell $(2)))$(value DPKG_CACHE_$(1)))
-- 
2.39.2

>From 2c54d622923327a4f523146805c605f6771ee7e9 Mon Sep 17 00:00:00 2001
From: Nicolas Boulenguez <nico...@debian.org>
Date: Sun, 10 Mar 2024 20:18:52 +0100
Subject: [PATCH 10/10] scripts/mk: reduce the number of subprocesses

In architecture.mk, each unset variable was spawning a shell.

In buildapi.mk, each expansion was spawning a shell.
Default.mk and vendor.mk both expand DPKG_BUILD_API.

In buildflags.mk, each first expansion of an unset variable was
spawning a shell.
DPKG_EXPORT_BUILDFLAGS expands all variables.

In pkg-info.mk, each variable was spawning its own shell.

Vendors.mk was correct but use the same mechanism for consistency.
---
 scripts/mk/architecture.mk | 15 ++++++++++-----
 scripts/mk/buildapi.mk     |  6 +++++-
 scripts/mk/buildflags.mk   | 36 +++++++++++++++++-------------------
 scripts/mk/pkg-info.mk     | 33 +++++++++++++++++++++++----------
 scripts/mk/vendor.mk       |  8 ++++----
 5 files changed, 59 insertions(+), 39 deletions(-)

diff --git a/scripts/mk/architecture.mk b/scripts/mk/architecture.mk
index ab42f8788..6963d2ea7 100644
--- a/scripts/mk/architecture.mk
+++ b/scripts/mk/architecture.mk
@@ -1,16 +1,21 @@
 # This Makefile fragment (since dpkg 1.16.1) defines all the DEB_HOST_* and
 # DEB_BUILD_* variables that dpkg-architecture can return. Existing values
 # of those variables are preserved as per policy.
+# All variables are exported.
 
 ifndef dpkg_architecture_mk_included
 dpkg_architecture_mk_included = yes
 
-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))
-
+dpkg_architecture_vars = \
 $(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)))))
+    DEB_$(machine)_$(var)))
+
+# Dpkg-buildpackage sets all variables. Optimize this frequent case.
+ifneq (,$(strip $(foreach v,$(dpkg_architecture_vars),$(if $(value $(v)),,1))))
+  $(foreach line,$(subst =,?=,$(shell dpkg-architecture)),$(eval $(line)))
+endif
+
+export $(dpkg_architecture_vars)
 
 endif # dpkg_architecture_mk_included
diff --git a/scripts/mk/buildapi.mk b/scripts/mk/buildapi.mk
index 3a1f16405..0f29be954 100644
--- a/scripts/mk/buildapi.mk
+++ b/scripts/mk/buildapi.mk
@@ -4,7 +4,11 @@ ifndef dpkg_buildapi_mk_included
 dpkg_buildapi_mk_included = yes
 
 # Default API level when not set.
-DPKG_BUILD_API ?= $(shell dpkg-buildapi)
+ifndef DPKG_BUILD_API
+  dpkg_lazy ?= $(eval $(1) = $(2)$$($(1)))
+  dpkg_lazy_set ?= $(call dpkg_lazy,$(1),$$(eval $(1) := $(2)))
+  $(call dpkg_lazy_set,DPKG_BUILD_API,$$(shell dpkg-buildapi))
+endif
 
 # We could use only built-in GNU make functions, but that seems too much
 # complexity given no integer operators, given that we currently have to
diff --git a/scripts/mk/buildflags.mk b/scripts/mk/buildflags.mk
index 11597002d..8e6b83211 100644
--- a/scripts/mk/buildflags.mk
+++ b/scripts/mk/buildflags.mk
@@ -35,8 +35,6 @@ dpkg_buildflags_mk_included = yes
 # This list is kept in sync with the default set of flags returned
 # by dpkg-buildflags.
 
-dpkg_lazy_eval ?= $$(or $$(value DPKG_CACHE_$(1)),$$(eval DPKG_CACHE_$(1) := $$(shell $(2)))$$(value DPKG_CACHE_$(1)))
-
 DPKG_BUILDFLAGS_LIST := $(foreach var,\
   ASFLAGS \
   CFLAGS \
@@ -50,26 +48,26 @@ DPKG_BUILDFLAGS_LIST := $(foreach var,\
   LDFLAGS \
   ,$(var) $(var)_FOR_BUILD)
 
-define dpkg_buildflags_export_envvar
-  ifdef $(1)
-    DPKG_BUILDFLAGS_EXPORT_ENVVAR += $(1)="$$(value $(1))"
-  endif
-endef
-
-$(eval $(call dpkg_buildflags_export_envvar,DEB_BUILD_OPTIONS))
-$(eval $(call dpkg_buildflags_export_envvar,DEB_BUILD_MAINT_OPTIONS))
-$(eval $(call dpkg_buildflags_export_envvar,DEB_BUILD_PATH))
-$(foreach flag,$(DPKG_BUILDFLAGS_LIST),\
-  $(foreach operation,SET STRIP APPEND PREPEND,\
-    $(eval $(call dpkg_buildflags_export_envvar,DEB_$(flag)_MAINT_$(operation)))))
-
-dpkg_buildflags_setvar = $(1) = $(call dpkg_lazy_eval,$(1),$(DPKG_BUILDFLAGS_EXPORT_ENVVAR) dpkg-buildflags --get $(1))
-
-$(foreach flag,$(DPKG_BUILDFLAGS_LIST),\
-  $(eval $(call dpkg_buildflags_setvar,$(flag))))
+dpkg_buildflags_run = $(eval $(shell \
+  $(foreach exported,\
+    DEB_BUILD_OPTIONS\
+    DEB_BUILD_MAINT_OPTIONS\
+    DEB_BUILD_PATH\
+    $(foreach flag,$(DPKG_BUILDFLAGS_LIST),\
+      $(foreach operation,SET STRIP APPEND PREPEND,\
+        DEB_$(flag)_MAINT_$(operation)))\
+    ,$(if $(value $(exported))\
+      ,$(exported)="$(value $(exported))"))\
+  dpkg-buildflags | sed 's/\([^=]*\)\(.*\)/$$(eval \1:\2)/'))
 
 ifdef DPKG_EXPORT_BUILDFLAGS
+  # We need to compute the values right now.
+  $(dpkg_buildflags_run)
   export $(DPKG_BUILDFLAGS_LIST)
+else
+  dpkg_lazy ?= $(eval $(1) = $(2)$$($(1)))
+  $(foreach v,$(DPKG_BUILDFLAGS_LIST),\
+    $(call dpkg_lazy,$(v),$$(dpkg_buildflags_run)))
 endif
 
 endif # dpkg_buildflags_mk_included
diff --git a/scripts/mk/pkg-info.mk b/scripts/mk/pkg-info.mk
index b65a8d1a4..4ba40eb97 100644
--- a/scripts/mk/pkg-info.mk
+++ b/scripts/mk/pkg-info.mk
@@ -12,21 +12,34 @@
 #   SOURCE_DATE_EPOCH: source release date as seconds since the epoch, as
 #     specified by <https://reproducible-builds.org/specs/source-date-epoch/>
 #     (since dpkg 1.18.8).
+#     If it is undefined, the date of the latest changelog entry is used.
+#     In both cases, the value is exported.
 
 ifndef dpkg_pkg_info_mk_included
 dpkg_pkg_info_mk_included = yes
 
-dpkg_late_eval ?= $(or $(value DPKG_CACHE_$(1)),$(eval DPKG_CACHE_$(1) := $(shell $(2)))$(value DPKG_CACHE_$(1)))
-
-DEB_SOURCE = $(call dpkg_late_eval,DEB_SOURCE,dpkg-parsechangelog -SSource)
-DEB_VERSION = $(call dpkg_late_eval,DEB_VERSION,dpkg-parsechangelog -SVersion)
-DEB_VERSION_EPOCH_UPSTREAM = $(call dpkg_late_eval,DEB_VERSION_EPOCH_UPSTREAM,echo '$(DEB_VERSION)' | sed -e 's/-[^-]*$$//')
-DEB_VERSION_UPSTREAM_REVISION = $(call dpkg_late_eval,DEB_VERSION_UPSTREAM_REVISION,echo '$(DEB_VERSION)' | sed -e 's/^[0-9]*://')
-DEB_VERSION_UPSTREAM = $(call dpkg_late_eval,DEB_VERSION_UPSTREAM,echo '$(DEB_VERSION_EPOCH_UPSTREAM)' | sed -e 's/^[0-9]*://')
-DEB_DISTRIBUTION = $(call dpkg_late_eval,DEB_DISTRIBUTION,dpkg-parsechangelog -SDistribution)
-
-SOURCE_DATE_EPOCH ?= $(call dpkg_late_eval,SOURCE_DATE_EPOCH,dpkg-parsechangelog -STimestamp)
+dpkg_parsechangelog_run = $(eval $(shell dpkg-parsechangelog | sed -n '\
+  s/^Distribution: \(.*\)/$$(eval DEB_DISTRIBUTION:=\1)/p;\
+  s/^Source: \(.*\)/$$(eval DEB_SOURCE:=\1)/p;\
+  s/^Version: \([0-9]*:\)\?\([^-]*\)\(\(.*\)-[^-]*\)\?$$/\
+    $$(eval DEB_VERSION:=\1\2\3)\
+    $$(eval DEB_VERSION_EPOCH_UPSTREAM:=\1\2\4)\
+    $$(eval DEB_VERSION_UPSTREAM_REVISION:=\2\3)\
+    $$(eval DEB_VERSION_UPSTREAM:=\2\4)/p;\
+  s/^Timestamp: \(.*\)/$$(eval SOURCE_DATE_EPOCH?=\1)/p'))
 
+ifdef SOURCE_DATE_EPOCH
+  dpkg_lazy ?= $(eval $(1) = $(2)$$($(1)))
+  $(call dpkg_lazy,DEB_DISTRIBUTION,$$(dpkg_parsechangelog_run))
+  $(call dpkg_lazy,DEB_SOURCE,$$(dpkg_parsechangelog_run))
+  $(call dpkg_lazy,DEB_VERSION,$$(dpkg_parsechangelog_run))
+  $(call dpkg_lazy,DEB_VERSION_EPOCH_UPSTREAM,$$(dpkg_parsechangelog_run))
+  $(call dpkg_lazy,DEB_VERSION_UPSTREAM,$$(dpkg_parsechangelog_run))
+  $(call dpkg_lazy,DEB_UPSTREAM_REVISION,$$(dpkg_parsechangelog_run))
+else
+  # We need to compute the values right now.
+  $(dpkg_parsechangelog_run)
+endif
 export SOURCE_DATE_EPOCH
 
 endif # dpkg_pkg_info_mk_included
diff --git a/scripts/mk/vendor.mk b/scripts/mk/vendor.mk
index faa195e03..c1e2e4643 100644
--- a/scripts/mk/vendor.mk
+++ b/scripts/mk/vendor.mk
@@ -42,10 +42,10 @@ ifndef dpkg_datadir
 endif
 include $(dpkg_datadir)/buildapi.mk
 
-dpkg_late_eval ?= $(or $(value DPKG_CACHE_$(1)),$(eval DPKG_CACHE_$(1) := $(shell $(2)))$(value DPKG_CACHE_$(1)))
-
-DEB_VENDOR = $(call dpkg_late_eval,DEB_VENDOR,dpkg-vendor --query Vendor)
-DEB_PARENT_VENDOR = $(call dpkg_late_eval,DEB_PARENT_VENDOR,dpkg-vendor --query Parent)
+dpkg_lazy ?= $(eval $(1) = $(2)$$($(1)))
+dpkg_lazy_set ?= $(call dpkg_lazy,$(1),$$(eval $(1) := $(2)))
+$(call dpkg_lazy_set,DEB_VENDOR,$$(shell dpkg-vendor --query Vendor))
+$(call dpkg_lazy_set,DEB_PARENT_VENDOR,$$(shell dpkg-vendor --query Parent))
 
 dpkg_vendor_derives_from_v0 = dpkg-vendor --derives-from $(1) && echo yes || echo no
 dpkg_vendor_derives_from_v1 = $(shell $(dpkg_vendor_derives_from_v0))
-- 
2.39.2

Reply via email to