| 
 | 1 | +# (SPDX-License-Identifier: CC-BY-4.0)  | 
 | 2 | + | 
 | 3 | +.PHONY: build run clean mlkem512_objs mlkem768_objs mlkem1024_objs mlkem_objs size size_objs  | 
 | 4 | +.DEFAULT_GOAL := all  | 
 | 5 | + | 
 | 6 | +Q ?= @  | 
 | 7 | +# Append cross-prefix for cross compilation  | 
 | 8 | +# Remove or ignore for native builds  | 
 | 9 | +CC  ?= gcc  | 
 | 10 | +SIZE ?= size  | 
 | 11 | +# When called from the root Makefile, CROSS_PREFIX has already been added here  | 
 | 12 | +ifeq (,$(findstring $(CROSS_PREFIX),$(CC)))  | 
 | 13 | +CC  := $(CROSS_PREFIX)$(CC)  | 
 | 14 | +endif  | 
 | 15 | + | 
 | 16 | +ifeq (,$(findstring $(CROSS_PREFIX),$(SIZE)))  | 
 | 17 | +SIZE  := $(CROSS_PREFIX)$(SIZE)  | 
 | 18 | +endif  | 
 | 19 | + | 
 | 20 | +# Part A:  | 
 | 21 | +#  | 
 | 22 | +# mlkem-native source and header files  | 
 | 23 | +#  | 
 | 24 | +# If you are not concerned about minimizing for a specific backend,  | 
 | 25 | +# you can just include _all_ source files into your build.  | 
 | 26 | +MLK_SOURCE_ALL := $(wildcard             \  | 
 | 27 | +	mlkem_native/mlkem/src/*.c           \  | 
 | 28 | +	mlkem_native/mlkem/src/**/*.c        \  | 
 | 29 | +	mlkem_native/mlkem/src/**/**/*.c     \  | 
 | 30 | +	mlkem_native/mlkem/src/**/**/**/*.c)  | 
 | 31 | +MLK_SOURCE:=$(foreach S,$(MLK_SOURCE_ALL),\  | 
 | 32 | +  $(if $(findstring /native/,$S),,$S))  | 
 | 33 | + | 
 | 34 | +INC=-Imlkem_native -Imlkem_native/mlkem -Imlkem_native/mlkem/src  | 
 | 35 | + | 
 | 36 | +BUILD_DIR=build  | 
 | 37 | +MLKEM512_DIR = $(BUILD_DIR)/mlkem512  | 
 | 38 | +MLKEM768_DIR = $(BUILD_DIR)/mlkem768  | 
 | 39 | +MLKEM1024_DIR = $(BUILD_DIR)/mlkem1024  | 
 | 40 | + | 
 | 41 | +MLKEM512_OBJS=$(patsubst %,$(MLKEM512_DIR)/%.o,$(MLK_SOURCE))  | 
 | 42 | +MLKEM768_OBJS=$(patsubst %,$(MLKEM768_DIR)/%.o,$(MLK_SOURCE))  | 
 | 43 | +MLKEM1024_OBJS=$(patsubst %,$(MLKEM1024_DIR)/%.o,$(MLK_SOURCE))  | 
 | 44 | + | 
 | 45 | +$(MLKEM512_OBJS): $(MLKEM512_DIR)/%.c.o: %.c  | 
 | 46 | +	$(Q)[ -d $(@D) ] || mkdir -p $(@D)  | 
 | 47 | +	$(Q)$(CC)  -nostdlib -DMLK_CONFIG_MULTILEVEL_WITH_SHARED -DMLK_CONFIG_PARAMETER_SET=512 $(INC) $(CFLAGS) -c $^ -o $@  | 
 | 48 | + | 
 | 49 | +$(MLKEM768_OBJS): $(MLKEM768_DIR)/%.c.o: %.c  | 
 | 50 | +	$(Q)[ -d $(@D) ] || mkdir -p $(@D)  | 
 | 51 | +	$(Q)$(CC) -nostdlib -DMLK_CONFIG_MULTILEVEL_NO_SHARED -DMLK_CONFIG_PARAMETER_SET=768 $(INC) $(CFLAGS) -c $^ -o $@  | 
 | 52 | + | 
 | 53 | +$(MLKEM1024_OBJS): $(MLKEM1024_DIR)/%.c.o: %.c  | 
 | 54 | +	$(Q)[ -d $(@D) ] || mkdir -p $(@D)  | 
 | 55 | +	$(Q)$(CC) -nostdlib -DMLK_CONFIG_MULTILEVEL_NO_SHARED -DMLK_CONFIG_PARAMETER_SET=1024 $(INC) $(CFLAGS) -c $^ -o $@  | 
 | 56 | + | 
 | 57 | +mlkem512_objs: $(MLKEM512_OBJS)  | 
 | 58 | +mlkem768_objs: $(MLKEM768_OBJS)  | 
 | 59 | +mlkem1024_objs: $(MLKEM1024_OBJS)  | 
 | 60 | +mlkem_objs: mlkem512_objs mlkem768_objs mlkem1024_objs  | 
 | 61 | + | 
 | 62 | +# Part B:  | 
 | 63 | +#  | 
 | 64 | +# Random number generator  | 
 | 65 | +#  | 
 | 66 | +# !!! WARNING !!!  | 
 | 67 | +#  | 
 | 68 | +# The randombytes() implementation used here is for TESTING ONLY.  | 
 | 69 | +# You MUST NOT use this implementation outside of testing.  | 
 | 70 | +#  | 
 | 71 | +# !!! WARNING !!!  | 
 | 72 | +RNG_SOURCE=$(wildcard test_only_rng/*.c)  | 
 | 73 | + | 
 | 74 | +# Part C:  | 
 | 75 | +#  | 
 | 76 | +# Your application source code  | 
 | 77 | +APP_SOURCE=$(wildcard *.c)  | 
 | 78 | + | 
 | 79 | +BIN=test_binary  | 
 | 80 | + | 
 | 81 | +CFLAGS := \  | 
 | 82 | +	-Wall \  | 
 | 83 | +	-Wextra \  | 
 | 84 | +	-Werror \  | 
 | 85 | +	-Wmissing-prototypes \  | 
 | 86 | +	-Wshadow \  | 
 | 87 | +	-Werror \  | 
 | 88 | +	-Wpointer-arith \  | 
 | 89 | +	-Wredundant-decls \  | 
 | 90 | +	-Wno-long-long \  | 
 | 91 | +	-Wno-unknown-pragmas \  | 
 | 92 | +	-Wno-unused-command-line-argument \  | 
 | 93 | +	-fomit-frame-pointer \  | 
 | 94 | +	-DMLK_CONFIG_NAMESPACE_PREFIX=mlkem \  | 
 | 95 | +	-std=c99 \  | 
 | 96 | +	-pedantic \  | 
 | 97 | +	-MMD \  | 
 | 98 | +	-O3 \  | 
 | 99 | +	$(CFLAGS)  | 
 | 100 | + | 
 | 101 | +BINARY_NAME_FULL=$(BUILD_DIR)/$(BIN)  | 
 | 102 | + | 
 | 103 | +CFLAGS += -DMLK_CONFIG_FILE="\"example_no_stdlib_config.h\""  | 
 | 104 | + | 
 | 105 | +$(BINARY_NAME_FULL): $(APP_SOURCE) $(RNG_SOURCE) $(MLKEM512_OBJS) $(MLKEM768_OBJS) $(MLKEM1024_OBJS)  | 
 | 106 | +	echo "$@"  | 
 | 107 | +	mkdir -p $(BUILD_DIR)  | 
 | 108 | +	$(CC) $(CFLAGS) $(INC) $^ -o $@  | 
 | 109 | + | 
 | 110 | +all: build size_objs  | 
 | 111 | + | 
 | 112 | +build: $(BINARY_NAME_FULL)  | 
 | 113 | + | 
 | 114 | +run: $(BINARY_NAME_FULL)  | 
 | 115 | +	$(EXEC_WRAPPER) ./$(BINARY_NAME_FULL)  | 
 | 116 | + | 
 | 117 | +size: build  | 
 | 118 | +	@echo "=== Size info for $(BINARY_NAME_FULL) ==="  | 
 | 119 | +	$(Q)$(SIZE) $(BINARY_NAME_FULL)  | 
 | 120 | + | 
 | 121 | +size_objs: size  | 
 | 122 | +	$(Q)echo "=== Object size summary ==="  | 
 | 123 | +	$(Q)$(SIZE) $(shell find $(BUILD_DIR)/mlkem512 -name '*.o') | (read header; echo "$$header"; awk '$$5 != 0' | sort -k5 -n -r)  | 
 | 124 | +	$(Q)$(SIZE) $(shell find $(BUILD_DIR)/mlkem768 -name '*.o') | (read header; echo "$$header"; awk '$$5 != 0' | sort -k5 -n -r)  | 
 | 125 | +	$(Q)$(SIZE) $(shell find $(BUILD_DIR)/mlkem1024 -name '*.o') | (read header; echo "$$header"; awk '$$5 != 0' | sort -k5 -n -r)  | 
 | 126 | + | 
 | 127 | +clean:  | 
 | 128 | +	rm -rf $(BUILD_DIR)  | 
0 commit comments