zoukankan      html  css  js  c++  java
  • Makefile Template

    # 本 makefile 文件适合小型和中型 c/c++ 项目
    # 参考:http://www.partow.net/programming/makefile/index.html
    # 参考:陈皓,《跟我一起写 Makefile》,https://files.cnblogs.com/files/jiahu-Blog/Makefile.pdf
    
    # makefile 中的等号有:`=`、`:=`、`+=` 和 `?=`,具体使用方法参考上面小册子中 ·变量中的变量·
    CXX      := -c++
    CXXFLAGS := -std=c++11 -pedantic-errors -Wall -Wextra -Werror
    LDFLAGS  := -L/usr/lib -lstdc++ -lm
    BUILD    := ./build
    OBJ_DIR  := $(BUILD)/objects
    T_OBJ_DIR:= $(BUILD)/test_objs
    APP_DIR  := $(BUILD)/apps
    TARGET   := program
    T_TARGET := program_test
    INCLUDE  := -Iinclude/ -Iinclude/thirdlib
    
    # wildcard 将指定目录中所有符合规则的文件名展开为列表,文件名之间使用空格分隔
    SRC      :=                       
    	$(wildcard src/module1/*.cpp) 
    	$(wildcard src/module2/*.cpp) 
    	$(wildcard src/module3/*.cpp) 
    	$(wildcard src/*.cpp)         
    
    T_SRC    := $(wildcard test/*.cpp)
    
    # 将 SRC 中满足 %.cpp 模式的文件名转化为 $(OBJ_DIR)/%.o 的形式
    OBJECTS   := $(SRC:%.cpp=$(OBJ_DIR)/%.o)
    T_OBJECTS := $(T_SRC:%.cpp=$(T_OBJ_DIR)/%.o)
    
    # makefile 支持后向依赖,make 会扫描整个 makefile 然后执行,这里的 all 依赖后面的 build
    all: build $(APP_DIR)/$(TARGET)
    
    # 定义模式规则,下面的规则定义了 .cpp 文件生成 .o 文件的方式
    # 第一行指明 OBJ_DIR 目录下 .o 文件的依赖项
    # 第二行起始的 @ 表示执行时当前行不显示在终端
    # 第三行中的 $< 表示所有依赖目标集,即所有的 %.cpp 文件; $@ 表示所有目标集,即所有的 %.o 文件
    $(OBJ_DIR)/%.o: %.cpp
    	@mkdir -p $(@D) 
    	$(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -o $@ $(LDFLAGS)
    
    $(T_OBJ_DIR)/%.o: %.cpp
    	@mkdir -p $(@D) 
    	$(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -o $@ $(LDFLAGS)
    
    # makefile 的普通规则,目标、依赖和命令
    $(APP_DIR)/$(TARGET): $(OBJECTS)
    	@mkdir -p $(@D)
    	$(CXX) $(CXXFLAGS) -o $(APP_DIR)/$(TARGET) $^ $(LDFLAGS)
    
    # makefile 的普通规则,目标、依赖和命令
    $(APP_DIR)/$(T_TARGET): $(OBJECTS) $(T_OBJECTS)
    	@mkdir -p $(@D)
    	$(CXX) $(CXXFLAGS) -o $(APP_DIR)/$(T_TARGET) $^ $(LDFLAGS)
    
    # 伪目标,伪目标只是个标签,make 不会生成相应的文件
    .PHONY: all build clean debug release
    
    build:
    	@mkdir -p $(APP_DIR)
    	@mkdir -p $(OBJ_DIR)
    	@mkdir -p $(T_OBJ_DIR)
    
    debug: CXXFLAGS += -DDEBUG -g
    debug: all
    
    release: CXXFLAGS += -O2
    release: all
    
    test: CXXFLAGS += -DTEST_TSET
    test: build $(APP_DIR)/$(T_TARGET)
    
    clean:
    	-@rm -rvf $(OBJ_DIR)/*
    	-@rm -rvf $(T_OBJ_DIR)/*
    	-@rm -rvf $(APP_DIR)/*
    
  • 相关阅读:
    10 种保护 Spring Boot 应用的绝佳方法
    Redis 如何分析慢查询操作?
    Spring Boot 主类及目录结构介绍
    Redis 再牛逼,也得设置密码!!
    Spring Data Redis 详解及实战一文搞定
    Spring Boot Redis Cluster 实战干货
    超详细的 Redis Cluster 官方集群搭建指南
    Redis Linux 安装运行实战全记录
    hdu 4790 Just Random (思路+分类计算+数学)
    poj 1328 Radar Installation(贪心)
  • 原文地址:https://www.cnblogs.com/jiahu-Blog/p/12816743.html
Copyright © 2011-2022 走看看