目录结构

config.mk
配置文件
# 当前路径
export BUILD_ROOT = $(shell pwd)
# include路径
export INCLUDE_PATH = $(BUILD_ROOT)/include
# 需要编译的路径
BUILD_DIR = $(BUILD_ROOT)/app/
export DEBUG = true
export将BUILD_ROOT传递到下级makefile中
common.mk
编译脚本
ifeq ($(DEBUG),true)
CC = g++ -std=c++11 -g
VERSION = debug
else
CC = g++ -std=c++11
VERSION = release
endif
# 获取所有.cpp
SRCS = $(wildcard *.cpp)
# 每个.cpp对应一个.o
OBJS = $(SRCS:.cpp=.o)
# .每个.cpp对应一个.d,记录依赖
DEPS = $(SRCS:.cpp=.d)
# 最终生成的可执行文件
BIN := $(addprefix $(BUILD_ROOT)/,$(BIN))
# 目标文件.o的存放位置
LINK_OBJ_DIR = $(BUILD_ROOT)/link_obj
# .p文件的存放位置
DEP_DIR = $(BUILD_ROOT)/dep
# 生成link_obj和dep文件夹
$(shell mkdir -p $(LINK_OBJ_DIR))
$(shell mkdir -p $(DEP_DIR))
# 为每个.o和.d文件添加路径信息
# 例如: ./link_obj/xx.o和./dep/xx.d
OBJS := $(addprefix $(LINK_OBJ_DIR)/,$(OBJS))
DEPS := $(addprefix $(DEP_DIR)/,$(DEPS))
# 获取LINK_OBJ_DIR下的所有.o文件
LINK_OBJ = $(wildcard $(LINK_OBJ_DIR)/*.o)
# OBJS为需要生成的.o文件,一开始不存在任何.o文件所以添加OBJS到LINK_OBJ
LINK_OBJ += $(OBJS)
# 默认入口,依赖DEPS、OBJS和BIN文件,即xx.d, xx.o, 可能存在的可执行文件名
all:$(DEPS) $(OBJS) $(BIN)
# 链接生成可执行程序
$(BIN):$(LINK_OBJ)
@echo "BIN $(BIN)"
@echo "------------------------build $(VERSION) mode--------------------------------!!!"
$(CC) -o $@ $^ -lpthread
# 编译生成.o文件
$(LINK_OBJ_DIR)/%.o:%.cpp
@echo "LINK_OBJ_DIR $(LINK_OBJ_DIR)"
$(CC) -I$(INCLUDE_PATH) -o $@ -c $(filter %.cpp,$^)
# 生成.p文件
$(DEP_DIR)/%.d:%.cpp
@echo "DEP_DIR $(DEP_DIR)"
echo -n $(LINK_OBJ_DIR)/ > $@
$(CC) -I$(INCLUDE_PATH) -MM $^ >> $@
根目录下的makefile
遍历所有包含makefile的子目录,依次执行编译任务
include config.mk
all:
@for dir in $(BUILD_DIR);
do
make -C $$dir;
done
clean:
rm -rf link_obj dep
- 当make目标为all时,-C $$dir表示跳转到目录dir下读取makefile
子目录下的makefile
BIN = test
include $(BUILD_ROOT)/common.mk
- 将BIN设为test,即生成名为test的可执行文件
- 通过include common.mk执行编译过程,生成.d、.o和可执行文件test
编译信息
make[1]: Entering directory '/mnt/d/Linux/VSCode/MakeTest/app'
DEP_DIR /mnt/d/Linux/VSCode/MakeTest/dep
echo -n /mnt/d/Linux/VSCode/MakeTest/link_obj/ > /mnt/d/Linux/VSCode/MakeTest/dep/file1.d
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -MM file1.cpp >> /mnt/d/Linux/VSCode/MakeTest/dep/file1.d
DEP_DIR /mnt/d/Linux/VSCode/MakeTest/dep
echo -n /mnt/d/Linux/VSCode/MakeTest/link_obj/ > /mnt/d/Linux/VSCode/MakeTest/dep/file3.d
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -MM file3.cpp >> /mnt/d/Linux/VSCode/MakeTest/dep/file3.d
DEP_DIR /mnt/d/Linux/VSCode/MakeTest/dep
echo -n /mnt/d/Linux/VSCode/MakeTest/link_obj/ > /mnt/d/Linux/VSCode/MakeTest/dep/file2.d
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -MM file2.cpp >> /mnt/d/Linux/VSCode/MakeTest/dep/file2.d
DEP_DIR /mnt/d/Linux/VSCode/MakeTest/dep
echo -n /mnt/d/Linux/VSCode/MakeTest/link_obj/ > /mnt/d/Linux/VSCode/MakeTest/dep/main.d
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -MM main.cpp >> /mnt/d/Linux/VSCode/MakeTest/dep/main.d
DEP_DIR /mnt/d/Linux/VSCode/MakeTest/dep
echo -n /mnt/d/Linux/VSCode/MakeTest/link_obj/ > /mnt/d/Linux/VSCode/MakeTest/dep/file4.d
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -MM file4.cpp >> /mnt/d/Linux/VSCode/MakeTest/dep/file4.d
LINK_OBJ_DIR /mnt/d/Linux/VSCode/MakeTest/link_obj
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -o /mnt/d/Linux/VSCode/MakeTest/link_obj/file1.o -c file1.cpp
LINK_OBJ_DIR /mnt/d/Linux/VSCode/MakeTest/link_obj
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -o /mnt/d/Linux/VSCode/MakeTest/link_obj/file3.o -c file3.cpp
LINK_OBJ_DIR /mnt/d/Linux/VSCode/MakeTest/link_obj
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -o /mnt/d/Linux/VSCode/MakeTest/link_obj/file2.o -c file2.cpp
LINK_OBJ_DIR /mnt/d/Linux/VSCode/MakeTest/link_obj
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -o /mnt/d/Linux/VSCode/MakeTest/link_obj/main.o -c main.cpp
LINK_OBJ_DIR /mnt/d/Linux/VSCode/MakeTest/link_obj
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -o /mnt/d/Linux/VSCode/MakeTest/link_obj/file4.o -c file4.cpp
BIN /mnt/d/Linux/VSCode/MakeTest/test
------------------------build debug mode--------------------------------!!!
g++ -std=c++11 -g -o /mnt/d/Linux/VSCode/MakeTest/test /mnt/d/Linux/VSCode/MakeTest/link_obj/file1.o /mnt/d/Linux/VSCode/MakeTest/link_obj/file3.o /mnt/d/Linux/VSCode/MakeTest/link_obj/file2.o /mnt/d/Linux/VSCode/MakeTest/link_obj/main.o /mnt/d/Linux/VSCode/MakeTest/link_obj/file4.o -lpthread
make[1]: Leaving directory '/mnt/d/Linux/VSCode/MakeTest/app'