【单层make】:只有一个makefile文件,放在根目录下,一次性编译链接所有文件
【嵌套make】:各级目录下都有一个makefile文件,顶层makefile负责调用底层的makefile,方便项目管理。
目录结构:(makefile_1是单层make文件,makefile_2是嵌套make文件)
一、单层make
CC := gcc
INC_DIR := ./inc
SRC_DIR := ./src
USR_DIR := ./usr
OBJ_DIR := ./obj
DEP_DIR := ./dep
SRC_FILE := $(notdir $(wildcard $(SRC_DIR)/*.c))
USR_FILE := $(notdir $(wildcard $(USR_DIR)/*.c))
OBJ_FILE := $(patsubst %.c,$(OBJ_DIR)/%.o,$(SRC_FILE) $(USR_FILE))
DEP_FILE := $(patsubst %.c,$(DEP_DIR)/%.d,$(SRC_FILE) $(USR_FILE))
VPATH := ./usr ./src
TARGET := main
all:$(TARGET)
$(TARGET):$(OBJ_FILE)
$(CC) -o $@ $^
$(OBJ_DIR)/%.o:%.c
$(CC) -c $< -o $@ -I $(INC_DIR)
#下边写法也可以,不过得找两次源文件
#$(OBJ_DIR)/%.o:$(SRC_DIR)/%.c
# $(CC) -c $< -o $@ -I $(INC_DIR)
#$(OBJ_DIR)/%.o:$(USR_DIR)/%.c
# $(CC) -c $< -o $@ -I $(INC_DIR)
$(DEP_FILE):$(DEP_DIR)/%.d:%.c
-mkdir -p $(DEP_DIR)
$(CC) -MM -E $< -I $(INC_DIR) > $@
#同上,比较麻烦,需要查找两次
#$(DEP_DIR)/%.d:$(SRC_DIR)/%.c
# -madir -p $(DEP_DIR)
# $(CC) -MM -E $< -I $(INC_DIR) > $@
#$(DEP_DIR)/%.d:$(USR_DIR)/%.c
# -mkdir -p $(DEP_DIR)
# $(CC) -MM -E $< -I $(INC_DIR) > $@
include $(DEP_FILE)
echo:
echo USR_FILE:$(USR_FILE)
echo SRC_FILE:$(SRC_FILE)
echo OBJ_FILE:$(OBJ_FILE)
clean:
rm -f $(OBJ_FILE)
rm -f $(DEP_FILE)
rm -f $(TARGET)
二、嵌套make(有些小问题但可以正常运行,此版本没有添加自动生成依赖文件功能)
①.根makefile
CC := gcc
export SRC_DIR := $(PWD)/src
export USR_DIR := $(PWD)/usr
export OBJ_DIR := $(PWD)/obj
export DEP_DIR := $(PWD)/dep
export INC_DIR := $(PWD)/inc
export SUB_DIR := $(SRC_DIR) $(USR_DIR)
SRC_FILE := $(wildcard $(SRC_DIR)/*.c)
USR_FILE := $(wildcard $(USR_DIR)/*.c)
OBJ_FILE := $(patsubst %.c,$(OBJ_DIR)/%.o,$(notdir $(SRC_FILE) $(USR_FILE)))
DEP_FILE := $(patsubst %.c,$(DEP_DIR)/%.d,$(notdir $(SRC_FILE) $(USR_FILE)))
TARGET := main
VPATH := $(SRC_DIR) $(USR_DIR) $(DEP_DIR) $(OBJ_DIR)
all:$(SUB_DIR) $(TARGET)
echo linking all object file...
$(TARGET):$(OBJ_FILE)
$(CC) -o $@ $^
$(SUB_DIR):ECHO
$(MAKE) -f makefile_2 -C $@
ECHO:
echo compiling object file...
clean:
rm -f $(OBJ_DIR)/*.o
rm -f $(DEP_DIR)/*.d
rm -f $(TARGET)
②.src目录makefile文件
SRC_FILE := $(wildcard *.c)
OBJ_FILE := $(patsubst %.c,$(OBJ_DIR)/%.o,$(SRC_FILE))
DEP_FILE := $(patsubst %.c,$(DEP_DIR)/%.d,$(SRC_FILE))
all:$(OBJ_FILE)
echo compile src cfile...
$(OBJ_DIR)/%.o:%.c
$(CC) -c $< -o $@ -I $(INC_DIR)
③.usr目录makefile文件
USR_FILE := $(wildcard *.c)
OBJ_FILE := $(patsubst %.c,$(OBJ_DIR)/%.o,$(USR_FILE))
DEP_FILE := $(patsubst %.c,$(DEP_DIR)/%.d,$(USR_FILE))
all:$(OBJ_FILE)
echo compile usr cfile...
$(OBJ_DIR)/%.o:%.c
$(CC) -c $< -o $@ -I $(INC_DIR)
推荐资料:跟我一起学makefile 驾驭makefile
项目地址:ZiXie/makefile