wolfBoot-examples/sim-OTA/Makefile

209 lines
6.8 KiB
Makefile

# Inherit our settings for wolfBoot, TARGET, ARCH, etc.
-include sim.config
# Make sure environment variables do not corrupt the binary output for MacOS users
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
APPSRC:=./app
SEVSRC:=./fwserver
WOLFBOOT_ROOT:=./wolfBoot
WOLFSSL_ROOT:=./wolfBoot/lib/wolfssl
WOLFTPM_ROOT:=/usr/local/include/wolftpm/
WOLFMQTT_ROOT:=./wolfMQTT
DEBUG:=0
include $(WOLFBOOT_ROOT)/tools/config.mk
export WOLFBOOT_ROOT
ifneq ("$(wildcard $(WOLFBOOT_ROOT)/tools/keytools/keygen)","")
KEYGEN_TOOL:=$(WOLFBOOT_ROOT)/tools/keytools/keygen
else
ifneq ("$(wildcard $(WOLFBOOT_ROOT)/tools/keytools/keygen.exe)","")
KEYGEN_TOOL:=$(WOLFBOOT_ROOT)/tools/keytools/keygen.exe
else
KEYGEN_TOOL:=python3 $(WOLFBOOT_ROOT)/tools/keytools/keygen.py
endif
endif
ifneq ("$(wildcard $(WOLFBOOT_ROOT)/tools/keytools/sign)","")
SIGN_TOOL:=$(WOLFBOOT_ROOT)/tools/keytools/sign
else
ifneq ("$(wildcard $(WOLFBOOT_ROOT)/tools/keytools/sign.exe)","")
SIGN_TOOL:=$(WOLFBOOT_ROOT)/tools/keytools/sign.exe
else
SIGN_TOOL:=python3 $(WOLFBOOT_ROOT)/tools/keytools/sign.py
endif
endif
# Signing and test variables (used by test-sim-internal-flash-with-update)
PRIVATE_KEY:=$(WOLFBOOT_ROOT)/wolfboot_signing_private_key.der
SIGN_ENV=IMAGE_HEADER_SIZE=$(IMAGE_HEADER_SIZE) \
WOLFBOOT_PARTITION_SIZE=$(WOLFBOOT_PARTITION_SIZE) \
WOLFBOOT_SECTOR_SIZE=$(WOLFBOOT_SECTOR_SIZE) \
NVM_FLASH_WRITEONCE=$(NVM_FLASH_WRITEONCE) \
ML_DSA_LEVEL=$(ML_DSA_LEVEL) \
IMAGE_SIGNATURE_SIZE=$(IMAGE_SIGNATURE_SIZE) \
LMS_LEVELS=$(LMS_LEVELS) \
LMS_HEIGHT=$(LMS_HEIGHT) \
LMS_WINTERNITZ=$(LMS_WINTERNITZ) \
XMSS_PARAMS=$(XMSS_PARAMS)
SIGN_OPTIONS?=--ecc256
TEST_UPDATE_VERSION?=2
OTA_UPDATE_VERSION?=10
BINASSEMBLE:=$(WOLFBOOT_ROOT)/tools/bin-assemble/bin-assemble
DELTA_UPDATE_OPTIONS?=
ifeq ($(NVM_FLASH_WRITEONCE),1)
INVERSION=| tr "\000" "\377"
else
INVERSION=
endif
CFLAGS:=-Wall -Wstack-usage=1024 -ffreestanding -Wno-unused -DPLATFORM_$(TARGET) \
-I$(WOLFBOOT_ROOT)/include -I$(WOLFBOOT_ROOT) -I$(WOLFSSL_ROOT) \
-I$(WOLFTPM_ROOT) -I$(APPSRC) -I$(WOLFMQTT_ROOT) -DWOLFBOOT_MEASURED_PCR_A \
-DSIM_OTA=1
CFLAGS+=-DWOLFBOOT_HASH_SHA256
# fwserver CFLAGS
CFLAGS_SEV:=-g -ggdb -Wall -Wstack-usage=1024 -ffreestanding -Wno-unused \
-I$(WOLFSSL_ROOT) -I$(SEVSRC) -I$(WOLFMQTT_ROOT)
APP_OBJS:= \
$(APPSRC)/app_$(TARGET).o \
$(APPSRC)/tpm_handler.o \
$(APPSRC)/fwclient.o \
$(APPSRC)/mqttexample.o \
$(APPSRC)/mqttnet.o \
$(WOLFBOOT_ROOT)/hal/$(TARGET).o \
$(WOLFBOOT_ROOT)/src/libwolfboot.o
# Add objects for wolfMQTT support
APP_OBJS+= \
$(WOLFMQTT_ROOT)/src/libwolfmqtt_la-mqtt_client.o \
$(WOLFMQTT_ROOT)/src/libwolfmqtt_la-mqtt_packet.o \
$(WOLFMQTT_ROOT)/src/libwolfmqtt_la-mqtt_socket.o
# Add objects for fwserver
SEV_OBJS+= \
$(SEVSRC)/fwpush.o \
$(SEVSRC)/mqttexample.o \
$(SEVSRC)/mqttnet.o \
$(WOLFMQTT_ROOT)/src/libwolfmqtt_la-mqtt_client.o \
$(WOLFMQTT_ROOT)/src/libwolfmqtt_la-mqtt_packet.o \
$(WOLFMQTT_ROOT)/src/libwolfmqtt_la-mqtt_socket.o
# Link libwolfssl (full SSL + wolfCrypt) and macOS frameworks when needed
WOLFSSL_LDFLAGS := -L$(WOLFSSL_ROOT)/src/.libs -lwolfssl
ifeq ($(shell uname -s),Darwin)
WOLFSSL_LDFLAGS += -Wl,-rpath,$(WOLFSSL_ROOT)/src/.libs
WOLFSSL_LDFLAGS += -framework CoreFoundation -framework Security
else
WOLFSSL_LDFLAGS += -lm
endif
# Link libwolfTPM (full TPM support) and macOS frameworks when needed
WOLFTPM_LDFLAGS := -L/usr/local/lib -lwolftpm
ifeq ($(shell uname -s),Darwin)
WOLFTPM_LDFLAGS += -Wl,-rpath,/usr/local/lib
WOLFTPM_LDFLAGS += -framework CoreFoundation -framework Security
else
WOLFTPM_LDFLAGS += -lm
endif
# Inherit cross-compiler and similar settings from wolfBoot
include $(WOLFBOOT_ROOT)/arch.mk
# arch.mk sets OBJCOPY only when USE_GCC=1 (from wolfBoot options.mk); sim-OTA does not include it
OBJCOPY ?= objcopy
ifeq ($(DEBUG),0)
CFLAGS+=-Os -DNDEBUG -flto
else
CFLAGS+=-g -ggdb3
endif
vpath %.c $(dir $(WOLFSSL_ROOT)/src)
vpath %.c $(dir $(WOLFSSL_ROOT)/wolfcrypt/src)
vpath %.c $(dir $(WOLFBOOT_ROOT))/lib/wolfTPM/wolftpm
LDFLAGS:=$(CFLAGS)
LDFLAGS_SEV:=$(CFLAGS_SEV)
all: $(WOLFBOOT_ROOT)/wolfboot.elf app/image.elf fwserver/fwserver
$(WOLFBOOT_ROOT)/wolfboot.elf: wolfboot_target
cd $(WOLFBOOT_ROOT) && $(MAKE) WOLFBOOT_ROOT=$$(pwd) wolfboot.elf
app/image.bin: wolfboot_target app/image.elf
$(OBJCOPY) -O binary app/image.elf $@
$(SIZE) app/image.elf
app/image.elf: wolfboot_target $(APP_OBJS)
@echo "\t[LD] $@"
$(Q)$(LD) $(LDFLAGS) $(APP_OBJS) $(WOLFSSL_LDFLAGS) $(WOLFTPM_LDFLAGS) -o $@
@echo
fwserver/fwserver: wolfboot_target $(SEV_OBJS)
@echo "\t[LD] $@"
$(Q)$(LD) $(LDFLAGS_SEV) $(SEV_OBJS) $(WOLFSSL_LDFLAGS) -o $@
@echo
wolfboot_target: FORCE
cp -f sim.config $(WOLFBOOT_ROOT)/.config
cp ./hal-sim/sim.c $(WOLFBOOT_ROOT)/hal/sim.c
make -C $(WOLFBOOT_ROOT) include/target.h
wolfboot.bin: wolfBoot/wolfboot.elf
@echo "\t[BIN] $@"
$(Q)$(OBJCOPY) $(OBJCOPY_FLAGS) -O binary $^ $@
@echo
%.o:%.c
@echo "\t[CC-$(ARCH)] $@"
$(Q)$(CC) $(CFLAGS) -c -o $@ $^
%.o:%.S
@echo "\t[AS-$(ARCH)] $@"
$(Q)$(CC) $(CFLAGS) -c -o $@ $^
test-sim-internal-flash-with-update: wolfboot.bin app/image.elf FORCE
$(Q)cp app/image.elf app/image.bak.elf
$(Q)dd if=/dev/urandom bs=1k count=16 >> app/image.elf
# Create version 1 of the application (base image)
$(Q)$(SIGN_ENV) $(SIGN_TOOL) $(SIGN_OPTIONS) app/image.elf $(PRIVATE_KEY) 1
$(Q)cp app/image.bak.elf app/image.elf
$(Q)dd if=/dev/urandom bs=1k count=16 >> app/image.elf
$(Q)$(SIGN_ENV) $(SIGN_TOOL) $(SIGN_OPTIONS) app/image.elf $(PRIVATE_KEY) $(TEST_UPDATE_VERSION)
$(Q)dd if=/dev/zero bs=$$(($(WOLFBOOT_SECTOR_SIZE))) count=1 2>/dev/null $(INVERSION) > erased_sec.dd
# Sign the update image (version 2 by default)
# This command handles both standard and delta update modes based on DELTA_UPDATE_OPTIONS
# empty DELTA_UPDATE_OPTIONS (Without --delta): Produces image_v2_signed.bin
# DELTA_UPDATE_OPTIONS="--delta app/image_v1_signed.bin": Produces image_v2_signed_diff.bin
$(Q)$(SIGN_ENV) $(SIGN_TOOL) $(SIGN_OPTIONS) $(DELTA_UPDATE_OPTIONS) \
app/image.elf $(PRIVATE_KEY) $(TEST_UPDATE_VERSION)
# Sign the update image for OTA example
$(Q)$(SIGN_ENV) $(SIGN_TOOL) $(SIGN_OPTIONS) $(DELTA_UPDATE_OPTIONS) \
app/image.elf $(PRIVATE_KEY) $(OTA_UPDATE_VERSION)
$(Q)$(BINASSEMBLE) internal_flash.dd \
0 wolfboot.bin \
$$(($(WOLFBOOT_PARTITION_BOOT_ADDRESS) - $(ARCH_FLASH_OFFSET))) app/image_v1_signed.bin \
$$(($(WOLFBOOT_PARTITION_UPDATE_ADDRESS)-$(ARCH_FLASH_OFFSET))) app/image_v$(TEST_UPDATE_VERSION)_signed.bin \
$$(($(WOLFBOOT_PARTITION_SWAP_ADDRESS)-$(ARCH_FLASH_OFFSET))) erased_sec.dd
clean:
make -C $(WOLFBOOT_ROOT) clean
@rm -f *.bin *.elf $(OBJS) wolfboot.map *.bin *.hex src/*.o tags *.map
@rm -f app/*.elf app/*.bin app/image.map app/*.o fwserver/*.o fwserver/fwserver
FORCE:
.PHONY: FORCE clean all