#定义编译选项
CXX = g++
#设置“CXXFLAGS”环境变量
CXXFLAGS = -g -Wall -O0 -std=c++0x
#定义头文件目录,链接库目录,链接文件
INCLUDE_PATH = ../frame/3rdInc/eluna/ ../frame/3rdInc/glog ../frame/3rdInc/google ../frame/3rdInc/json /
../frame/3rdInc/uuid
LIB_PATH = ../frame/3rdLibs32/ ../frame/3rdLibs32/lib
LIBS = -leluna -lglog -ljson -llua-5.1.so -lprotobuf -luuid -lmysql
ifneq($(CXX), g++)
LIBS += -lstdc++
endif
#定义项目代码根目录及所有文件夹目录
#追加变量"+="操作符
SRC_DIR = ./
VPATH = $(SRC_DIR)
VPATH += $(SRC_DIR)/operate
VPATH += $(SRC_DIR)/data
VPATH += $(SRC_DIR)/../frame
VPATH += $(SRC_DIR)/../frame/common
#找出所有 .cpp 文件 和相应的.o文件(带上路径)
#'wildcard'函数,它有一个参数,功能是:展开称一列所有符合由其参数描述的文件
#'patsubst'函数(patten substitude匹配替换),它需要3个参数,第一个是一个需要匹配的式样;
#第二个是表示用什么来替换它, 第三个是:需要被处理的
#objs = $(patsubst %.c, %.o, $(SOURCES))
#foreach 用来做循环的
#$(foreach <var>, <list>, <text> )
#把参数<list>中的单词逐一取出放到<var>所指定的变量中;
#然后再执行<text> 所包含的表达式。每次<text>会返回一个字符串;
#循环过程中<text>的返回的每个字符串会以空格分割;
#最后当整个循环结束时,<text>所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。
SRC_FILES = $(foreach n, $(VPATH), $(wildcard $(n)/*.cpp))
#使用了变量的高级用法中的替换,将变量$(SRC_DIR)中的.cpp 替换成.o
#也可以用静态模式中的替换
#OBJ_FIELS := $(SRC_DIR:%.cpp = %.o)
#notdir 取文件函数
OBJ_FILES = $(notdir $(SRC_FILES:.cpp=.o))
#把所有的.o文件放到定义好的输出文件夹中统一管理
#make中的另一种用”变量“来定义变量的方法,使用":=" 操作符
OUTPUT_DIR := debug
OUTPUT_OBJS = $(addprefix $(OUTPUT_DIR)/, $(subst $(SRC_DIR)/, ,$(OBJ_FILES)))
#linking
server : $(OBJ_FILES)
@echo $(GENVER)
$(LINK.cc) $(OBJ_FIELS) -o $@ $(LIB_PATH) $(LIBS)
#生成.d文件的模式
.%.d : %.cpp
@set -e; rm -f $@; \
$(CC) -MM $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
#sinclude 与include 功能一致;区别在于sinclude 可以兼容其他版本的make
#打包
.PHONY: tar
tar:
tar zcvf ./tank_s3_$(shell date -d today +"%m%d_%H%M").tar.gz ../ListServer
#清除 伪目标
.PHONY: clean
clean:
-rm -rf *.o *.d.* *.d .*.d
#打印输出
@echo 'hello world'
#makefile函数,以"$"来标识的
#$(<function> <arguments>) 或 ${<function> <arguments>}
#function:函数名,arguments:参数,参数之间以“,”分隔,函数名与参数之间空格分开
#函数调用以“$”开头