Merge pull request #972 from danielinux/fix-makefile-assignments

make: let user-provided options win over target defaults
master
David Garske 2026-11-05 10:53:38 -08:00 committed by GitHub
commit 4bfe5e7035
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 145 additions and 57 deletions

View File

@ -1439,11 +1439,13 @@ set(KEYGEN_TOOL ${KEYGEN_TOOL} CACHE INTERNAL "")
list(APPEND WOLFBOOT_INCLUDE_DIRS ${WOLFBOOT_ROOT} ${WOLFBOOT_ROOT}/include)
# set default linker script
set(WOLFBOOT_LSCRIPT_TEMPLATE hal/${WOLFBOOT_TARGET}.ld)
# Partition trailers in sectors 1-2, see hal/stm32f4.c
if(WOLFBOOT_TARGET STREQUAL "stm32f4" AND CUSTOM_PARTITION_TRAILER)
set(WOLFBOOT_LSCRIPT_TEMPLATE hal/stm32f4-trailer.ld)
# set default linker script; a user-provided WOLFBOOT_LSCRIPT_TEMPLATE wins
if(NOT DEFINED WOLFBOOT_LSCRIPT_TEMPLATE)
set(WOLFBOOT_LSCRIPT_TEMPLATE hal/${WOLFBOOT_TARGET}.ld)
# Partition trailers in sectors 1-2, see hal/stm32f4.c
if(WOLFBOOT_TARGET STREQUAL "stm32f4" AND CUSTOM_PARTITION_TRAILER)
set(WOLFBOOT_LSCRIPT_TEMPLATE hal/stm32f4-trailer.ld)
endif()
endif()
#---------------------------------------------------------------------------------------------

View File

@ -38,7 +38,12 @@ LDFLAGS:=
SECURE_LDFLAGS:=
LD_START_GROUP:=-Wl,--start-group
LD_END_GROUP:=-Wl,--end-group
LSCRIPT_IN?=hal/$(TARGET).ld
# Linker script: capture the user value (command line, environment, .config)
# here; target defaults in arch.mk/options.mk/board.mk use the
# LSCRIPT_IN_DEFAULT helper (see tools/config.mk), which only assigns when
# LSCRIPT_IN is undefined or empty, so a user value wins. Last-resort
# default is applied after options.mk below.
LSCRIPT_IN_USER:=$(LSCRIPT_IN)
L2SRAM_ADDR?=0xF8F00000
V?=0
DEBUG?=0
@ -272,6 +277,14 @@ WOLFBOOT_TARGET_BUILD=1
# Parse config options
include options.mk
# Last-resort linker script for targets without a dedicated default in
# arch.mk/options.mk/board.mk; a user-provided LSCRIPT_IN wins over both.
# An empty value (e.g. an LSCRIPT_IN?= persisted by an older 'make config')
# counts as unset.
ifeq ($(strip $(LSCRIPT_IN)),)
LSCRIPT_IN:=hal/$(TARGET).ld
endif
OBJS+=$(WOLFCRYPT_OBJS)
OBJS+=$(PUBLIC_KEY_OBJS)
OBJS+=$(WOLFHSM_OBJS)
@ -350,7 +363,10 @@ ifeq ($(USE_ARMCLANG),1)
LDFLAGS:=$(ARMCLANG_LDFLAGS) --map --list=wolfboot.map
LDFLAGS+=$(LDFLAGS_EXTRA)
LSCRIPT:=config/target.sct
LSCRIPT_IN:=hal/$(TARGET).sct
# ARMClang needs a .sct scatter file; a user-provided LSCRIPT_IN wins.
ifeq ($(LSCRIPT_IN_USER),)
LSCRIPT_IN:=hal/$(TARGET).sct
endif
LSCRIPT_FLAGS:=--scatter=$(LSCRIPT)
LD_START_GROUP:=
LD_END_GROUP:=
@ -563,7 +579,10 @@ stage1: stage1/loader_stage1.bin
stage1/loader_stage1.bin: wolfboot.elf
stage1/loader_stage1.bin: FORCE
@echo "\t[BIN] $@"
$(Q)$(MAKE) -C $(dir $@) $(notdir $@)
# A user-provided LSCRIPT_IN is relative to the repo root; the recursive
# make runs from stage1/, so pass it as an absolute path. Target-derived
# stage1 defaults keep their own selection (nothing is passed).
$(Q)$(MAKE) -C $(dir $@) $(notdir $@) $(if $(LSCRIPT_IN_USER),LSCRIPT_IN=$(abspath $(LSCRIPT_IN_USER)))
libwolfboot.a: include/target.h $(OBJS)
@echo "\t[LIB] $@"

