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-----------------------"