多层级makefile
Posted hachikot
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多层级makefile相关的知识,希望对你有一定的参考价值。
多层级makefile
当项目变大之后,需要多层级的makefile来编译,每个makefile的具体功能实现参考自己写makefile。然后再在顶层目录写一个总控的makefile来实现编译逻辑就行。
总控makefile
# 项目根目录
TOP_DIR := $(patsubst %/, %, $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
export TOP_DIR
# 各项目录
BUILD_DIR := $(TOP_DIR)/build
BIN_DIR := $(BUILD_DIR)/bin
export BUILD_DIR
#编译器
CXX := g++
CXXFLAGS := -std=c++11 -Wall -m64
INCS := -I $(TOP_DIR)
MACROS :=
export CXX CXXFLAGS INCS MACROS
# 链接器
LD := g++
LDFLAGS :=
LIBS :=
# 各个模块
MODULES := libmain libdevcore
# 各个模块对应的库
MODULE_LIBS := $(BUILD_DIR)/libmain/lib/libmain.a $(BUILD_DIR)/libdevcore/lib/libdevcore.a
# 最终目标文件
TARGET := $(BIN_DIR)/hello
# 默认最终目标
.PHONY : all
all : $(TARGET)
# 最终目标依赖关系
$(TARGET) : FORCE | $(BIN_DIR)
@for n in $(MODULES); do make -s -f $(TOP_DIR)/$$n/makefile MODULE=$$n; done
@echo -e "e[32m""Linking executable $(TARGET)""e[0m"
@$(LD) $(LDFLAGS) $(LIBS) -o $@ $(MODULE_LIBS)
# 若没有bin目录则自动生成
$(BIN_DIR) :
@mkdir -p $@
# 强制执行命令
.PHONY: FORCE
FORCE:
# make clean直接删除整个build目录
.PHONY : clean
clean :
@rm -rf $(BUILD_DIR)
各模块makefile
# 各项目录
LIB_DIR := $(BUILD_DIR)/$(MODULE)/lib
DEP_DIR := $(BUILD_DIR)/$(MODULE)/.dep
OBJ_DIR := $(BUILD_DIR)/$(MODULE)/obj
SRC_DIR := $(TOP_DIR)/$(MODULE)
# 源文件以及中间目标文件和依赖文件
SRCS := $(notdir $(wildcard $(SRC_DIR)/*.cpp))
OBJS := $(addprefix $(OBJ_DIR)/, $(patsubst %.cpp, %.o, $(SRCS)))
DEPS := $(addprefix $(DEP_DIR)/, $(patsubst %.cpp, %.d,a $(SRCS)))
# 自动生成头文件依赖选项
DEPFLAGS = -MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d
# 最终目标文件
TARGET := $(LIB_DIR)/$(MODULE).a
# 默认最终目标
.PHONY : all
all : $(TARGET)
# 生成最终目标
$(TARGET) : $(OBJS) | $(LIB_DIR)
@echo -e "e[32m""Linking static library $(TARGET)""e[0m"
@ar -rc $@ $^
# 若没有lib目录则自动生成
$(LIB_DIR) :
@mkdir -p $@
# 生成中间目标文件
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp $(DEP_DIR)/%.d | $(OBJ_DIR) $(DEP_DIR)
@echo -e "e[33m""Building object $@""e[0m"
@$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(MACROS) -o $@ $<
# 若没有obj目录则自动生成
$(OBJ_DIR) :
@mkdir -p $@
# 若没有.dep目录则自动生成
$(DEP_DIR) :
@mkdir -p $@
# 依赖文件会在生成中间文件的时候自动生成,这里只是为了防止报错
$(DEPS) :
# 引入中间目标文件头文件依赖关系
include $(wildcard $(DEPS))
# 直接删除组件build目录
.PHONY : clean
clean :
@rm -rf $(BUILD_DIR)/$(MODULE)
以上是关于多层级makefile的主要内容,如果未能解决你的问题,请参考以下文章