KERNEL_DIR = kernels
OUTPUT_DIR = build
INCLUDE_DIR = $(KERNEL_DIR)
KERNEL_LIB = $(OUTPUT_DIR)/libhodu_cpu_kernels.a
HEADERS = $(KERNEL_DIR)/atomic.h \
$(KERNEL_DIR)/constants.h \
$(KERNEL_DIR)/math_utils.h \
$(KERNEL_DIR)/types.h \
$(KERNEL_DIR)/utils.h \
$(KERNEL_DIR)/ops_binary.h \
$(KERNEL_DIR)/ops_concat_split.h \
$(KERNEL_DIR)/ops_conv.h \
$(KERNEL_DIR)/ops_indexing.h \
$(KERNEL_DIR)/ops_matrix.h \
$(KERNEL_DIR)/ops_reduce.h \
$(KERNEL_DIR)/ops_unary.h \
$(KERNEL_DIR)/ops_windowing.h
SOURCES = $(KERNEL_DIR)/ops_binary.c \
$(KERNEL_DIR)/ops_concat_split.c \
$(KERNEL_DIR)/ops_conv.c \
$(KERNEL_DIR)/ops_indexing.c \
$(KERNEL_DIR)/ops_matrix.c \
$(KERNEL_DIR)/ops_reduce.c \
$(KERNEL_DIR)/ops_unary.c \
$(KERNEL_DIR)/ops_windowing.c
OBJ_FILES = $(patsubst $(KERNEL_DIR)/%.c,$(OUTPUT_DIR)/%.o,$(SOURCES))
CC = clang
AR = ar
CFLAGS = -I $(INCLUDE_DIR) -std=c11 -O3 -Wall -Wextra -fPIC
ARFLAGS = rcs
all: prepare $(KERNEL_LIB)
prepare:
@mkdir -p $(OUTPUT_DIR)
$(OUTPUT_DIR)/%.o: $(KERNEL_DIR)/%.c $(HEADERS) | prepare
$(CC) $(CFLAGS) -c $< -o $@
$(KERNEL_LIB): $(OBJ_FILES) | prepare
$(AR) $(ARFLAGS) $@ $^
test: prepare
@echo "Testing compilation..."
@for src in $(SOURCES); do \
echo " Compiling $$src..."; \
$(CC) $(CFLAGS) -fsyntax-only $$src || exit 1; \
done
@echo "All files compiled successfully!"
info:
@echo "Compiler: $(CC)"
@echo "Flags: $(CFLAGS)"
@echo "Sources: $(SOURCES)"
@echo "Headers: $(HEADERS)"
@echo "Objects: $(OBJ_FILES)"
@echo "Output: $(KERNEL_LIB)"
clean:
rm -rf $(OUTPUT_DIR)
.PHONY: all prepare test info clean