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.
107 lines
2.6 KiB
Makefile
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)
|