88
arch.mk
View File

@ -109,7 +109,7 @@ ifeq ($(ARCH),AARCH64)
ZYNQMP_PSU_INIT_DIR?=hal/board/zynqmp
CFLAGS+=-DWOLFBOOT_ZYNQMP_FSBL
CFLAGS+=-Ihal/zynqmp -I$(ZYNQMP_PSU_INIT_DIR)
LSCRIPT_IN=hal/zynqmp_ocm.ld
$(call LSCRIPT_IN_DEFAULT,hal/zynqmp_ocm.ld)
OBJS+=hal/zynqmp_psu_shim.o
OBJS+=hal/zynqmp_atf.o
OBJS+=$(ZYNQMP_PSU_INIT_DIR)/psu_init_gpl.o
@ -510,7 +510,7 @@ ifeq ($(ARCH),ARM)
SPI_TARGET=stm32
# Partition trailers in sectors 1-2, see hal/stm32f4.c
ifeq ($(CUSTOM_PARTITION_TRAILER),1)
LSCRIPT_IN=hal/stm32f4-trailer.ld
$(call LSCRIPT_IN_DEFAULT,hal/stm32f4-trailer.ld)
endif
endif
@ -682,7 +682,7 @@ ifeq ($(ARCH),ARM)
WOLFBOOT_ORIGIN=0x0C000000
else
WOLFBOOT_ORIGIN=0x08000000
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
endif
@ -694,7 +694,7 @@ ifeq ($(ARCH),ARM)
WOLFBOOT_ORIGIN=0x0C000000
else
WOLFBOOT_ORIGIN=0x08000000
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
SPI_TARGET=stm32
endif
@ -704,7 +704,7 @@ ifeq ($(ARCH),ARM)
CFLAGS+=-Ihal
ARCH_FLASH_OFFSET=0x08000000
WOLFBOOT_ORIGIN=0x08000000
LSCRIPT_IN=hal/$(TARGET).ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET).ld)
SPI_TARGET=stm32
endif
@ -713,7 +713,7 @@ ifeq ($(ARCH),ARM)
CFLAGS+=-Ihal
ARCH_FLASH_OFFSET=0x08000000
WOLFBOOT_ORIGIN=0x08000000
LSCRIPT_IN=hal/$(TARGET).ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET).ld)
SPI_TARGET=stm32
endif
@ -724,7 +724,7 @@ ifeq ($(ARCH),ARM)
# reached through the Secure SBUS alias, which the HAL derives from it.
ARCH_FLASH_OFFSET=0x12000000
WOLFBOOT_ORIGIN=0x12000000
LSCRIPT_IN=hal/$(TARGET).ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET).ld)
SPI_TARGET=psoc_c3
# Board wiring. Defaults match the PSOC Control C3 evaluation kit; override
# for another variant.
@ -782,13 +782,13 @@ ifeq ($(ARCH),ARM)
BOOTLOADER_PARTITION_SIZE=$$(( ($(WOLFBOOT_PARTITION_BOOT_ADDRESS) | 0x10000000) - $(WOLFBOOT_ORIGIN) - 0x40))
endif
ifeq ($(TZEN),1)
LSCRIPT_IN=hal/$(TARGET)-tz.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-tz.ld)
OBJS+=hal/psoc_e8_tz.o
# wolfHSM NVM in the RRAM user area, Secure.
WOLFBOOT_KEYVAULT_ADDRESS?=0x32040000
WOLFBOOT_KEYVAULT_SIZE?=0x10000
else
LSCRIPT_IN=hal/$(TARGET).ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET).ld)
endif
# Board wiring, defaulted for KIT_PSE84_AI.
PSOC_E8_UART_SCB?=2
@ -830,7 +830,7 @@ ifeq ($(ARCH),ARM)
ARCH_FLASH_OFFSET=0x00000000
WOLFBOOT_ORIGIN=0x00000000
ifneq ($(TZEN),1)
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
endif
@ -842,7 +842,7 @@ ifeq ($(ARCH),ARM)
WOLFBOOT_ORIGIN=0x0C000000
else
WOLFBOOT_ORIGIN=0x08000000
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
SPI_TARGET=stm32
ifneq ($(DEBUG),0)
@ -868,9 +868,9 @@ ifeq ($(ARCH),ARM)
ARCH_FLASH_OFFSET=0x10000000
WOLFBOOT_ORIGIN=0x10000000
ifeq ($(TZEN),1)
LSCRIPT_IN=hal/$(TARGET).ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET).ld)
else
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
SPI_TARGET=raspberrypi_pico
CFLAGS+=-DPICO_SDK_PATH=$(PICO_SDK_PATH)
@ -1426,7 +1426,7 @@ ifeq ($(ARCH),RISCV64)
OBJS+=src/riscv_sbi.o
endif
# Use M-mode specific linker script
LSCRIPT_IN:=hal/$(TARGET)-m.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-m.ld)
# Boot mode 2: reserve the last eNVM page for the signed manifest the UBL
# stub verifies (hal/mpfs250-m.ld); `make wolfboot_envm_signed.bin` fills it.
ifeq ($(MPFS_ENVM_MANIFEST),1)
@ -1464,7 +1464,7 @@ ifeq ($(ARCH),RISCV64)
CFLAGS+=-DWOLFBOOT_DUALBOOT
ifeq ($(MPFS_L2LIM),1)
# L2-LIM mode: wolfBoot in on-chip SRAM, loaded by HSS (no DDR)
LSCRIPT_IN:=hal/$(TARGET)-hss.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-hss.ld)
else
# DDR mode (default): full MMU and FDT support
CFLAGS+=-DMMU
@ -1486,7 +1486,11 @@ ifeq ($(ARCH),RISCV64)
# Boot mode 2 UBL stub: LIM-resident, verifies the eNVM wolfBoot manifest
# in place and jumps; no update path (hal/mpfs250_ubl.c).
ifeq ($(TARGET),mpfs250_ubl)
LSCRIPT_IN:=hal/mpfs250_ubl.ld
# UBL stub has its own layout; overrides the generic M-mode default
# above (a user-provided LSCRIPT_IN still wins).
ifeq ($(LSCRIPT_IN_USER),)
LSCRIPT_IN:=hal/mpfs250_ubl.ld
endif
UPDATE_OBJS:=
# mcycle rate for hal_get_timer_us(): the stub runs at the reset clock
CFLAGS+=-DRISCV_SMODE_TIMER_FREQ=80000000UL
@ -1715,7 +1719,7 @@ endif
ifeq ($(TARGET),mcxw)
CORTEX_M33=1
ifneq ($(TZEN),1)
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
CFLAGS+=\
-I$(MCUXPRESSO_DRIVERS) \
@ -1768,7 +1772,7 @@ endif
ifeq ($(TARGET),mcxn)
CORTEX_M33=1
ifneq ($(TZEN),1)
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
CFLAGS+=\
-I$(MCUXPRESSO_DRIVERS) \
@ -1823,7 +1827,7 @@ ifeq ($(TARGET),rw612)
CORTEX_M33=1
ARCH_FLASH_OFFSET=0x08000000
ifneq ($(TZEN),1)
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
MCUXPRESSO_FLASH_CONFIG?=$(MCUXPRESSO_PROJECT_TEMPLATE)/../flash_config
CFLAGS+=\
@ -1864,13 +1868,13 @@ endif
ifeq ($(TARGET),nrf5340)
ifneq ($(TZEN), 1)
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
endif
ifeq ($(TARGET),nrf54l)
ifneq ($(TZEN), 1)
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
endif
@ -1932,9 +1936,9 @@ ifeq ($(TARGET),imx_rt)
endif
ifeq ($(TARGET_IMX_HAB),1)
LSCRIPT_IN:=hal/$(TARGET)_hab.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)_hab.ld)
else
LSCRIPT_IN:=hal/$(TARGET).ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET).ld)
endif
ifeq ($(MCUXPRESSO_CPU),MIMXRT1064DVL6A)
@ -2396,7 +2400,7 @@ endif
ifeq ($(TARGET),lpc55s69)
ifneq ($(TZEN),1)
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
CFLAGS+=\
-I$(MCUXPRESSO_PROJECT_TEMPLATE) \
@ -2604,9 +2608,9 @@ ifeq ("${FSP}", "1")
ifeq ($(filter-out $(STAGE1),1),)
# building stage1
ifeq ($(FSP_TGL), 1)
LSCRIPT_IN = ../hal/x86_fsp_tgl_stage1.ld
$(call LSCRIPT_IN_DEFAULT,../hal/x86_fsp_tgl_stage1.ld)
else
LSCRIPT_IN = ../hal/$(TARGET)_stage1.ld
$(call LSCRIPT_IN_DEFAULT,../hal/$(TARGET)_stage1.ld)
endif
# using ../wolfboot.map as stage1 is built from stage1 sub-directory
LDFLAGS = --defsym main=0x`nm ../wolfboot.elf | grep -w main | awk '{print $$1}'` \
@ -2649,9 +2653,9 @@ ifeq ("${FSP}", "1")
else
# building wolfBoot
ifeq ($(FSP_TGL), 1)
LSCRIPT_IN = hal/x86_fsp_tgl.ld.in
$(call LSCRIPT_IN_DEFAULT,hal/x86_fsp_tgl.ld.in)
else
LSCRIPT_IN = hal/$(TARGET).ld.in
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET).ld.in)
endif
LDFLAGS = --gc-sections --entry=main -T $(LSCRIPT) -Map=wolfboot.map
CFLAGS += -fno-stack-protector -fno-PIC -fno-pie -mno-mmx -mno-sse -Os -DDEBUG_UART
@ -3065,14 +3069,18 @@ ifeq ($(ARCH), AURIX)
# HighTec's ancient ARM ld cannot parse the BSP linker-script fragments.
# Flatten them at parse time with the wolfHSM port's ld-flatten.sh.
# Paths are relative to this arch.mk, which is included from both the
# wolfBoot root and test-app directories.
# wolfBoot root and test-app directories. A user-provided LSCRIPT_IN
# is used as-is; only the stock HAL script goes through the flattener
# (its output lands in config/).
ARCHMK_DIR:=$(dir $(lastword $(MAKEFILE_LIST)))
LSCRIPT_IN=$(ARCHMK_DIR)config/$(TARGET)_flat.ld
ifeq ($(filter clean keysclean,$(MAKECMDGOALS)),)
LD_FLATTEN_OUT:=$(shell $(WOLFHSM_INFINEON_TC3XX)/tchsm-server/ld-flatten.sh \
$(ARCHMK_DIR)hal/$(TARGET).ld $(LSCRIPT_IN) $(TC3_DIR)/tc3 && echo OK)
ifneq ($(LD_FLATTEN_OUT),OK)
$(error ld-flatten.sh failed for hal/$(TARGET).ld)
ifeq ($(LSCRIPT_IN),)
LSCRIPT_IN:=$(ARCHMK_DIR)config/$(TARGET)_flat.ld
ifeq ($(filter clean keysclean,$(MAKECMDGOALS)),)
LD_FLATTEN_OUT:=$(shell $(WOLFHSM_INFINEON_TC3XX)/tchsm-server/ld-flatten.sh \
$(ARCHMK_DIR)hal/$(TARGET).ld $(LSCRIPT_IN) $(TC3_DIR)/tc3 && echo OK)
ifneq ($(LD_FLATTEN_OUT),OK)
$(error ld-flatten.sh failed for hal/$(TARGET).ld)
endif
endif
endif
else ifeq ($(HT_LLVM),1)
@ -3229,9 +3237,9 @@ ifeq ($(ARCH), AURIX)
# Linker scripts ship with the port, not in hal/.
ifeq ($(TARGET), aurix_tc4xx_csrm)
LSCRIPT_IN=$(TC4_WB_DIR)/csrm/aurix_tc4xx_csrm.ld
$(call LSCRIPT_IN_DEFAULT,$(TC4_WB_DIR)/csrm/aurix_tc4xx_csrm.ld)
else
LSCRIPT_IN=$(TC4_WB_DIR)/aurix_tc4xx.ld
$(call LSCRIPT_IN_DEFAULT,$(TC4_WB_DIR)/aurix_tc4xx.ld)
endif
CFLAGS += \
-I$(TC4_LLD_DIR) \
@ -3338,7 +3346,11 @@ ifeq ($(ARCH), AURIX)
# Full-system CSRM wolfBoot target leaves host release to tchsm-server.
ifeq ($(AURIX_TC4_FULLSYS),1)
CFLAGS += -DWOLFBOOT_AURIX_TC4XX_FULLSYS
LSCRIPT_IN=$(TC4_WB_DIR)/csrm/aurix_tc4xx_csrm_fullsys.ld
# Full-system layout overrides the per-port default above; a
# user-provided LSCRIPT_IN still wins.
ifeq ($(LSCRIPT_IN_USER),)
LSCRIPT_IN:=$(TC4_WB_DIR)/csrm/aurix_tc4xx_csrm_fullsys.ld
endif
endif
endif

