code_snippets/c_projects/x_tfw4c/Makefile
xavi 0924650090 Added Makefile Logic to work with Submodules
These changes allow for projects that were created and built using the
same Makefile to be placed under the submodules directory. This Makefile
will recursively build the submodules and link to the top project.

The submodules will be built as a static library using ar rcs.
2025-12-23 21:46:32 -08:00

107 lines
2.6 KiB
Makefile

# MakeFile for placeholder
# Created mm/dd/yyyy
# Authored by: xavi
# ----------------------
# | THIS IS A TEMPLATE |
# ----------------------
# TODO:
# %s/placeholder/project_name/g
# Change date file was created to today
# run make dirs to create project hierarchy
# Place headers in include and source files in src
.POSIX:
# DIRECTORIES
SRC_DIR := src
INCLUDE_DIR := include
OBJ_DIR := obj
TESTS_DIR := tests
SUBMODULES_DIR := submodules
# Final Binary Name
PROJECT_NAME := placeholder
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)
INCLUDES := $(addprefix -I,$(INCLUDE_LIST))
CFLAGS := -ggdb $(INCLUDES) -Wall -Wextra -MMD -MP
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) -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) -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)