98 lines
2.4 KiB
Makefile
98 lines
2.4 KiB
Makefile
# MakeFile for tiktaktoe
|
|
# Created 12/23/2025
|
|
# Authored by: xavi
|
|
.POSIX:
|
|
|
|
# DIRECTORIES
|
|
SRC_DIR := src
|
|
INCLUDE_DIR := include
|
|
OBJ_DIR := obj
|
|
TESTS_DIR := tests
|
|
TESTS_INCL_DIR := $(TESTS_DIR)/include
|
|
SUBMODULES_DIR := submodules
|
|
|
|
# Final Binary Name
|
|
PROJECT_NAME := tiktaktoe
|
|
PROJECT_OBJ := $(OBJ_DIR)/$(PROJECT_NAME).o
|
|
|
|
# SUBMODULE VARS FOR GENERATING STATIC LIBS
|
|
SUBMODULES := $(wildcard $(SUBMODULES_DIR)/*)
|
|
SUBBARE := $(SUBMODULES:$(SUBMODULES_DIR)/%=%)
|
|
SUBMODULE_SLIB := $(foreach m,$(SUBBARE),$(SUBMODULES_DIR)/$(m)/$(m).a)
|
|
|
|
|
|
STATIC_LIBS = $(shell find ./ -name "*.a")
|
|
|
|
# C compiler settings
|
|
CC := gcc
|
|
INCLUDE_LIST := $(foreach m,$(SUBMODULES),$(m)/$(INCLUDE_DIR)) $(INCLUDE_DIR) $(TESTS_INCL_DIR)
|
|
INCLUDES := $(addprefix -I,$(INCLUDE_LIST))
|
|
CFLAGS := -ggdb -Wall -Wextra -MMD -MP -lncurses -fsanitize=address
|
|
DFLAGS :=
|
|
|
|
# Main Executable Filename
|
|
MAIN := main.c
|
|
|
|
# Files
|
|
SRC := $(filter-out $(SRC_DIR)/$(MAIN), $(wildcard $(SRC_DIR)/*.c))
|
|
OBJ := $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
|
|
TESTS := $(wildcard $(TESTS_DIR)/*.c)
|
|
|
|
# Get Dependencies from gcc using -MMD and -MP
|
|
DEPENDENCIES := $(OBJ:%.o=%.d)
|
|
|
|
all: $(PROJECT_NAME)
|
|
|
|
# CREATE STATIC LIBRARY OF MODULE
|
|
$(PROJECT_NAME).a: $(PROJECT_OBJ) check_submods
|
|
ar rcs $(@) $(<)
|
|
|
|
# CREATE TEST EXECUTABLES
|
|
$(TESTS:$(TESTS_DIR)/%.c=%): %: $(OBJ_DIR)/%.o $(OBJ) check_submods
|
|
$(CC) $(CFLAGS) $(DFLAGS) -o $(@) $(<) $(OBJ) $(STATIC_LIBS)
|
|
|
|
# CREATE TEST OBJS
|
|
$(OBJ_DIR)/%.o: $(TESTS_DIR)/%.c $(OBJ)
|
|
$(CC) $(CFLAGS) $(DFLAGS) $(INCLUDES) -c -o $(@) $(^)
|
|
|
|
# CREATE MAIN OBJ
|
|
$(PROJECT_NAME): $(MAIN:%.c=$(OBJ_DIR)/%.o) $(OBJ) check_submods
|
|
$(CC) $(CFLAGS) $(DFLAGS) -o $(@) $(<) $(OBJ) $(STATIC_LIBS)
|
|
|
|
# CREATE OBJS
|
|
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
|
|
$(CC) $(CFLAGS) $(DFLAGS) $(INCLUDES) -c -o $(@) $(<)
|
|
|
|
# RECURSE THROUGH SUBMODULES AND RUN MAKE *.a
|
|
$(SUBMODULE_SLIB):
|
|
$(MAKE) -C $(dir $(@)) $(notdir $(@))
|
|
|
|
check_submods: $(SUBMODULE_SLIB)
|
|
|
|
|
|
# RECURSE AND CLEAN ALL FILES
|
|
clean:
|
|
@for sm in $(SUBMODULES) ; do \
|
|
$(MAKE) -C $$sm clean ; \
|
|
done
|
|
rm -f $(PROJECT_NAME) $(OBJ_DIR)/* $(TESTS:$(TESTS_DIR)/%.c=%) ./*.a
|
|
|
|
-include $(DEPENDENCIES)
|
|
|
|
help:
|
|
@echo "SUBMODULES: $(SUBMODULES)"
|
|
@echo "SUBMODULE_SLIB: $(SUBMODULE_SLIB)"
|
|
@echo "STATIC_LIBS: $(STATIC_LIBS)"
|
|
|
|
.PHONY: clean all check_submods help
|
|
|
|
# Create Project Hierarchy
|
|
|
|
dirs: $(SRC_DIR) $(OBJ_DIR) $(TESTS_DIR) $(INCLUDE_DIR) $(SUBMODULES_DIR) $(SRC_DIR)/$(MAIN)
|
|
|
|
$(SRC_DIR) $(OBJ_DIR) $(TESTS_DIR) $(INCLUDE_DIR) $(SUBMODULES_DIR):
|
|
mkdir -p $(@)
|
|
|
|
$(SRC_DIR)/$(MAIN):
|
|
touch $(SRC_DIR)/$(MAIN)
|