通用protoc Makefile

背景
Makefile 不仅可以用来编译链接gcc程序,还可以根据自己的需要用指定命令处理项目中的文件。
例如protoc,babel(js编译),meta数据的生成等。CMake可以完成这些内容,不过单纯的Makefile也可以适当编写达到比较好的效果。
下面是两个用protoc通过proto文件编译生成pb.cc和pb.h文件的代码。需要在linux下安装protoc。
I.
来自Reference 1,经过裁剪
CXX=g++
ifeq ($(ver),debug)
CXXFLAGS=-std=c++11 -Wall -Wextra -g -O0 -DDEBUG
else
CXXFLAGS=-std=c++11 -Wall #-Wextra
endif
BIN=project

# 除去隐藏目录
ALLDIR=$(shell find . -type d | grep -E '/\.|proto|test' -v)
SRCS=$(foreach DIR,$(ALLDIR), $(wildcard $(DIR)/*.cpp))
OBJS=$(patsubst %.cpp,%.o, $(SRCS))
PROTODIR=$(shell find . -type d | grep -E '/proto$$')
PROTOFILE=$(wildcard $(PROTODIR)/*.proto)
PROTOSRC=$(patsubst %.proto,%.pb.cc,$(PROTOFILE)) #$(patsubst %.proto,%.grpc.pb.cc,$(PROTOFILE))
PROTOHEAD=$(patsubst %.cc,%.h,$(PROTOSRC))
PROTOOBJS=$(patsubst %.cc,%.o, $(PROTOSRC))


ALL: $(PROTOOBJS) $(OBJS)
        # $(CXX) $(CXXFLAGS) -o $(BIN) $^  -pthread -lprotobuf #-lgrpc++

%.o: %cc %.cpp
        $(CXX) $(CXXFLAGS) -o $@ -c $<

$(PROTOSRC): $(PROTOFILE)
        #cd $(PROTODIR);protoc --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` $(notdir $(PROTOFILE))
        cd $(PROTODIR);protoc --cpp_out=. $(notdir $(PROTOFILE))

说明:patsubst是模式替换函数(返回替换后的列表),wildcard是通配符函数(返回列表),$()表达式里如果要嵌套一个其他变量var,也用 "$var "表示就可以了.

make --trace选项可以打印编译过程。编译的过程是依赖如下: make all -> OBJS ->SRC -> PROTOFILE

II.

PROTO_CC :=  protoc
INCLUDE  :=  ../include
PROTO_FLAGS := --cpp_out=$(INCLUDE)

PROTO__SOURCES := $(wildcard *.proto)
obj-y          := $(PROTO__SOURCES:%.proto=$(INCLUDE)/%.pb.cc)
obj-y          += $(PROTO__SOURCES:%.proto=$(INCLUDE)/%.pb.h)

OBJECT      := #unused
##############################
#  change OBJECT to set execute file name
##############################

all : $(obj-y)

.PHONY: all 
$(INCLUDE)/%.pb.cc: %.proto
        $(PROTO_CC) $(PROTO_FLAGS) $^
        @echo 'generate file' $@

clean:
        rm -f $(obj-y)

 更简单的版本如上,只生成对应pb文件,通过INCLUDE制定编译结果的目录。

References

https://yq.aliyun.com/articles/653475

转载于:https://www.cnblogs.com/wangzming/p/11494520.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值