code_snippets/c_projects/tiktaktoe/Makefile
2026-01-02 23:16:27 -08:00

98 lines
2.5 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 := -std=c99 -ggdb -Wall -Wextra -MMD -MP -lcurses -lncurses -fsanitize=address
DFLAGS := -D_DEBUG
# 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)