INCLUDES=-Iinc -I. # BUILD_DIR=out ifeq ($(BUILD_DIR),) BUILD_DIR := out endif ifeq ($(MANIFEST_BUILD_DIR),) MANIFEST_BUILD_DIR := out/manifest endif SRC_DIR=src MANIFEST_SRC_DIR=manifest_src INC_DIR=inc CC=gcc OBJDUMP=objdump LIBS= STANDART=c23 OPTIMIZE=-Og TARGET=device DEFINES=-DOPCODE_WORDSIZE=2 -DMEM_CELL_WORDS=1 -DPC_WORDSIZE=3 -DGP_REG_CELL_WORDS=1 -DIO_REG_CELL_WORDS=1 -DARCH=$(ARCH) C_SOURCES=$(wildcard $(SRC_DIR)/*.c) MANIFEST_C_SOURCES=$(wildcard $(MANIFEST_SRC_DIR)/*.c) C_HEADERS=$(wildcard $(INC_DIR)/*.h) C_INCLUDES=-I$(INC_DIR)/ DISABLE_FLAGS=-Wno-unused-variable -Wno-unused-parameter -Wno-write-strings -Wno-pointer-arith -Wno-analyzer-use-of-uninitialized-value PEDANTIC_FLAGS=-pedantic -pedantic-errors $(DISABLE_FLAGS) -Wall -Wcast-align -Wcast-qual -Wconversion -Wduplicated-branches -Wduplicated-cond -Werror -Wextra -Wfloat-equal -Wlogical-op -Wpedantic -Wredundant-decls -Wsign-conversion ANALYZER_FLAGS=-fanalyzer LSECTIONS=-ffunction-sections -fdata-sections -Wl,--gc-sections CFLAGS=$(C_DEFS) -g $(C_INCLUDES) $(DEFINES) $(OPTIMIZE) --std=$(STANDART) $(PEDANTIC_FLAGS) $(ANALYZER_FLAGS) -fPIC LFLAGS=$(OPTIMIZE) -g $(PEDANTIC_FLAGS) $(DEFINES) -flto -fuse-linker-plugin $(LSECTIONS) -lm $(LIBS) -fPIC -shared MANIFEST_LFLAGS=$(OPTIMIZE) -g $(PEDANTIC_FLAGS) $(DEFINES) -flto -fuse-linker-plugin $(LSECTIONS) -lm $(LIBS) -fPIC OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) MANIFEST_TARGETS = $(addprefix $(MANIFEST_BUILD_DIR)/,$(notdir $(MANIFEST_C_SOURCES:.c=.elf))) vpath %.c $(sort $(dir $(C_SOURCES))) vpath %.h $(sort $(dir $(C_HEADERS))) rebuild: clean | build all: build: date Dir $(C_HEADERS) target $(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) @echo -e '\033[1;32mCC ('$(ARCH)')\t'$<'\t->\t'$@'\033[0m' @$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ @$(OBJDUMP) -d -S $@ > $(BUILD_DIR)/$(notdir $(<:.c=.casm)) target: date $(BUILD_DIR)/$(TARGET).so $(BUILD_DIR)/$(TARGET).so: $(OBJECTS) @echo -e '\033[1;32mELF ('$(ARCH)')\t'$(OBJECTS)'\n\t\t\t->\t'$@'\033[0m' @$(CC) $(LFLAGS) $(OBJECTS) -o $(BUILD_DIR)/$(TARGET).so manifest: $(MANIFEST_TARGETS) @for elf in $(MANIFEST_TARGETS); do \ echo -e "\033[1;32mRUN\t$$elf\033[0m"; \ $$elf $(MANIFEST_BUILD_DIR) || { echo -e "\033[0;31merror running $$elf\033[0m"; exit 1; }; \ done $(MANIFEST_BUILD_DIR)/%.elf: $(MANIFEST_SRC_DIR)/%.c Makefile | $(MANIFEST_BUILD_DIR) @echo -e '\033[1;32mELF\t'$(OBJECTS)'\n\t\t\t->\t'$@'\033[0m' @$(CC) $(MANIFEST_LFLAGS) $< $(LDLIBS) -I inc -o $@ $(BUILD_DIR): @mkdir -p $(BUILD_DIR) $(MANIFEST_BUILD_DIR): @mkdir -p $(MANIFEST_BUILD_DIR) BuildDir: @mkdir -p $(BUILD_DIR) SrcDir: @mkdir -p $(SRC_DIR) IncDir: @mkdir -p $(INC_DIR) Dir: BuildDir SrcDir IncDir .PHONY: clean clean: @rm -rf $(BUILD_DIR)/* @echo -e '\033[0;31mCleaned\033[0m' .NOTPARALLEL: date target rebuild date: @echo -e '\033[1;32m'"Starting build at " | tr -d '\n' @date @echo -e '\033[0m'