Source: arm-trusted-firmware Followup-For: Bug #1049991 Hello. An improved suggestion is attached, as as sequence of small commits. I have run DEB_HOST_ARCH=arm64 debian/rules -n override_dh_auto_build | sed 's/ *; */\n/g' initially and after each commit, the differences seem expected. I hope this will be useful.
>From 5adf33f90dde728988e08bbbf1fe938f07345583 Mon Sep 17 00:00:00 2001 From: Nicolas Boulenguez <[email protected]> Date: Sat, 1 Nov 2025 02:59:00 +0100 Subject: [PATCH 1/8] debian/rules: replace a loop with multiple arguments to the same command
--- debian/rules | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/debian/rules b/debian/rules index 1951d0d10..7e4cd7506 100755 --- a/debian/rules +++ b/debian/rules @@ -73,9 +73,7 @@ define build_platform $(eval board := $(if $(filter k3,$(platform)),lite,)) $(foreach subplatform, $(subplatforms), \ CROSS_COMPILE=aarch64-linux-gnu- CFLAGS=--param=min-pagesize=0 LDFLAGS= dh_auto_build -- V=$(VERBOSE) DEBUG=$(debug) $($(subplatform)_assigns) PLAT=$(platform) $(make_target) ; \ - $(foreach target, $(targets), \ - install -m644 build/$(platform)/$(board)/$(buildtype)/$(target) -Dt build/renamed/$(subplatform) ; \ - ) \ + install -m644 $(targets:%=build/$(platform)/$(board)/$(buildtype)/%) -Dt build/renamed/$(subplatform) ; \ # For each subplatform, make is called using the same PLAT variable. If # the build is not cleaned between each call, objects will remain the # same, without rebuilding them. -- 2.47.3
>From 9c43153aa5d82c5861af433be5230122ade70f5f Mon Sep 17 00:00:00 2001 From: Nicolas Boulenguez <[email protected]> Date: Sat, 1 Nov 2025 03:07:32 +0100 Subject: [PATCH 2/8] debian/rules: group references to a given platform A global list causes a conflict between any two commits enabling/disabling distinct platforms. --- debian/rules | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/debian/rules b/debian/rules index 7e4cd7506..4ed21ec2b 100755 --- a/debian/rules +++ b/debian/rules @@ -14,7 +14,8 @@ else VERBOSE=1 endif -platforms := g12a gxbb imx8mm imx8mn imx8mp k3 sun50i_a64 sun50i_h6 rcar rk3328 rk3399 rk3568 rk3588 rpi3 rpi4 +platforms := g12a gxbb sun50i_a64 rpi3 rpi4 + # Disable building of imx8mq, as it is not well supported upstream. #platforms_nodebug := imx8mq @@ -23,36 +24,43 @@ platforms := g12a gxbb imx8mm imx8mn imx8mp k3 sun50i_a64 sun50i_h6 rcar rk3328 # Add two subplatforms for imx8mn platform: # * imx8mn: default configuration # * imx8mn_uart4: console set to UART4 +platforms += imx8mn imx8mn_subplatforms := imx8mn imx8mn_uart4 imx8mn_uart4_assigns := IMX_BOOT_UART_BASE=0x30a60000 # By default, iMX8MM uses UART2 console. However, other boards # use other UARTs +platforms += imx8mm imx8mm_subplatforms := imx8mm imx8mm_uart1 imx8mm_uart3 imx8mm_uart4 imx8mm_uart1_assigns := IMX_BOOT_UART_BASE=0x30860000 imx8mm_uart3_assigns := IMX_BOOT_UART_BASE=0x30880000 imx8mm_uart4_assigns := IMX_BOOT_UART_BASE=0x30A60000 # Same for iMX8MP +platforms += imx8mp imx8mp_subplatforms := imx8mp imx8mp_uart1 imx8mp_uart3 imx8mp_uart4 imx8mp_uart1_assigns := IMX_BOOT_UART_BASE=0x30860000 imx8mp_uart3_assigns := IMX_BOOT_UART_BASE=0x30880000 imx8mp_uart4_assigns := IMX_BOOT_UART_BASE=0x30A60000 +platforms += k3 k3_assigns := TARGET_BOARD=lite # TF-A's regulator setup breaks Ethernet on some H6 boards, # so make it optional by having two subplatforms: # * sun50i_h6: default configuration # * sun50i_h6_no_pmic: skip regulator setup +platforms += sun50i_h6 sun50i_h6_subplatforms := sun50i_h6 sun50i_h6_no_pmic sun50i_h6_no_pmic_assigns := SUNXI_SETUP_REGULATORS=0 +platforms += rk3328 rk3399 rk3568 rk3588 rk3328_targets := bl31/bl31.elf rk3399_targets := bl31/bl31.elf rk3568_targets := bl31/bl31.elf rk3588_targets := bl31/bl31.elf +platforms += rcar rcar_subplatforms := rcar_uclb_h3 rcar_uclb_m3w rcar_uclb_m3n rcar_uclb_h3_assigns := LSI=H3 RCAR_DRAM_SPLIT=1 RCAR_GEN3_ULCB=1 PMIC_LEVEL_MODE=0 RCAR_DRAM_LPDDR4_MEMCONF=0 SPD=opteed RCAR_LOSSY_ENABLE=1 rcar_uclb_m3n_assigns := LSI=M3N RCAR_GEN3_ULCB=1 PMIC_LEVEL_MODE=0 RCAR_DRAM_LPDDR4_MEMCONF=0 SPD=opteed RCAR_LOSSY_ENABLE=1 -- 2.47.3
>From 89f0080fb92ec93554579ca8534669908444df9f Mon Sep 17 00:00:00 2001 From: Nicolas Boulenguez <[email protected]> Date: Sat, 1 Nov 2025 03:17:04 +0100 Subject: [PATCH 3/8] debian/rules: deal with nodebug in a single list --- debian/rules | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/debian/rules b/debian/rules index 4ed21ec2b..4575ecb74 100755 --- a/debian/rules +++ b/debian/rules @@ -17,7 +17,8 @@ endif platforms := g12a gxbb sun50i_a64 rpi3 rpi4 # Disable building of imx8mq, as it is not well supported upstream. -#platforms_nodebug := imx8mq +# platforms += imx8mq +imx8mq_nodebug := yes # By default, iMX8MN uses UART2 console. However, other boards supported # upstream (e.g. Variscite VAR-SOM-MX8M-NANO board) uses UART4. @@ -72,8 +73,8 @@ rcar_make_target := rcar # Always set CROSS_COMPILE, which also works for native builds. define build_platform $(eval platform := $(1)) - $(eval debug := $(2)) - $(eval buildtype := $(3)) + $(eval debug := $(if $($(platform)_nodebug),0,1)) + $(eval buildtype := $(if $($(platform)_nodebug),release,debug)) $(eval subplatforms := $(if $($(platform)_subplatforms), $($(platform)_subplatforms), $(platform))) $(eval targets := $(if $($(platform)_targets), $($(platform)_targets), bl31.bin)) $(eval make_target := $(if $($(platform)_make_target), $($(platform)_make_target), bl31)) @@ -100,11 +101,9 @@ ifeq ($(filter pkg.arm-trusted-firmware.notools,$(DEB_BUILD_PROFILES)),) endif # Only build firmware on arm64. ifeq ($(DEB_HOST_ARCH),arm64) - override_dh_auto_build: $(platforms) $(platforms_nodebug) + override_dh_auto_build: $(platforms) $(platforms): - $(call build_platform,$@,1,debug) - $(platforms_nodebug): - $(call build_platform,$@,0,release) + $(call build_platform,$@) endif override_dh_installchangelogs: -- 2.47.3
>From 2b2bd37a0a3abfe162735e83cea8e5f3b4ed3f38 Mon Sep 17 00:00:00 2001 From: Nicolas Boulenguez <[email protected]> Date: Sat, 1 Nov 2025 03:20:43 +0100 Subject: [PATCH 4/8] debian/rules: simplify a few conditionals with "or" constructs --- debian/rules | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/debian/rules b/debian/rules index 4575ecb74..31067dad7 100755 --- a/debian/rules +++ b/debian/rules @@ -75,9 +75,9 @@ define build_platform $(eval platform := $(1)) $(eval debug := $(if $($(platform)_nodebug),0,1)) $(eval buildtype := $(if $($(platform)_nodebug),release,debug)) - $(eval subplatforms := $(if $($(platform)_subplatforms), $($(platform)_subplatforms), $(platform))) - $(eval targets := $(if $($(platform)_targets), $($(platform)_targets), bl31.bin)) - $(eval make_target := $(if $($(platform)_make_target), $($(platform)_make_target), bl31)) + $(eval subplatforms := $(or $($(platform)_subplatforms),$(platform))) + $(eval targets := $(or $($(platform)_targets),bl31.bin)) + $(eval make_target := $(or $($(platform)_make_target),bl31)) # board needs to be set to "lite" for k3 platform $(eval board := $(if $(filter k3,$(platform)),lite,)) $(foreach subplatform, $(subplatforms), \ -- 2.47.3
>From 969dfcda498dc64908571005a10f014e08698d9d Mon Sep 17 00:00:00 2001 From: Nicolas Boulenguez <[email protected]> Date: Sat, 1 Nov 2025 03:21:53 +0100 Subject: [PATCH 5/8] debian/rules: avoid a special case for k3 in the generic recipe --- debian/rules | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/debian/rules b/debian/rules index 31067dad7..eb62932d0 100755 --- a/debian/rules +++ b/debian/rules @@ -46,6 +46,7 @@ imx8mp_uart4_assigns := IMX_BOOT_UART_BASE=0x30A60000 platforms += k3 k3_assigns := TARGET_BOARD=lite +k3_board := lite # TF-A's regulator setup breaks Ethernet on some H6 boards, # so make it optional by having two subplatforms: @@ -78,11 +79,9 @@ define build_platform $(eval subplatforms := $(or $($(platform)_subplatforms),$(platform))) $(eval targets := $(or $($(platform)_targets),bl31.bin)) $(eval make_target := $(or $($(platform)_make_target),bl31)) - # board needs to be set to "lite" for k3 platform - $(eval board := $(if $(filter k3,$(platform)),lite,)) $(foreach subplatform, $(subplatforms), \ CROSS_COMPILE=aarch64-linux-gnu- CFLAGS=--param=min-pagesize=0 LDFLAGS= dh_auto_build -- V=$(VERBOSE) DEBUG=$(debug) $($(subplatform)_assigns) PLAT=$(platform) $(make_target) ; \ - install -m644 $(targets:%=build/$(platform)/$(board)/$(buildtype)/%) -Dt build/renamed/$(subplatform) ; \ + install -m644 $(targets:%=build/$(platform)/$($(platform)_board)/$(buildtype)/%) -Dt build/renamed/$(subplatform) ; \ # For each subplatform, make is called using the same PLAT variable. If # the build is not cleaned between each call, objects will remain the # same, without rebuilding them. -- 2.47.3
>From 5a5b3911c62cbc5f47db61aa2e103e7dbbf84467 Mon Sep 17 00:00:00 2001 From: Nicolas Boulenguez <[email protected]> Date: Sat, 1 Nov 2025 03:49:04 +0100 Subject: [PATCH 6/8] debian/rules: iterate on subplatforms instead of platforms Remove the Make "foreach" on shell commands. Make then checks each exit status and the log is more informative in case of failure. --- debian/rules | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/debian/rules b/debian/rules index eb62932d0..fb85596a3 100755 --- a/debian/rules +++ b/debian/rules @@ -25,21 +25,25 @@ imx8mq_nodebug := yes # Add two subplatforms for imx8mn platform: # * imx8mn: default configuration # * imx8mn_uart4: console set to UART4 -platforms += imx8mn -imx8mn_subplatforms := imx8mn imx8mn_uart4 +platforms += imx8mn imx8mn_uart4 +imx8mn_uart4_PLAT := imx8mn imx8mn_uart4_assigns := IMX_BOOT_UART_BASE=0x30a60000 # By default, iMX8MM uses UART2 console. However, other boards # use other UARTs -platforms += imx8mm -imx8mm_subplatforms := imx8mm imx8mm_uart1 imx8mm_uart3 imx8mm_uart4 +platforms += imx8mm imx8mm_uart1 imx8mm_uart3 imx8mm_uart4 +imx8mm_uart1_PLAT := imx8mm +imx8mm_uart3_PLAT := imx8mm +imx8mm_uart4_PLAT := imx8mm imx8mm_uart1_assigns := IMX_BOOT_UART_BASE=0x30860000 imx8mm_uart3_assigns := IMX_BOOT_UART_BASE=0x30880000 imx8mm_uart4_assigns := IMX_BOOT_UART_BASE=0x30A60000 # Same for iMX8MP -platforms += imx8mp -imx8mp_subplatforms := imx8mp imx8mp_uart1 imx8mp_uart3 imx8mp_uart4 +platforms += imx8mp imx8mp_uart1 imx8mp_uart3 imx8mp_uart4 +imx8mp_uart1_PLAT := imx8mp +imx8mp_uart3_PLAT := imx8mp +imx8mp_uart4_PLAT := imx8mp imx8mp_uart1_assigns := IMX_BOOT_UART_BASE=0x30860000 imx8mp_uart3_assigns := IMX_BOOT_UART_BASE=0x30880000 imx8mp_uart4_assigns := IMX_BOOT_UART_BASE=0x30A60000 @@ -52,8 +56,8 @@ k3_board := lite # so make it optional by having two subplatforms: # * sun50i_h6: default configuration # * sun50i_h6_no_pmic: skip regulator setup -platforms += sun50i_h6 -sun50i_h6_subplatforms := sun50i_h6 sun50i_h6_no_pmic +platforms += sun50i_h6 sun50i_h6_no_pmic +sun50i_h6_no_pmic_PLAT := sun50i_h6 sun50i_h6_no_pmic_assigns := SUNXI_SETUP_REGULATORS=0 platforms += rk3328 rk3399 rk3568 rk3588 @@ -62,8 +66,10 @@ rk3399_targets := bl31/bl31.elf rk3568_targets := bl31/bl31.elf rk3588_targets := bl31/bl31.elf -platforms += rcar -rcar_subplatforms := rcar_uclb_h3 rcar_uclb_m3w rcar_uclb_m3n +platforms += rcar_uclb_h3 rcar_uclb_m3w rcar_uclb_m3n +rcar_uclb_h3_PLAT := rcar +rcar_uclb_m3n_PLAT := rcar +rcar_uclb_m3w_PLAT := rcar rcar_uclb_h3_assigns := LSI=H3 RCAR_DRAM_SPLIT=1 RCAR_GEN3_ULCB=1 PMIC_LEVEL_MODE=0 RCAR_DRAM_LPDDR4_MEMCONF=0 SPD=opteed RCAR_LOSSY_ENABLE=1 rcar_uclb_m3n_assigns := LSI=M3N RCAR_GEN3_ULCB=1 PMIC_LEVEL_MODE=0 RCAR_DRAM_LPDDR4_MEMCONF=0 SPD=opteed RCAR_LOSSY_ENABLE=1 rcar_uclb_m3w_assigns := LSI=M3 RCAR_DRAM_SPLIT=2 RCAR_GEN3_ULCB=1 PMIC_LEVEL_MODE=0 RCAR_DRAM_LPDDR4_MEMCONF=0 SPD=opteed RCAR_LOSSY_ENABLE=1 @@ -73,20 +79,18 @@ rcar_make_target := rcar # Always set CROSS_COMPILE, which also works for native builds. define build_platform - $(eval platform := $(1)) + $(eval subplatform := $(1)) + $(eval platform := $(or $($(subplatform)_PLAT),$(subplatform))) $(eval debug := $(if $($(platform)_nodebug),0,1)) $(eval buildtype := $(if $($(platform)_nodebug),release,debug)) - $(eval subplatforms := $(or $($(platform)_subplatforms),$(platform))) $(eval targets := $(or $($(platform)_targets),bl31.bin)) $(eval make_target := $(or $($(platform)_make_target),bl31)) - $(foreach subplatform, $(subplatforms), \ - CROSS_COMPILE=aarch64-linux-gnu- CFLAGS=--param=min-pagesize=0 LDFLAGS= dh_auto_build -- V=$(VERBOSE) DEBUG=$(debug) $($(subplatform)_assigns) PLAT=$(platform) $(make_target) ; \ - install -m644 $(targets:%=build/$(platform)/$($(platform)_board)/$(buildtype)/%) -Dt build/renamed/$(subplatform) ; \ - # For each subplatform, make is called using the same PLAT variable. If - # the build is not cleaned between each call, objects will remain the - # same, without rebuilding them. - make DEBUG=$(debug) $($(subplatform)_assigns) PLAT=$(platform) clean ; \ - ) + CROSS_COMPILE=aarch64-linux-gnu- CFLAGS=--param=min-pagesize=0 LDFLAGS= dh_auto_build -- V=$(VERBOSE) DEBUG=$(debug) $($(subplatform)_assigns) PLAT=$(platform) $(make_target) + install -m644 $(targets:%=build/$(platform)/$($(platform)_board)/$(buildtype)/%) -Dt build/renamed/$(subplatform) + # For each subplatform, make is called using the same PLAT variable. If + # the build is not cleaned between each call, objects will remain the + # same, without rebuilding them. + make DEBUG=$(debug) $($(subplatform)_assigns) PLAT=$(platform) clean endef %: -- 2.47.3
>From f25484d66b2a3e6ec799a81b071ac92f630443b3 Mon Sep 17 00:00:00 2001 From: Nicolas Boulenguez <[email protected]> Date: Sat, 1 Nov 2025 02:40:31 +0100 Subject: [PATCH 7/8] debian/rules: avoid Make obscure features like `define`, `eval`, `call`. --- debian/rules | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/debian/rules b/debian/rules index fb85596a3..800985441 100755 --- a/debian/rules +++ b/debian/rules @@ -78,20 +78,19 @@ rcar_targets := bl31.srec bl2.srec rcar_make_target := rcar # Always set CROSS_COMPILE, which also works for native builds. -define build_platform - $(eval subplatform := $(1)) - $(eval platform := $(or $($(subplatform)_PLAT),$(subplatform))) - $(eval debug := $(if $($(platform)_nodebug),0,1)) - $(eval buildtype := $(if $($(platform)_nodebug),release,debug)) - $(eval targets := $(or $($(platform)_targets),bl31.bin)) - $(eval make_target := $(or $($(platform)_make_target),bl31)) +subplatform = $@ +platform = $(or $($(subplatform)_PLAT),$(subplatform)) +debug = $(if $($(platform)_nodebug),0,1) +buildtype = $(if $($(platform)_nodebug),release,debug) +targets = $(or $($(platform)_targets),bl31.bin) +make_target = $(or $($(platform)_make_target),bl31) +$(platforms): CROSS_COMPILE=aarch64-linux-gnu- CFLAGS=--param=min-pagesize=0 LDFLAGS= dh_auto_build -- V=$(VERBOSE) DEBUG=$(debug) $($(subplatform)_assigns) PLAT=$(platform) $(make_target) install -m644 $(targets:%=build/$(platform)/$($(platform)_board)/$(buildtype)/%) -Dt build/renamed/$(subplatform) # For each subplatform, make is called using the same PLAT variable. If # the build is not cleaned between each call, objects will remain the # same, without rebuilding them. make DEBUG=$(debug) $($(subplatform)_assigns) PLAT=$(platform) clean -endef %: dh $@ @@ -105,8 +104,6 @@ endif # Only build firmware on arm64. ifeq ($(DEB_HOST_ARCH),arm64) override_dh_auto_build: $(platforms) - $(platforms): - $(call build_platform,$@) endif override_dh_installchangelogs: -- 2.47.3
>From 8cc479d62a5d9a406ca3f2b7433b1d7ea8591f63 Mon Sep 17 00:00:00 2001 From: Nicolas Boulenguez <[email protected]> Date: Sat, 1 Nov 2025 04:52:32 +0100 Subject: [PATCH 8/8] debian/rules: configure each build separately This causes each build of the same PLATform repeating similar settings (for now, only rcar), but is easyer to understand and more configurable. For example, these two lines are enough to build imx8mm in both debug and release mode as requested in https://bugs.debian.org/1049991. platforms += imx8mm_bis imx8mm_bis_nodebug := yes --- debian/rules | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/debian/rules b/debian/rules index 800985441..e8ee9451f 100755 --- a/debian/rules +++ b/debian/rules @@ -73,24 +73,26 @@ rcar_uclb_m3w_PLAT := rcar rcar_uclb_h3_assigns := LSI=H3 RCAR_DRAM_SPLIT=1 RCAR_GEN3_ULCB=1 PMIC_LEVEL_MODE=0 RCAR_DRAM_LPDDR4_MEMCONF=0 SPD=opteed RCAR_LOSSY_ENABLE=1 rcar_uclb_m3n_assigns := LSI=M3N RCAR_GEN3_ULCB=1 PMIC_LEVEL_MODE=0 RCAR_DRAM_LPDDR4_MEMCONF=0 SPD=opteed RCAR_LOSSY_ENABLE=1 rcar_uclb_m3w_assigns := LSI=M3 RCAR_DRAM_SPLIT=2 RCAR_GEN3_ULCB=1 PMIC_LEVEL_MODE=0 RCAR_DRAM_LPDDR4_MEMCONF=0 SPD=opteed RCAR_LOSSY_ENABLE=1 - -rcar_targets := bl31.srec bl2.srec -rcar_make_target := rcar +rcar_uclb_h3_targets := bl31.srec bl2.srec +rcar_uclb_m3n_targets := bl31.srec bl2.srec +rcar_uclb_m3w_targets := bl31.srec bl2.srec +rcar_uclb_h3_make_target := rcar +rcar_uclb_m3n_make_target := rcar +rcar_uclb_m3w_make_target := rcar # Always set CROSS_COMPILE, which also works for native builds. -subplatform = $@ -platform = $(or $($(subplatform)_PLAT),$(subplatform)) -debug = $(if $($(platform)_nodebug),0,1) -buildtype = $(if $($(platform)_nodebug),release,debug) -targets = $(or $($(platform)_targets),bl31.bin) -make_target = $(or $($(platform)_make_target),bl31) +PLAT = $(or $($@_PLAT),$@) +debug = $(if $($@_nodebug),0,1) +buildtype = $(if $($@_nodebug),release,debug) +targets = $(or $($@_targets),bl31.bin) +make_target = $(or $($@_make_target),bl31) $(platforms): - CROSS_COMPILE=aarch64-linux-gnu- CFLAGS=--param=min-pagesize=0 LDFLAGS= dh_auto_build -- V=$(VERBOSE) DEBUG=$(debug) $($(subplatform)_assigns) PLAT=$(platform) $(make_target) - install -m644 $(targets:%=build/$(platform)/$($(platform)_board)/$(buildtype)/%) -Dt build/renamed/$(subplatform) + CROSS_COMPILE=aarch64-linux-gnu- CFLAGS=--param=min-pagesize=0 LDFLAGS= dh_auto_build -- V=$(VERBOSE) DEBUG=$(debug) $($@_assigns) PLAT=$(PLAT) $(make_target) + install -m644 $(targets:%=build/$(PLAT)/$($@_board)/$(buildtype)/%) -Dt build/renamed/$@ # For each subplatform, make is called using the same PLAT variable. If # the build is not cleaned between each call, objects will remain the # same, without rebuilding them. - make DEBUG=$(debug) $($(subplatform)_assigns) PLAT=$(platform) clean + make DEBUG=$(debug) $($@_assigns) PLAT=$(PLAT) clean %: dh $@ -- 2.47.3