View File

@ -4,5 +4,5 @@ config:
rm -f ../config/target.ld
rm -f ../.config
rm -f ../include/target.h
@$(foreach q, $(CONFIG_VARS), a=$($q); echo -n $q \? [$$a] :; a=$($q); read SH_$q; test -z $$SH_$q && SH_$q=$$a; echo "$q?=$$SH_$q" >> ../.config;)
@$(foreach q, $(CONFIG_VARS), a=$($q); echo -n $q \? [$$a] :; a=$($q); read SH_$q; test -z $$SH_$q && SH_$q=$$a; test -n "$$SH_$q" && echo "$q?=$$SH_$q" >> ../.config;)

View File

@ -114,6 +114,31 @@ trailer sector of room on top — see the sizing guide in
[firmware_update.md](firmware_update.md#independent-partition-sizing).
Not supported with `ENCRYPT` or `PULL_LINKER_DEFINES`.
### Custom linker script
Each target ships a linker script (e.g. `hal/stm32f4.ld`) that is selected by
the build system based on the target and active options (TZEN, encryption,
trailers, ...). To use your own script instead, set `LSCRIPT_IN` to its path,
either in the .config file, in the environment, or on the make command line:
```sh
make TARGET=stm32f4 LSCRIPT_IN=/path/to/my.ld
```
A user-provided `LSCRIPT_IN` wins over the target-specific default; when unset,
the build falls back to the script of the target, then to `hal/$(TARGET).ld`.
The script is processed by the same substitution pipeline as the included ones,
so it can (and should) use the same `@PLACEHOLDERS@` (e.g.
`@WOLFBOOT_PARTITION_BOOT_ADDRESS@`, `@WOLFBOOT_PARTITION_SIZE@`,
`@ARCH_FLASH_OFFSET@`); the substituted output is written to `config/target.ld`.
Notes:
- With ARMClang (`USE_ARMCLANG=1`) the script must be a `.sct` scatter file.
- On two-stage targets (e.g. x86) the same script is used for both stages.
- The script must place the bootloader sections so that they fit the flash
geometry configured above; wolfBoot does not validate the layout.
## Bootloader features
A number of characteristics can be turned on/off during wolfBoot compilation. Bootloader size,

View File

@ -1,5 +1,5 @@
ARCH_FLASH_OFFSET=0x08000000
LSCRIPT_IN=hal/stm32wb.ld
$(call LSCRIPT_IN_DEFAULT,hal/stm32wb.ld)
CFLAGS+=-DWHAL_CFG_NO_TIMEOUT

View File

@ -1,5 +1,5 @@
ARCH_FLASH_OFFSET=0x08000000
LSCRIPT_IN=hal/stm32wba.ld
$(call LSCRIPT_IN_DEFAULT,hal/stm32wba.ld)
CFLAGS+=-DWHAL_CFG_NO_TIMEOUT

View File

@ -1910,7 +1910,11 @@ ifeq ($(RAM_CODE),1)
ifeq ($(ENCRYPT),1)
ifeq ($(ENCRYPT_WITH_CHACHA),1)
ifneq ($(WOLFHAL),1)
LSCRIPT_IN=hal/$(TARGET)_chacha_ram.ld
# RAM+ChaCha layout overrides the target default set earlier; a
# user-provided LSCRIPT_IN still wins.
ifeq ($(LSCRIPT_IN_USER),)
LSCRIPT_IN:=hal/$(TARGET)_chacha_ram.ld
endif
endif
endif
endif

View File

@ -17,7 +17,16 @@ CFLAGS:=-D"__WOLFBOOT"
CFLAGS+=-Werror -Wextra -nostdlib
LDFLAGS:=
LSCRIPT:=loader_stage1.ld
LSCRIPT_IN:=../hal/$(TARGET)_stage1.ld
# Capture the user value (command line, environment, .config) before any
# default below; arch.mk/options.mk use this marker to let a user-provided
# LSCRIPT_IN win over their target refinements, same as the top-level Makefile.
LSCRIPT_IN_USER:=$(LSCRIPT_IN)
# Default stage1 script. Targets that share a script (the x86 FSP TGL
# boards use hal/x86_fsp_tgl_stage1.ld) set LSCRIPT_IN in arch.mk, so
# only default when the per-target file (or its .ld.in template) exists.
ifneq ($(wildcard ../hal/$(TARGET)_stage1.ld ../hal/$(TARGET)_stage1.ld.in),)
$(call LSCRIPT_IN_DEFAULT,../hal/$(TARGET)_stage1.ld)
endif
LSCRIPT_FLAGS:=
LD_START_GROUP:=-Wl,--start-group
LD_END_GROUP:=-Wl,--end-group

View File

@ -4,6 +4,9 @@ SIGN_KEY?=../wolfboot_signing_private_key.der
X86FSP_PATH?=../`dirname $(FSP_M_BIN)`
# Generate the stage1 script from its .ld.in template; a user-provided
# LSCRIPT_IN is used as-is.
ifeq ($(LSCRIPT_IN_USER),)
$(LSCRIPT_IN): $(WOLFBOOT_ROOT)/hal/$(LSCRIPT_IN).in FORCE
@cat $(WOLFBOOT_ROOT)/hal/$(LSCRIPT_IN).in | \
sed -e "s/@FSP_T_BASE@/$(FSP_T_BASE)/g" | \
@ -13,6 +16,7 @@ $(LSCRIPT_IN): $(WOLFBOOT_ROOT)/hal/$(LSCRIPT_IN).in FORCE
sed -e "s/@UCODE0_BASE@/$(UCODE0_BASE)/g" | \
sed -e "s/@UCODE1_BASE@/$(UCODE1_BASE)/g" \
> $@
endif
./boot_x86_fsp_start.o: boot_x86_fsp_start.S
@echo "\t[NASM-$(ARCH)] $@"

View File

@ -97,14 +97,21 @@ if(NOT DEFINED BOOTLOADER_PARTITION_SIZE)
OUTPUT_FORMAT HEXADECIMAL)
endif()
get_filename_component(WOLFBOOT_LSCRIPT ${CMAKE_SOURCE_DIR}/${WOLFBOOT_LSCRIPT_TEMPLATE} NAME)
set(WOLFBOOT_LSCRIPT ${CMAKE_CURRENT_BINARY_DIR}/${WOLFBOOT_LSCRIPT})
# The generated bootloader script gets a fixed name so a user template
# sharing a basename with the app's template cannot collide in the build dir
set(WOLFBOOT_LSCRIPT ${CMAKE_CURRENT_BINARY_DIR}/wolfboot_${WOLFBOOT_TARGET}.ld)
get_filename_component(APP_LSCRIPT ${APP_LSCRIPT_TEMPLATE} NAME)
set(APP_LSCRIPT ${CMAKE_CURRENT_BINARY_DIR}/${APP_LSCRIPT})
# generate linker script for bootloader
configure_file(${CMAKE_SOURCE_DIR}/${WOLFBOOT_LSCRIPT_TEMPLATE} ${WOLFBOOT_LSCRIPT})
# generate linker script for bootloader; an absolute user-provided template
# is used as-is, relative ones are resolved against the source directory
if(IS_ABSOLUTE ${WOLFBOOT_LSCRIPT_TEMPLATE})
set(WOLFBOOT_LSCRIPT_SRC ${WOLFBOOT_LSCRIPT_TEMPLATE})
else()
set(WOLFBOOT_LSCRIPT_SRC ${CMAKE_SOURCE_DIR}/${WOLFBOOT_LSCRIPT_TEMPLATE})
endif()
configure_file(${WOLFBOOT_LSCRIPT_SRC} ${WOLFBOOT_LSCRIPT})
# generate linker script for app
configure_file(${APP_LSCRIPT_TEMPLATE} ${APP_LSCRIPT})

