美文网首页
小型项目makefile

小型项目makefile

作者: RC_HT | 来源:发表于2019-09-26 10:55 被阅读0次

    目录结构

    hello_world
    ├──include
    ├──src
    ├──bin
    ├──obj
    ├──.dep
    ├──bin_debug
    ├──obj_debug
    ├──.dep_debug
    └──makefile
    

    这里bin,obj,.dep,bin_debug,obj_debug,.dep_debug都是makefile自动生成的,方便编辑器只创建src和include目录即可。

    区分release版和debug版

    默认创建release版:make
    指定debug目标创建debug版:make debug

    支持自动生成头文件依赖

    参考链接:Auto-Dependency Generation

    小心使用make clean

    这里make clean将会强制递归删除bin,obj,.dep,bin_debug,obj_debug,.dep_debug目录。使用前需确保里面没有需要保留的数据。

    makefile

    #生成makefile所在的目录的绝对路径
    #MAKEFILE_LIST是make工具定义的环境变量,最后一个值就是当前的makefile的启动路径(可能是相对路径)
    TOP_DIR := $(patsubst %/, %, $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
    
    #各项目录
    INC_DIR := $(TOP_DIR)/include
    SRC_DIR := $(TOP_DIR)/src
    BIN_DIR := $(TOP_DIR)/bin
    OBJ_DIR := $(TOP_DIR)/obj
    DEP_DIR := $(TOP_DIR)/.dep
    BIN_DIR_DBG := $(TOP_DIR)/bin_debug
    OBJ_DIR_DBG := $(TOP_DIR)/obj_debug
    DEP_DIR_DBG := $(TOP_DIR)/.dep_debug
    
    #编译器,链接器
    CXX := g++
    LD := g++
    
    #生成依赖文件选项
    DEPFLAGS = -MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d
    DEPFLAGS_DBG = -MT $@ -MMD -MP -MF $(DEP_DIR_DBG)/$*.d
    
    #编译选项
    CXXFLAGS := -std=c++11 -Wall -m64
    CXXFLAGS_DBG := -std=c++11 -g -Wall -m64
    
    #宏定义
    MACROS :=
    MACROS_DBG :=
    
    #链接选项
    LDFLAGS :=
    
    #包含的头文件和库文件
    INCS :=-I $(INC_DIR)
    LIBS :=
    
    #源文件以及中间目标文件和依赖文件
    SRCS := $(notdir $(wildcard $(SRC_DIR)/*.cpp))
    OBJS := $(addprefix $(OBJ_DIR)/, $(patsubst %.cpp, %.o, $(SRCS)))
    DEPS := $(addprefix $(DEP_DIR)/, $(patsubst %.cpp, %.d, $(SRCS)))
    OBJS_DBG := $(addprefix $(OBJ_DIR_DBG)/, $(patsubst %.cpp, %.o, $(SRCS)))
    DEPS_DBG := $(addprefix $(DEP_DIR_DBG)/, $(patsubst %.cpp, %.d, $(SRCS)))
    
    #最终目标文件
    TARGET := $(BIN_DIR)/hello_world
    TARGET_DBG := $(BIN_DIR_DBG)/hello_world
    
    #默认最终目标
    .PHONY : all
    all : $(TARGET)
    
    #debug最终目标
    .PHONY : debug
    debug : $(TARGET_DBG)
    
    ###################################Release#########################################
    #生成最终目标(release版)
    $(TARGET) : $(OBJS) | $(BIN_DIR)
        $(LD) $(LDFLAGS) $(LIBS) -o $@ $^
    
    #若没有bin目录则自动生成
    $(BIN_DIR) :
        mkdir -p $@
    
    #生成中间目标文件(release版)
    $(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp $(DEP_DIR)/%.d | $(OBJ_DIR) $(DEP_DIR)
        $(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(MACROS) -o $@ $<
    
    #若没有obj目录则自动生成
    $(OBJ_DIR) :
        mkdir -p $@
    
    #若没有.dep目录则自动生成
    $(DEP_DIR) :
        mkdir -p $@
    
    #依赖文件会在生成中间文件的时候自动生成,这里只是为了防止报错
    $(DEPS) :
    
    #引入中间目标文件头文件依赖关系
    include $(wildcard $(DEPS))
    
    ###################################Debug#########################################
    #生成最终目标(debug版)
    $(TARGET_DBG) : $(OBJS_DBG) | $(BIN_DIR_DBG)
        $(LD) $(LDFLAGS) $(LIBS) -o $@ $^
    
    #若没有bin_debug目录则自动生成
    $(BIN_DIR_DBG) :
        mkdir -p $@
    
    #生成中间目标文件(debug版)
    $(OBJ_DIR_DBG)/%.o : $(SRC_DIR)/%.cpp $(DEP_DIR_DBG)/%.d | $(OBJ_DIR_DBG) $(DEP_DIR_DBG)
        $(CXX) -c $(DEPFLAGS_DBG) $(CXXFLAGS_DBG) $(INCS) $(MACROS_DBG) -o $@ $<
    
    #若没有obj_debug目录则自动生成
    $(OBJ_DIR_DBG) :
        mkdir -p $@
    
    #若没有.dep_debug目录则自动生成
    $(DEP_DIR_DBG) :
        mkdir -p $@
    
    #依赖文件会在生成中间文件的时候自动生成,这里只是为了防止报错
    $(DEPS_DBG) :
    
    #引入中间目标文件头文件依赖关系
    include $(wildcard $(DEPS_DBG))
    
    #删除makefile创建的目录
    .PHONY : clean
    clean :
        rm -rf $(BIN_DIR) $(OBJ_DIR) $(DEP_DIR) $(BIN_DIR_DBG) $(OBJ_DIR_DBG) $(DEP_DIR_DBG)
    

    相关文章

      网友评论

          本文标题:小型项目makefile

          本文链接:https://www.haomeiwen.com/subject/lzkhyctx.html