opensns 中的Makefile

腾讯在做社区开放平台,在网站上提供了SDK下载,我下载了C++版,然后看了下起C++的Makefile,分析了下,感觉还是不错的一个Makefile,于是做了下笔记。

在cpp目录下有四个目录和一个Makefile,其中example目录还有一个额外的Makefile,src中是封装的CPengyou类。

example
include
lib
src

Makefile

下面是主目录下的Makefile

代码
######################################################################
#
OpenAPI C++ edtion Makefile #
#
#####################################################################
CC := g++
######################################################################
#
配置目录 #
#
#####################################################################
ROOT_DIR := $(shell pwd)
SRC_DIR :
= $(ROOT_DIR)/src
LIB_DIR :
= $(ROOT_DIR)/lib
INC_DIR :
= $(ROOT_DIR)/include $(ROOT_DIR)/include/json
LIBTOOL :
= libtool

SRC_FILES :
= $(wildcard $(SRC_DIR)/*.cpp)
OBJ_FILES :
= $(SRC_FILES:.cpp=.o)
LD_LIBS :
= curl jsoncpp rt

######################################################################
#
配置生成的lib文件名称 #
#
#####################################################################
LIB_NAME := openapi
LIB_SUFFIX :
= .a
LIB_TARGET :
= lib$(LIB_NAME)$(LIB_SUFFIX)

######################################################################
#
配置编译选项 #
#
#####################################################################

###每次调用时都会执行,无视内置规则
.PHONY: all clean example
###addprefix --make内置函数,添加前缀
LDFLAGS := -L$(LIB_DIR) $(addprefix -l,$(LD_LIBS))
CFLAGS :
= -O2 -Werror -DCURL_STATICLIB -I$(SRC_DIR) $(addprefix -I,$(INC_DIR))
##是否需要调试
ifeq ($(DEBUG),yes)
CFLAGS
+= -ggdb2 -D__DEBUG
endif

all:
$(LIB_TARGET) example;
######################################################################
#
生成动态链接库 #
#
#####################################################################
$(LIB_TARGET): $(OBJ_FILES)
$(AR) -rc $@ $(OBJ_FILES)
$(CC) -shared -fpic -o $(LIB_TARGET:.a=.so) $(OBJ_FILES) $(LDFLAGS)
@echo *********Build $@ $(LIB_TARGET:.a=.so) Successful*********
@echo
###进入测试目录,依赖于库的生成,最后编译
example: $(LIB_TARGET)
@cd example && make UST=yes ##传递了一个参数,生成静态参数
@echo ***************Build $@ Successful************
###自依赖
%.o: %.cpp
$(CC) $(CFLAGS) -c $< -o $@

clean:
@echo clean...
@rm -rf $(LIB_TARGET) $(LIB_TARGET:.a=.so) $(OBJ_FILES) $(LIB_TARGET:.a=.bin)
@cd example && make clean

Makefile中用到的知识都比较常规。

用到了wildcard——通配符匹配

在example的目录下Makefile

代码
###扩展通配符
SRC := $(wildcard *.cpp)

.PHONY: all clean

CFLAGS :
= -I../src

ifeq (
$(UST),yes)
LDFLAGS :
= -L.. -static -lopenapi -L../lib -static -lcurl -static -ljsoncpp -lrt
else
LDFLAGS :
= -L.. -lopenapi
endif
###替换通配符
all: $(patsubst %.cpp,%,$(SRC));

%:%.cpp
g
++ $(CFLAGS) -o $@ $^ $(LDFLAGS)

clean:
@rm -f $(patsubst %.cpp,%,$(SRC))

在这个Makefile新认识了一个函数patsubst,这个函数是替换通配符的。

本人刚刚学习Makefile,深知阅读理解优秀的Makefile的重要性。希望慢慢提高。

原文地址:https://www.cnblogs.com/westfly/p/1905259.html