数据库连接池DBPool分析(五):Makefile

来源:互联网 发布:个性签名 知乎 编辑:程序博客网 时间:2024/06/07 03:40

Makefile的设计思想是编译MysqlObj和RedisObj,并将它们链接成静态库和动态库,供外部调用。这里是供gtest来调用。这里参考了leveldb的Makefile的设计思想。

这里有个需要小心的地方,因为用到了gtest,所以编译的时候需要链接-lgtest,-lgtest必须要放在-lpthread前面,否则编译会错误

安静模式

还有一个Makefile的magic,我把它称为安静模式,这是我公司的同事做的,我把它借鉴过来了,这个安静模式的作用就是让make打印出来的编译信息简化,
比如:

g++ -std=c++0x -O2 -g -fPIC -c -o util/mysql_connection_pool.o util/mysql_connection_pool.cppg++ -std=c++0x -O2 -g -fPIC -c -o util/mysql_obj.o util/mysql_obj.cppg++ -std=c++0x -O2 -g -fPIC -c -o util/redis_obj.o util/redis_obj.cpp

现在变成了:

CXX util/mysql_connection_pool.oCXX util/mysql_obj.oCXX util/redis_obj.o

这样就好看多了。

安静模式的核心代码是:

# 安静模式的核心代码ifeq ("$(origin V)", "command line")   BUILD_VERBOSE = $(V)endififndef BUILD_VERBOSE   BUILD_VERBOSE = 0endififeq ($(BUILD_VERBOSE),0)    QUIET_CC        = @echo '   ' CC $@;    QUIET_CXX       = @echo '   ' CXX $@;endif

然后在需要使用$(CXX)的地方用$(QUIET_CXX)$(CXX)替代。


# # Use 'make V=1' to see the full commands#使用安静模式可以不看gcc,g++的参数CC := gcc CXX := g++AR := arLIBRARY := libdbpool.aSHARED := libdbpool.soINCLUDE := -I/usr/local/include# -lgtest 一定要放在 -lpthread 前面LIBS := -L/usr/local/lib -L/usr/lib64/mysql -lgtest -lpthread -lmysqlclient -lhiredisCFLAGS := CPPFLAGS := -std=c++0x -O2 -g -fPICSHARED_LDFLAGS := -shared -fPIC -Wl,-soname,${SHARED}LIBCFILES := $(wildcard ./util/*.c)LIBCPPFILES := $(wildcard ./util/*.cc ./util/*.cpp)LIBOBJECTS := $(addsuffix .o, $(basename $(LIBCFILES)) $(basename $(LIBCPPFILES)))CFILES := $(wildcard ./gtest/*.c)CPPFILES := $(wildcard ./gtest/*.cc ./gtest/*.cpp)OBJECTS := $(addsuffix .o, $(basename $(CFILES)) $(basename $(CPPFILES)))TARGETS := $(basename $(OBJECTS))# 安静模式的核心代码ifeq ("$(origin V)", "command line")   BUILD_VERBOSE = $(V)endififndef BUILD_VERBOSE   BUILD_VERBOSE = 0endififeq ($(BUILD_VERBOSE),0)    QUIET_CC        = @echo '   ' CC $@;    QUIET_CXX       = @echo '   ' CXX $@;endifall: $(LIBRARY) $(SHARED)     @echo "--------------------------make successful-----------------------"check: all $(TARGETS)$(LIBRARY): $(LIBOBJECTS)    -rm -rf $@    $(AR) crv $@ $(LIBOBJECTS)$(SHARED):    $(QUIET_CXX)$(CXX) $(SHARED_LDFLAGS) -o $@ $(LIBOBJECTS) $(LIBS)$(TARGETS): $(OBJECTS)    $(QUIET_CXX)$(CXX) -o $@ $(addsuffix .o, $@) $(LIBS) -L. -ldbpool#下面的Makefile其实只是为了使用安静模式而已,如果将下面的代码去掉的话也能编译成功,因为默认的make规则将被执行./util/%.o:./util/%.c    $(QUIET_CC)$(CC) $(CFLAGS) -c -o $@ $<./util/%.o:./util/%.cc    $(QUIET_CXX)$(CXX) $(CPPFLAGS) -c -o $@ $<./util/%.o:./util/%.cpp     $(QUIET_CXX)$(CXX) $(CPPFLAGS) -c -o $@ $<./gtest/%.o:./gtest/%.c    $(QUIET_CC)$(CC) $(CFLAGS) -c -o $@ $<./gtest/%.o:./gtest/%.cc    $(QUIET_CXX)$(CXX) $(CPPFLAGS) -c -o $@ $<./gtest/%.o:./gtest/%.cpp     $(QUIET_CXX)$(CXX) $(CPPFLAGS) -c -o $@ $<.PHONY:cleanclean:    -rm -f ./util/*.o ./gtest/*.o $(LIBRARY) $(SHARED) $(TARGETS)    @echo "--------------------------make clean-----------------------"
0 0
原创粉丝点击