diff options
Diffstat (limited to 'Makefile')
-rw-r--r-- | Makefile | 166 |
1 files changed, 108 insertions, 58 deletions
@@ -1,5 +1,6 @@ -# Copyright (c) 2015-2016, NORDUnet A/S -# All rights reserved. +# Copyright (c) 2015-2017, NORDUnet A/S All rights reserved. +# Copyright: 2020, The Commons Conservancy Cryptech Project +# SPDX-License-Identifier: BSD-3-Clause # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are @@ -11,9 +12,9 @@ # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # -# - Neither the name of the NORDUnet nor the names of its contributors may -# be used to endorse or promote products derived from this software -# without specific prior written permission. +# - Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS # IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -27,27 +28,48 @@ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# A couple features that can be enabled at build time, but are not turned on +# by default: +# DO_PROFILING: Enable gmon profiling. See libraries/libprof/README.md for +# more details. +# DO_TASK_METRICS: Enable task metrics - average/max time between yields. This +# can be helpful when experimentally adding yields to improve responsiveness. +# +# To enable, run `make DO_PROFILING=1 DO_TASK_METRICS=1` +# (or DO_PROFILING=xyzzy - `make` just cares that the symbol is defined) + +# export all variables to child processes by default +.EXPORT_ALL_VARIABLES: + # absolute path, because we're going to be passing things to sub-makes -export TOPLEVEL = $(shell pwd) +TOPLEVEL = $(abspath .) +CRYPTECH_ROOT = $(abspath ../..) # define board: dev-bridge or alpha BOARD = TARGET_CRYPTECH_ALPHA -# Location of the Libraries folder from the STM32F4 Standard Peripheral Library LIBS_DIR = $(TOPLEVEL)/libraries MBED_DIR = $(LIBS_DIR)/mbed CMSIS_DIR = $(MBED_DIR)/targets/cmsis/TARGET_STM/TARGET_STM32F4 BOARD_DIR = $(CMSIS_DIR)/$(BOARD) -RTOS_DIR = $(MBED_DIR)/rtos -export LIBTFM_DIR = $(LIBS_DIR)/thirdparty/libtfm -export LIBHAL_DIR = $(LIBS_DIR)/libhal -export LIBCLI_DIR = $(LIBS_DIR)/libcli -export LIBS = $(MBED_DIR)/libstmf4.a $(RTOS_DIR)/librtos.a +LIBHAL_SRC = $(CRYPTECH_ROOT)/sw/libhal +LIBHAL_BLD = $(LIBS_DIR)/libhal + +LIBCLI_SRC = $(CRYPTECH_ROOT)/user/paul/libcli +LIBCLI_BLD = $(LIBS_DIR)/libcli + +LIBTFM_SRC = $(CRYPTECH_ROOT)/sw/thirdparty/libtfm +LIBTFM_BLD = $(LIBS_DIR)/libtfm + +LIBPROF_SRC = $(LIBS_DIR)/libprof +LIBPROF_BLD = $(LIBS_DIR)/libprof + +LIBS = $(MBED_DIR)/libstmf4.a # linker script -export LDSCRIPT = $(BOARD_DIR)/TOOLCHAIN_GCC_ARM/STM32F429BI.ld -export BOOTLOADER_LDSCRIPT = $(BOARD_DIR)/TOOLCHAIN_GCC_ARM/STM32F429BI_bootloader.ld +LDSCRIPT = $(BOARD_DIR)/TOOLCHAIN_GCC_ARM/STM32F429BI.ld +BOOTLOADER_LDSCRIPT = $(BOARD_DIR)/TOOLCHAIN_GCC_ARM/STM32F429BI_bootloader.ld # board-specific objects, to link into every project BOARD_OBJS = \ @@ -68,35 +90,50 @@ BOARD_OBJS += \ $(TOPLEVEL)/stm-sdram.o \ $(TOPLEVEL)/stm-flash.o endif -export BOARD_OBJS # cross-building tools PREFIX=arm-none-eabi- -export CC=$(PREFIX)gcc -export AS=$(PREFIX)as -export AR=$(PREFIX)ar -export OBJCOPY=$(PREFIX)objcopy -export OBJDUMP=$(PREFIX)objdump -export SIZE=$(PREFIX)size +CC=$(PREFIX)gcc +AS=$(PREFIX)as +AR=$(PREFIX)ar +OBJCOPY=$(PREFIX)objcopy +OBJDUMP=$(PREFIX)objdump +SIZE=$(PREFIX)size + +# The Alpha is a development platform, so set GCC optimization to a +# level suitable for debugging. Recent versions of GCC have a special +# optimization setting -Og for exactly this purpose, so we use it, +# along with the flag to enable gdb symbols. Note that some libraries +# (in particular, libtfm) may need different optimization settings, +# which is why this needs to remain a separate makefile variable. +# +# If you really want optimization without debugging support, try -O2 +# or -O3. + +STM32_CFLAGS_OPTIMIZATION ?= -ggdb -Og # whew, that's a lot of cflags -CFLAGS = -ggdb -O2 -Wall -Warray-bounds #-Wextra +CFLAGS = $(STM32_CFLAGS_OPTIMIZATION) -Wall -Warray-bounds -Wextra CFLAGS += -mcpu=cortex-m4 -mthumb -mlittle-endian -mthumb-interwork CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 CFLAGS += -DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DSTM32F429xx CFLAGS += -D__CORTEX_M4 -DTARGET_STM -DTARGET_STM32F4 -DTARGET_STM32F429ZI -DTOOLCHAIN_GCC -D__FPU_PRESENT=1 -D$(BOARD) +CFLAGS += -DENABLE_WEAK_FUNCTIONS CFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections CFLAGS += -std=c99 -CFLAGS += -I $(TOPLEVEL) -CFLAGS += -I $(MBED_DIR)/api -CFLAGS += -I $(MBED_DIR)/rtos/rtos -CFLAGS += -I $(MBED_DIR)/rtos/rtx/TARGET_CORTEX_M -CFLAGS += -I $(MBED_DIR)/targets/cmsis -CFLAGS += -I $(MBED_DIR)/targets/cmsis/TARGET_STM/TARGET_STM32F4 -CFLAGS += -I $(MBED_DIR)/targets/cmsis/TARGET_STM/TARGET_STM32F4/$(BOARD) -CFLAGS += -I $(MBED_DIR)/targets/hal/TARGET_STM/TARGET_STM32F4 -CFLAGS += -I $(MBED_DIR)/targets/hal/TARGET_STM/TARGET_STM32F4/$(BOARD) -export CFLAGS +CFLAGS += -I$(TOPLEVEL) +CFLAGS += -I$(MBED_DIR)/api +CFLAGS += -I$(MBED_DIR)/targets/cmsis +CFLAGS += -I$(MBED_DIR)/targets/cmsis/TARGET_STM/TARGET_STM32F4 +CFLAGS += -I$(MBED_DIR)/targets/cmsis/TARGET_STM/TARGET_STM32F4/$(BOARD) +CFLAGS += -I$(MBED_DIR)/targets/hal/TARGET_STM/TARGET_STM32F4 +CFLAGS += -I$(MBED_DIR)/targets/hal/TARGET_STM/TARGET_STM32F4/$(BOARD) +ifdef DO_TASK_METRICS +CFLAGS += -DDO_TASK_METRICS +endif +ifdef DO_TIMING +CFLAGS += -DDO_TIMING +endif %.o : %.c $(CC) $(CFLAGS) -c -o $@ $< @@ -104,59 +141,72 @@ export CFLAGS %.o : %.S $(CC) $(CFLAGS) -c -o $@ $< -all: board-test cli-test libhal-test hsm - -init: - git submodule update --init --recursive --remote +ifdef DO_PROFILING +CFLAGS += -pg -DDO_PROFILING +LIBS += $(LIBPROF_BLD)/libprof.a +all: hsm +else +all: board-test cli-test libhal-test hsm bootloader +endif -$(MBED_DIR)/libstmf4.a: +$(MBED_DIR)/libstmf4.a: .FORCE $(MAKE) -C $(MBED_DIR) -board-test: $(BOARD_OBJS) $(LIBS) +board-test: $(BOARD_OBJS) $(LIBS) .FORCE $(MAKE) -C projects/board-test -cli-test: $(BOARD_OBJS) $(LIBS) $(LIBCLI_DIR)/libcli.a +cli-test: $(BOARD_OBJS) $(LIBS) $(LIBCLI_BLD)/libcli.a $(LIBHAL_BLD)/libhal.a .FORCE $(MAKE) -C projects/cli-test -$(RTOS_DIR)/librtos.a: - $(MAKE) -C $(RTOS_DIR) +$(LIBTFM_BLD)/libtfm.a: .FORCE + $(MAKE) -C $(LIBTFM_BLD) PREFIX=$(PREFIX) -rtos-test: $(RTOS_OBJS) $(LIBS) - $(MAKE) -C projects/rtos-test +$(LIBHAL_BLD)/libhal.a: $(LIBTFM_BLD)/libtfm.a .FORCE + $(MAKE) -C $(LIBHAL_BLD) IO_BUS=fmc RPC_MODE=server RPC_TRANSPORT=serial KS=flash HASH_CORES=yes libhal.a -$(LIBTFM_DIR)/libtfm.a: - $(MAKE) -C $(LIBTFM_DIR) PREFIX=$(PREFIX) +$(LIBCLI_BLD)/libcli.a: .FORCE + $(MAKE) -C $(LIBCLI_BLD) -$(LIBHAL_DIR)/libhal.a: $(LIBTFM_DIR)/libtfm.a - $(MAKE) -C $(LIBHAL_DIR) IO_BUS=fmc RPC_SERVER=yes RPC_TRANSPORT=serial KS=volatile libhal.a +$(LIBPROF_BLD)/libprof.a: .FORCE + $(MAKE) -C $(LIBPROF_BLD) -$(LIBCLI_DIR)/libcli.a: - $(MAKE) -C $(LIBCLI_DIR) - -libhal-test: $(BOARD_OBJS) $(LIBS) $(LIBHAL_DIR)/libhal.a +libhal-test: $(BOARD_OBJS) $(LIBS) $(LIBHAL_BLD)/libhal.a .FORCE $(MAKE) -C projects/libhal-test -hsm: $(BOARD_OBJS) $(LIBS) $(LIBHAL_DIR)/libhal.a +hsm: $(BOARD_OBJS) $(LIBS) $(LIBHAL_BLD)/libhal.a $(LIBCLI_BLD)/libcli.a .FORCE $(MAKE) -C projects/hsm -bootloader: $(BOARD_OBJS) $(LIBS) +bootloader: $(BOARD_OBJS) $(LIBS) $(LIBHAL_BLD)/libhal.a .FORCE $(MAKE) -C projects/bootloader +modexpng-test: $(BOARD_OBJS) $(LIBS) .FORCE + $(MAKE) -C projects/modexpng-test + # don't automatically delete objects, to avoid a lot of unnecessary rebuilding .SECONDARY: $(BOARD_OBJS) -.PHONY: board-test rtos-test libhal-test cli-test +.PHONY: board-test libhal-test cli-test hsm bootloader + +# We don't (and shouldn't) know enough about libraries and projects to +# know whether they need rebuilding or not, so we let their Makefiles +# decide that. Which means we always need to run all the sub-makes. +# We could do this with .PHONY (which is supposedly more "efficient") +# but using a .FORCE target is simpler once one takes inter-library +# dependency specifications into account. + +.FORCE: # (sic) clean: rm -f $(BOARD_OBJS) + $(MAKE) -C $(LIBHAL_BLD) clean $(MAKE) -C projects/board-test clean $(MAKE) -C projects/cli-test clean - $(MAKE) -C projects/rtos-test clean $(MAKE) -C projects/libhal-test clean $(MAKE) -C projects/hsm clean + $(MAKE) -C projects/bootloader clean distclean: clean $(MAKE) -C $(MBED_DIR) clean - $(MAKE) -C $(RTOS_DIR) clean - $(MAKE) -C $(LIBHAL_DIR) clean - $(MAKE) -C $(LIBTFM_DIR) clean + $(MAKE) -C $(LIBTFM_BLD) clean + $(MAKE) -C $(LIBCLI_BLD) clean + $(MAKE) -C $(LIBPROF_BLD) clean |