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

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.cpp
g++ -std=c++0x -O2 -g -fPIC -c -o util/mysql_obj.o util/mysql_obj.cpp
g++ -std=c++0x -O2 -g -fPIC -c -o util/redis_obj.o util/redis_obj.cpp

现在变成了:

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

这样就好看多了。

安静模式的核心代码是:

# 安静模式的核心代码
ifeq ("$(origin V)", "command line")
   BUILD_VERBOSE = $(V)
endif
ifndef BUILD_VERBOSE
   BUILD_VERBOSE = 0
endif

ifeq ($(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 := ar

LIBRARY := libdbpool.a
SHARED := libdbpool.so

INCLUDE := -I/usr/local/include
# -lgtest 一定要放在 -lpthread 前面
LIBS := -L/usr/local/lib -L/usr/lib64/mysql -lgtest -lpthread -lmysqlclient -lhiredis

CFLAGS := 
CPPFLAGS := -std=c++0x -O2 -g -fPIC
SHARED_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)
endif
ifndef BUILD_VERBOSE
   BUILD_VERBOSE = 0
endif

ifeq ($(BUILD_VERBOSE),0)
    QUIET_CC        = @echo ' ' CC $@;
    QUIET_CXX       = @echo ' ' CXX $@;
endif

all: $(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:clean

clean:
    -rm -f ./util/*.o ./gtest/*.o $(LIBRARY) $(SHARED) $(TARGETS)
    @echo "--------------------------make clean-----------------------"

版权声明:本文为博主原创文章,未经博主允许不得转载。

你可能感兴趣的:(数据库,数据库连接池,编译,makefile)