View File

@ -102,7 +102,7 @@ ifeq ($(ARCH),)
DISK_LOCK_PASSWORD?=
FLASH_OTP_KEYSTORE?=0
BIG_ENDIAN?=0
FLASH_MULTI_SECTOR_ERASE=0
FLASH_MULTI_SECTOR_ERASE?=0
WOLFHSM_CLIENT=0
WOLFHSM_CLIENT_ID?=1
endif
@ -149,7 +149,7 @@ CONFIG_VARS:= ARCH TARGET SIGN HASH MCUXSDK MCUXPRESSO MCUXPRESSO_CPU MCUXPRESSO
ENCRYPT_WITH_CHACHA ENCRYPT_WITH_AES128 ENCRYPT_WITH_AES256 ARMORED \
LMS_LEVELS LMS_HEIGHT LMS_WINTERNITZ \
WOLFBOOT_UNIVERSAL_KEYSTORE \
XMSS_PARAMS \
XMSS_PARAMS LSCRIPT_IN \
ELF BIG_ENDIAN \
GZIP FIT_RAMDISK \
COMPRESSED_UPDATE WOLFBOOT_COMPRESSED_WINDOW \
@ -171,3 +171,9 @@ CONFIG_VARS:= ARCH TARGET SIGN HASH MCUXSDK MCUXPRESSO MCUXPRESSO_CPU MCUXPRESSO
CERT_CHAIN_GEN_CA_HASH \
CERT_CHAIN_NAME_CONSTRAINTS \
ENCRYPT_CACHE
# ?= treats a defined-but-empty value as already set, so a stale
# LSCRIPT_IN?= line in .config (or an exported empty env var) would skip
# every target default. Assign $1 to LSCRIPT_IN only when it is undefined
# or empty.
LSCRIPT_IN_DEFAULT=$(if $(strip $(LSCRIPT_IN)),,$(eval LSCRIPT_IN:=$1))