# 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)