项目工程及例程链接:https://gitee.com/theboynoName/makefile_template.git
# author:theboynoName
# 一个适用于中小型项目工程的makefile模板
# 1. 工程支持多个目录
# 2. 编译产生的文件会存放到OBJPATH所在的目录
# 3. 修改头文件时也会自动更新目标。
# Project Settings
# 设置顶层目录为当前目录
TOP_DIR := .
# 可执行文件的名称
BIN := main
# 编译产生文件目录
OBJPATH := $(TOP_DIR)/build
CSRCS =
INCLUDE =
VPATH :=
CC := gcc
WARNINGS := -Werror -Wall
LDFLAGS = -lm
CFLAGS = -O0 -g
# 添加fruits模块
# FRUITS_DIR变量是根据子目录中的fruits.mk所需要的变量定义的相关变量
FRUITS_DIR := $(TOP_DIR)
#包含子目录的Makefile
include $(TOP_DIR)/fruits/fruits.mk
# 添加sex模块
SEX_DIR := $(TOP_DIR)
SEX_DIR_NAME := sex
include $(SEX_DIR)/$(SEX_DIR_NAME)/female/female.mk
include $(SEX_DIR)/$(SEX_DIR_NAME)/male/male.mk
# 添加main.c
#用于包含main.h
INCLUDE += -I$(TOP_DIR)
CSRCS += main.c
#===========================================================
CFLAGS += $(WARNINGS) $(INCLUDE)
OBJS := $(patsubst %,$(OBJPATH)/%,$(CSRCS:.c=.o))
DEPS := $(patsubst %,$(OBJPATH)/%,$(CSRCS:.c=.d))
# create obj dir
$(foreach each,$(OBJS), $(shell mkdir -p $(dir $(each))))
$(BIN):$(OBJS)
@$(CC) -o $@ $^ $(LDFLAGS)
$(OBJPATH)/%.o:%.c
@$(CC) $(CFLAGS) -c -o $@ $<
@echo $(CC) $@ $<
$(OBJPATH)/%.d: %.c
@$(CC) -MM $(CFLAGS) $< | sed 's,\($*\)\.o[:]*,$(OBJPATH)/\1.o $@:,g' > $@
@echo $(CC) -MM $@ $^
.PHONY:clean
clean:
@rm -rf $(OBJPATH) $(BIN)
ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif