您的位置:首页 > 编程语言 > C语言/C++

一个自动化 编译当前目录所有cpp为可执行文件的makefie

2010-08-17 13:37 603 查看
# 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 $@.d
# $@.d <=> .a.d
# -MF $@.d 该命令省掉了所有的 a.o : a.cpp ***.h ***.h的编写!
.%: %.cpp
 $(CXX) -o $@ -MF $@.d $(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)

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