# author:
// 提取路径xxxxx之前的路径
// eg /home/nemo/xxxxxxx, 则 trunk_path=/home/nemo
trunk_path = $(shell pwd | sed "s///xxxxxx.*//")
// 包含另一个makefile,里面定义了很多公共库的LIB_路径和INC路径
include $(trunk_path)/makeinclude/make_macro.platform
// 我们使用的库,通过USED生成上面的包含文件定义的变量
USED = /
QK /
MYSQL
C_FLAGS += -Werror -MMD -shared
INC = $(foreach i, $(USED), $(INC_$(i))) -I../comm
LIB = $(foreach i, $(USED), $(LIB_$(i)))
#PATH_CGI = $(trunk_path)/release/platform/cgi-bin/msg
#目标cgi的路径,未来的执行目录,后面会有规则把cgi拷贝过去
PATH_CGI = /data/release/platform/cgi-bin/msg
#展开当前目录的.cpp文件列表 改文件如果被其他makefile包含,也就是展开
#最终make使用的makefile所在的目录的文件
SOURCES = $(wildcard *.cpp)
#将souces列表里面的每一个cpp 转化为$(PATH_CGI)/% eg
# a.cpp =>$(PATH_CGI)/%=>$(trunk_path)/release/platform/cgi-bin/msg/a
# 目的是为了通过后面的规则,把.a 文件拷贝到$(PATH_CGI)目录,并命名为a
DISTS = $(patsubst %.cpp, $(PATH_CGI)/%, $(SOURCES))
#生成隐藏目标文件 a.cpp => .a
TARGETS = $(patsubst %.cpp, .%, $(SOURCES))
#同理 a.cpp=>.a.d
DEPENDS = $(patsubst %.cpp, .%.d, $(SOURCES))
.DELETE_ON_ERROR: $(DEPENDS)
.PHONY: all clean
# check 是用来执行 高位函数检查的,如果代码中使用饿了高危函数,则直接make失败
# $(PATH_CGI) 用来检查目录是否存在,不存在则创建目录
# $(TARGETS) 包含了所有的最终文件 不过都是 。开头 eg hello.cpp .hello
all: check $(PATH_CGI) $(TARGETS) $(DISTS)
#同名替换 .a : a.cpp
#相当于生成目标文件 .a 其中用到了自动生成 依赖关系的命令 -MF [email protected]
# [email protected] <=> .a.d
# -MF [email protected] 该命令省掉了所有的 a.o : a.cpp ***.h ***.h的编写!
.%: %.cpp
$(CXX) -o $@ -MF [email protected] $(C_FLAGS) $< $(INC) $(LIB)
@echo
#对(PATH_CGI)下面的每一个文件 将.a文件copy过去
#md5sum是计算一下目标文件的 md5值,在屏幕上输出。前面的@表示 改行命令本身不输出
$(PATH_CGI)/%: .%
@cp -f $< $@
@md5sum $@
clean:
@rm -f $(DEPENDS) $(TARGETS) $(PATH_CGI)/msg*
check:
$(trunk_path)/makeinclude/make_check
# 如果该目录不存在,则创建该目录
$(PATH_CGI):
@mkdir -p $@
#DEPENDS是一系列 .cpp 的头文件依赖关系文件 eg .a.d, .hello.d, .....
#当第一次执行 make的时候 生成。
-include $(DEPENDS)